基于K8S部署ZooKeeper准备知识(StatefulSet)

news/2024/6/3 18:46:56 标签: kubernetes, java-zookeeper, zookeeper, 分布式, 容器

使用k8s部署zk时,会部署一个headless service.科普一下headless service:

Headless Service(无头服务)是 Kubernetes 中的一种服务类型,它与普通的 ClusterIP 服务有所不同。普通的 ClusterIP 服务会为每个服务分配一个虚拟 IP 地址,并通过负载均衡将流量转发到后端 Pod。而 Headless Service 不分配虚拟 IP,而是直接暴露 Pod 的 IP 地址,允许直接访问后端 Pod。

Headless Service 的主要特点是它不提供负载均衡和代理功能。当你使用 Headless Service 发送请求时,Kubernetes 不会进行负载均衡和流量转发,而是直接返回与服务关联的所有后端 Pod 的 IP 地址。这样,你可以在应用中直接使用这些 IP 地址进行自定义的负载均衡或直接访问特定的 Pod。

Headless Service 在以下场景中特别有用:

  1. 需要对每个后端 Pod 进行直接访问,例如数据库或分布式存储系统。

  2. 需要自定义负载均衡逻辑,而不是依赖 Kubernetes 提供的默认负载均衡功能。

  3. 需要通过 DNS 查找所有后端 Pod 的 IP 地址。

通过定义一个 ClusterIP 为 "None" 的 Service 类型,可以创建 Headless Service。在 Service 的配置中,将 spec.clusterIP 设置为 "None" 即可。

总结:Headless Service 是 Kubernetes 中的一种服务类型,它不分配虚拟 IP,而是直接暴露后端 Pod 的 IP 地址,允许直接访问后端 Pod。它适用于需要直接访问后端 Pod、自定义负载均衡逻辑或通过 DNS 查找所有后端 Pod IP 地址的场景。

划重点:通过定义一个 ClusterIP 为 "None" 的 Service 类型,可以创建 Headless Service。在 Service 的配置中,将 spec.clusterIP 设置为 "None" 即可。

还会部署一个Cluster Service,理解了Headless Service以后,这个就容易理解了,Cluster Service跟Headless Service恰好相反,Cluster Service是可以通过虚拟IP地址经过负载均衡来访问服务对应的POD提供的服务的。

然后还会部署一个PodDisruptionBudget,科普如下:

PodDisruptionBudget(Pod 破坏预算)是 Kubernetes 中的一种资源对象,用于控制在节点维护、故障恢复或其他情况下可以同时终止的 Pod 的数量。它提供了一种机制,确保在进行节点维护或删除节点时,系统仍然具备足够的可用性和容错能力。

PodDisruptionBudget 通过定义最小可用 Pod 数量来限制 Pod 的终止数量。它指定了一个最小可用副本数,系统会确保在终止 Pod 时,剩余的可用副本数不会低于这个指定的最小值。如果终止操作会导致可用副本数低于最小可用副本数,Kubernetes 将拒绝终止 Pod,并且不会执行维护操作或节点删除。

PodDisruptionBudget 的主要特点如下:

  1. 定义最小可用 Pod 数量:通过指定一个最小可用副本数,确保在终止 Pod 时系统仍然保持足够的可用性。

  2. 控制 Pod 终止数量:在节点维护或其他情况下,控制可以同时终止的 Pod 的数量,避免系统过度受影响。

  3. 与 Deployment、StatefulSet 等资源对象结合使用:PodDisruptionBudget 可以与其他控制 Pod 创建和调度的资源对象进行关联,以提供更精确的控制和保护。

通过定义 PodDisruptionBudget,可以为关键的应用程序或服务设置保护机制,确保在节点维护或故障恢复期间,系统仍然能够保持足够的可用性和容错能力。

总结:PodDisruptionBudget 是 Kubernetes 中的一种资源对象,用于控制在节点维护、故障恢复或其他情况下可以同时终止的 Pod 的数量。它通过定义最小可用 Pod 数量来限制 Pod 终止数量,确保系统仍然具备足够的可用性和容错能力。

最后还要部署一个StatefulSet,同样科普一下:

StatefulSet(有状态副本集)是 Kubernetes 中的一种控制器(Controller),用于管理有状态应用的部署和运行。与 Deployment 控制器相比,StatefulSet 提供了一些额外的功能和保证,以支持有状态应用的需求。

StatefulSet 的主要特点如下:

  1. 稳定的唯一标识:每个 StatefulSet 中的 Pod 都有一个稳定的唯一标识符,即 Pod 名称。这使得 Pod 在重新启动、缩放或迁移时能够保持一致的标识,方便与其他系统进行交互或保持持久化存储的连接。

  2. 有序部署和伸缩:StatefulSet 可以按顺序逐个部署和伸缩 Pod。每个 Pod 都有一个固定的索引,确保 Pod 在创建、删除和更新时的有序性。

  3. 网络标识和稳定的网络域名:每个 Pod 都有一个稳定的网络标识,可以使用 Pod 名称直接访问。此外,每个 Pod 还会分配一个稳定的网络域名,以便其他应用程序可以直接通过域名进行访问。

  4. 持久化存储卷:StatefulSet 支持与持久化存储卷(Persistent Volume)的集成,确保 Pod 在重启、迁移或缩放时可以保持其持久化数据。

  5. 有序的删除:当删除 StatefulSet 时,它会按照逆序删除其中的 Pod,确保在删除过程中不会中断应用的可用性。

StatefulSet 适用于有状态应用程序,如数据库、消息队列、缓存等,这些应用程序通常需要固定的标识和稳定的网络连接,以及持久化的存储。

总结:StatefulSet 是 Kubernetes 中的一种控制器,用于管理有状态应用的部署和运行。它提供了稳定的唯一标识、有序部署和伸缩、网络标识和稳定的网络域名、持久化存储卷以及有序的删除等功能,以满足有状态应用的需求。

再细看一下StatefulSet的定义清单,同样会看一些不熟悉的名词。

affinity:

Affinity(亲和性)是 Kubernetes 中的一个概念,用于指定 Pod 与其他资源(节点、Pod)之间的关联性和互动规则。通过使用亲和性,可以对 Pod 的调度和部署进行更精确的控制,以满足特定的需求和策略。

在 Kubernetes 中,有两种类型的亲和性可供使用:

  1. Node Affinity(节点亲和性):通过指定条件和规则,将 Pod 调度到特定的节点。可以基于节点的标签(labels)或其他属性来定义亲和性规则,以确保 Pod 被调度到符合条件的节点上。

  2. Pod Affinity/Pod Anti-Affinity(Pod 亲和性/反亲和性):通过指定条件和规则,将 Pod 调度到与其他 Pod 相关的节点上或避免与其他 Pod 调度在同一节点上。可以根据其他 Pod 的标签、Pod 的命名空间(namespace)或其他属性来定义亲和性规则。

通过使用亲和性规则,可以实现一些常见的场景和策略,例如:

  • 将相关的服务 Pod 调度到同一节点上,以提高网络延迟和性能。

  • 将相互依赖的应用程序 Pod 调度到同一节点上,以减少跨节点通信的开销。

  • 将敏感数据处理的 Pod 与其他非敏感数据处理的 Pod 隔离在不同的节点上。

亲和性规则通过使用标签选择器(label selectors)和拓扑约束(topology constraints)来定义,以满足特定的条件和策略。亲和性可以在 Pod 的配置文件中通过 affinity 字段进行定义。

总结:亲和性是 Kubernetes 中用于指定 Pod 与其他资源之间关联性和互动规则的概念。通过使用节点亲和性和 Pod 亲和性/反亲和性,可以对 Pod 的调度和部署进行更精确的控制,以满足特定的需求和策略。

topologyKey:

在 Kubernetes 中,topologyKey 是用于定义亲和性规则的一个关键字段。它用于指定 Pod 亲和性或反亲和性的拓扑约束条件。

topologyKey 的作用是与节点的拓扑信息相关联,以决定 Pod 应该被调度到哪个节点。它可以是节点的标签(label)或节点的拓扑域(例如:kubernetes.io/hostnamefailure-domain.beta.kubernetes.io/zone 等)。

通过设置 topologyKey,可以根据节点的拓扑信息来约束 Pod 的调度,从而实现一些特定的策略和需求,例如:

  • 将 Pod 调度到具有特定标签的节点上,以满足特定的硬件或软件要求。

  • 将 Pod 调度到特定的区域(zone)或机架(rack)上,以提高容灾性和可用性。

topologyKey 可以在 Pod 的亲和性规则或反亲和性规则中进行设置。通过结合标签选择器和拓扑约束,可以更精确地定义 Pod 的调度策略。

总结:topologyKey 是用于定义亲和性规则中的一个关键字段,在 Kubernetes 中与节点的拓扑信息相关联。通过设置 topologyKey,可以根据节点的标签或拓扑域来约束 Pod 的调度,以满足特定的策略和需求。

kubernetes.io/hostname 这个topologyKey怎么理解 ?

这个topologyKey理解起来有点困难,单独列一篇出来,讲得详细一点,参考这篇《Kubernetes之Pod亲和性与反亲和性的TopologyKey》。

image: "k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10" 这个镜像与官方的zk有区别吗

k8s.gcr.io这个容器镜像仓库下载会超时,去dockerhub(https://hub.docker.com/)上搜索kubernetes-zookeeper,能找到很多,选择“docker pull tonybian/kubernetes-zookeeper”这个下载。tag成私服的镜像,并上传私服harbor,然后删除原镜像:

docker tag tonybian/kubernetes-zookeeper ${HARBOR_DOMAIN}/google_containers/kubernetes-zookeeper:1.0-3.4.10
​
docker rmi tonybian/kubernetes-zookeeper:latest
​
docker push ${HARBOR_DOMAIN}/google_containers/kubernetes-zookeeper:1.0-3.4.10

可以使用这个启动:sh -c start-zookeeper servers=3 ?这是什么命令?

sh -c zookeeper-ready

zk持久化数据使用了StatefulSet的持久化卷声明模板(volumnClaimTemplate)属性

介绍篇幅较长,单独起一篇说明,跳转《StatefulSet的volumeClaimTemplates》查看


http://www.niftyadmin.cn/n/416330.html

相关文章

工厂模式:简化对象创建,提升代码灵活性的设计模式入门指南

目录 导言:工厂模式的概念工厂模式的优势2.1. 封装对象的创建逻辑:2.3. 实现松耦合: 简单工厂模式示例工厂方法模式示例抽象工厂模式示例结论: 导言: 在软件开发中,对象的创建和初始化是一个常见的任务。为…

Flask学习-环境配置

目录 一.环境部署 二.Flask基本结构 三.完整代码 四.运行效果 一.环境部署 在安装好python,pip环境的基础上在命令行输入如下指令: pip install flask flask框架即安装完毕。 二.Flask基本结构 flask的使用通过创建实例实现。创建方法如下&…

ROS学习——通信机制(话题通信①—发布方实现)

2.1 话题通信 Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 040话题通信(C)1_发布方框架_Chapter2-ROS通信机制_哔哩哔哩_bilibili 一、ROS 中的基本通信机制主要有如下三种实现策略 话题通信(发布订阅模式服务通信(请求响应模式)参数服务器(参数共享模式) 二、…

数据传输中的数据转换与处理的常用方法-物联网开发-单片机通信

目录 一、前言 二、实践与代码 1.Unsigned Char 2.memset 3.sprintf 4.atoi 5.atof 6.strcmp 7.strtok 8.strlen 9.strcpy 10.strcat 三、总结 一、前言 本文将以STM32单片机为基础,使用Keil5环境展示以下方法。 在单片机通信、载波通信中,常常涉及数…

Go单元测试及框架使用

Go自带测试框架 单元测试 建议Go 语言推荐测试文件和源代码文件放在一块,测试文件以 _test.go 结尾。函数名必须以 Test 开头,后面一般跟待测试的函数名参数为 t *testing.T 简单测试用例定义如下: func TestXXXX(t *testing.T) {// ...}…

Golang 基础案例集合:中文拼音转换、解析二维码、压缩 zip、执行定时任务

前言 曾经,因为不够注重基础吃了好多亏。总是很喜欢去看那些高大上的东西,却忽略了最基本的东西。然后会错误的以为自己懂的很多,但是其实是沙堆中筑高台,知道很多高大上的架构,但是基础的东西却不太了解。我觉得&…

java变量

基本数据类型介绍 基本的数据类型: 整数类型:byte、short、int、long 定义long类型的变量,赋值时需要以"l"或"L"作为后缀。 Java程序中变量通常声明为int型,除非不足以表示较大的数,才使用long。 Java的整…

机器学习实战六步法之数据收集方法(四)

要落地一个机器学习的项目,是有章可循的,通过这六个步骤,小白也能搞定机器学习。 看我闪电六连鞭!🤣 数据收集 数据是机器学习的基础,没有数据一切都是空谈!数据集的数据量和数据的质量往往决…