kubernetes中提的StatefulSet(1.5版本之前称为Petset)方便了有状态集群服务在上的部署和管理。...zookeeper中StatefulSet(Petset)资源和headless服务的创建 StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计...(即没有Cluster IP的Service)来实现 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依序进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是...由于本文使用的kubernetes为1.4.6版本,所以示例中采用的名称仍然为Petset。.../zkCli.sh [zk: localhost:2181(CONNECTED) 0] ls / [zookeeper] kafka中StatefulSet(Petset)资源和headless服务的创建
Statefulset简介 k8s权威指南这样介绍的 “在Kubernetes系统中,Pod的管理对象RC、Deployment、DaemonSet和Job都面向无状态的服务。...(1)每个节点都有固定的身份ID,通过这个ID,集群中的成员可以相互发现并通信。 (2)集群的规模是比较固定的,集群规模不能随意变动。...另外,为了能够在其他节点上恢复某个失败的节点,这种集群中的Pod需要挂接某种共享存储,为了解决这个问题,Kubernetes从1.4版本开始引入了PetSet这个新的资源对象,并且在1.5版本时更名为StatefulSet...StatefulSet本质上是Deployment的一种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod...在Deployment中,与之对应的服务是service,而在StatefulSet中与之对应的headless service,headless service,即无头服务,与service的区别就是它没有
(消费方不使用静态的IP,而是通过DNS域名去找到某台特定机器) StatefulSet本质上是Deployment的一种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的...Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod名字称为网络标识(hostname),还必须要用到共享存储。 ...除了依照社区民意改了名字之外,这一 API 对象并没有太大变化,kubernetes集群部署 Pod 增加了每索引最多一个”的语义,有了顺序部署、顺序终结、唯一网络名称以及持久稳定的存储。...headless service,即无头服务,与service的区别就是它没有Cluster IP,解析它的名称时将返回该Headless Service对应的全部Pod的Endpoint列表。...的名字叫kafka,那么第一个起来的Pet叫kafka-0,第二个叫kafk-1,依次类推,基于Headless Service(即没有Cluster IP的Service)来实现。
(2)Kubernetes Controller Manager(Kube-controller-manager):K8s中所有资源对象的自动化控制中心,资源对象的大总管。...假设StatefulSet的名称为kafka,那么第1个Pod 叫kafka-0,第2个叫kafka-1,以此类推。...${handless service name} 比如一个3节点的Kafka的StatefulSet集群对应的Headless Service的名 称为kafka,StatefulSet的名称为kafka...,则StatefulSet里的3个Pod的DNS 名称分别为kafka-0.kafka、kafka-1.kafka、kafka-3.kafka。...则是任意定义的附加信息,以便于外部工具进行查找,K8s会通过此方式标记资源对象的一些特殊信息。
Kubernetes Service这个对象,并由Kubernetes管理和分配P地址 Cluster IP无法被ping,他没有一个“实体网络对象”来响应....”的IP地址,因为它没有一个实体网络对象,所以无法响应ping命令。...5、总结各方式利弊 hostPort和hostNetwork直接使用节点网络,部署时节点需固定,访问ip也固定(也可以用host),端口为正常端口 nodeport方式部署时不要求固定节点,可通过集群内任一...比如StatefulSet的名字叫kafka,那么第一个起来的Pet叫kafka-0,第二个叫kafk-1,依次类推,基于Headless Service(即没有Cluster IP的Service)来实现...首先kafka和zookeeper都需要存储盘来保存有状态信息,其次kafka和zookeeper每一个实例都需要有对应的实例Id(Kafka需要broker.id,zookeeper需要my.id)来作为集群内部每个成员的标识
前言 本次的目的是通过使用k8s搭建一个三节点的kafka集群,因为kafka集群需要用到存储,所以我们需要准备三个持久卷(Persistent Volume) 简称就是PV。...创建zk-pv 首先通过nfs创建三个共享目录 mkdir -p /data/share/pv/{kafka01,kafka02,kafka03} 分别对应三节点zk集群中的三个pod的持久化目录,创建好目录之后编写...persistentVolumeReclaimPolicy: Recycle --- 使用如下命令创建kafka-pk kubectl create -f kafka-pv.yaml 出现如下提示就代表创建成功...image-20200726131248218 创建Kafka集群 我们选择使用statefulset去部署kafka集群的三节点,并且使用刚刚创建的pv作为存储设备。...kind: StatefulSet metadata: name: kafka namespace: tools spec: serviceName: kafka-hs replicas
如 StatefulSet 的名字是kafka, 第一个pod叫kafka-0, 依次类推 StatefulSet 控制的Pod副本的启停顺序是受控的,操作第n个Pod时, 前n-1个Pod已经运行且准备好的状态...StatefulSet 里的Pod采用稳定的持久化存储卷,通过PV/PVC来实现, 删除Pod时默认不会删除与StatefulSet相关的存储卷。....kafka、kafka-2.kafka 这些DNS名称可以直接在集群的配置文件中固定下来。...名字由开发者自己定义,部署也不需要改,所以完全可以固定在配置中。 最早使用环境变量(env),在每个Pod的容器在启动时,自动注入。但是不够直观。...地址池) 无法被Ping, 没有一个"实体网络对象"来响应 只能结合Service Port 组成一个具体的通信端口,单独的Cluster IP 不具备TCP/IP通信的基础,并且他们属于集群内部封闭空间
因此,在K8S集群里面部署类似kafka、zookeeper这种有状态的服务,不能使用Deployment,必须使用StatefulSet来部署,有状态简单来说就是需要持久化数据,比如日志、数据库数据、...Service(即没有Cluster IP的Service)来实现 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的...Service 用于创建PersistentVolumes的volumeClaimTemplates 定义具体应用的StatefulSet StatefulSet中每个Pod的DNS格式为: statefulSetName...中; 当我们通过对":端口"请求建立连接,kafka服务器会通过 zookeeper 中注册的监听器,找到定义的公网监听器(默认监听器是PLAINTEXT、也可以自定义),然后通过listeners...如果在别的非kafka实例pod内容使用下面地址就没有这个告警了! 因为K8S规定:在Pod内容不可使用Pod自己的service地址往自己连接!
“声明式 API”的核心原理就是当用户向 Kubernetes 提交了一个 API 对象的描述之后,Kubernetes 会负责为你保证整个集群里各项资源的状态,都与你的 API 对象描述的需求相一致。...Kubernetes 通过启动一种叫做“控制器模式”的无限循环,WATCH 这些 API 对象的变化,不断检查,然后调谐,最后确保整个集群的状态与这个 API 对象的描述一致。...Operator 是同样的道理,以我们的 Redis Operator 为例,为了实现 Operator,我们首先需要将自定义对象的说明注册到 Kubernetes 中,这个对象的说明就叫 CustomResourceDefinition...集群可在第二个集群中镜像Kafka集群 Kafka Exporter提取其他Kafka指标数据以进行监控 Kafka Bridge向Kafka集群发出基于HTTP的请求 Kafka的组件架构比较复杂,...只需要启用此功能即可使用: features: - AutoScaling=true TiDB实现了一个TidbClusterAutoScaler CR 对象用于控制TiDB集群中自动缩放的行为。
如果你在 Kubernetes 集群中运行你的微服务,那么在 Kubernetes 中运行 Kafka 集群也是很有意义的,这样可以利用其内置的弹性和高可用特性,我们可以使用内置的 Kubernetes...下面我们将来介绍下如何在 Kubernetes 上构建分布式的 Kafka 集群,这里我们将使用 Helm Chart 和 StatefulSet 来进行部署,当然如果想要动态生成持久化数据卷,还需要提前配置一个...StorageClass 资源,比如基于 Ceph RBD 的,如果你集群中没有配置动态卷,则需要提前创建3个未绑定的 PV 用于数据持久化。...然后查看下对应的 Service 对象: > kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP...比如需要注意 zk 集群我们并没有做持久化,如果是生产环境一定记得做下数据持久化,在 values.yaml 文件中根据需求进行定制即可,当然对于生产环境还是推荐使用 Operator 来搭建 Kafka
定义Stateful的对象中有一个serviceName字段来告诉Stateful控制器使用具体的service来解析它所管理的Pod的IP地址。 ...Pod的名称由StatfulSet对象的名称+Pod创建时所在的索引组成 StatefulSet使用这个DNS记录解析规则来维持Pod的拓扑状态。 ...尽管web-0.nginx这条DNS记录本身不会变但它解析到的Pod的IP地址并不是固定的。...在StatefulSet对象中除了定义PodTemplate还会定义一个volumeClaimTemplates凡是被这个StatefulSet管理的Pod都会声明一个对应的PVC,这个PVC的定义就来自于...Kubernetes为它查找名叫www-web-0的PVC时,就会直接找到旧Pod遗留下来的同名的 PVC进而找到跟这个PVC绑定在一起的PV.这样新的Pod就可以挂载到旧Pod对应的那个Volume并且获取到保存在
什么是StatefulSet 和Deployment一样StatefulSet也是一种可以帮助你部署和扩展Kubernetes Pod的控制器,使用Deployment时多数时候你不会在意Pod的调度方式...但当你需要关心Pod的部署顺序、对应的持久化存储或者要求Pod拥有固定的网络标识(即使重启或者重新调度后也不会变)时,StatefulSet控制器会帮助你,完成调度目标。...每个由StatefulSet创建出来的Pod都拥有一个序号(从0开始)和一个固定的网络标识。你还可以在YAML定义中添加VolumeClaimTemplate来声明Pod存储使用的PVC。...HeadlessService 在文章学练结合,快速掌握Kubernetes Service 写过 Service是在逻辑抽象层上定义了一组Pod,为他们提供一个统一的固定IP和访问这组Pod的负载均衡策略...所以,在这个新的web-0被创建出来之后,Kubernetes会为它查找绑定名叫www-web-0的PVC。由于PVC的生命周期是独立于使用它的Pod的,这样新Pod就接管了以前旧Pod留下的数据。
selector: app: kafka 在上述配置中,我们使用了Kubernetes Service资源的端口定义,指定Kafka服务的端口号为9092,这是Kafka集群默认使用的端口...Kubernetes会将所有传入的数据流量路由到Kafka服务的Pod上。 步骤2:创建Kafka集群 接下来,我们需要使用Kubernetes的Deployment资源来定义Kafka集群。...我们定义了一个使用Zookeeper官方Docker镜像的Zookeeper容器,并将其部署到Kubernetes中。...步骤4:创建Zookeeper集群 接下来,我们需要创建一个Zookeeper集群来支持Kafka集群。我们可以使用Kubernetes的StatefulSet资源来定义Zookeeper集群。...--broker-list kafka:9092 --topic test" 在上述命令中,我们使用Kafka的官方Docker镜像"wurstmeister/kafka"启动了一个Kafka生产者容器
数据持久化 Volume kubernetes中的volume提供了在容器中挂载外部存储的能力 pod需要设置卷来源(spec.volume)和挂载点(spec.containers.volumeMounts...:数据库主从,消息中间件kafka集群,redis集群等 稳定的网络ID 说起StatefulSet稳定的网络标识符,不得不从Headless说起了 标准Service: apiVersion: v1...并不是固定的。...这就意味着,对于“有状态应用”实例的访问,你必须使用 DNS 记录或者 hostname 的方式,而绝不应该直接访问这些 Pod 的 IP 地址。...每个PVC绑定对应的 PV,从而保证每一个 Pod 都拥有一个独立的 Volume。 在这种情况下,删除Pods或StatefulSet时,它所对应的PVC和PV不会被删除。
在这个过程中遇到很多问题和难点,本文会向大家介绍上云过程中总结的经验和教训。...由于网络环境的限制,一个机房没有办法只搭建一个 Kuberntes 集群,需要支持一个应用跨多 Kubernetes 集群部署,负载服务要支持跨多个 Kubernetes 集群的应用负载。...Pod 配置有状态 存储组件有个明显的特性就是配置文件中会有一个唯一标识,比如 Zookeeper 的 myid , Kafka 的 broker id。...如果组件本身的配置文件格式比较固定,会做成模板化,将特定的配置项抽出来提供给组件研发配置,通过环境变量的方式注入到容器中。...对 Kubernetes 集群的操作会分解成多个 Task,Task 之间有依赖关系,组装成 Job 发送给 Kafka,云舱 Scheduler 进行消费和处理。
Kubernetes Service配置 在Kubernetes中,每个Kafka Broker节点可以作为一个Pod运行,而Service则负责定义这些Pod的访问方式。...除了绑定地址之外,还可以配置该监听地址的认证协议,也就是使用该地址连接Broker时需要指定使用何种协议方式进行连接。...在需要代理才能连接kafka broker时,在这种场景时,需要将advertised.listeners设置为代理的地址。...但是在集群外部时,kafka客户端进行连接,它是需要有能力访问kafka的每一个broker节点的,所以需要在advertised.listeners中配置公网IP,并存储在zookeeper中,这样kafka...假设机器没有外网网卡(即上服务器是没有eth1网卡的),外网通信地址基于转发或映射出来的IP,那么,我们的Kafka配置就应该改成这样配置。
要想保持Pod IP不变,我们可以借助稳定的Pod hostname定制IPAM获取固定的Pod IP。...借助StatefulSet的稳定的唯一的网络标识特性,我们能比较轻松的实现Pod的固定IP需求,然后如果使用Deployment,那么将会复杂的多,你需要考虑滚动更新的过程中的参数控制(maxSurge...因此,我想再加一个StatefulSet的使用场景: 实现固定的Pod IP方案, 可以优先考虑基于StatefulSet; 最佳实践 StatefulSet对应Pod的存储最好通过StorageClass...为了数据安全,当删除StatefulSet中Pods或者对StatefulSet进行缩容时,Kubernetes并不会自动删除StatefulSet对应的PV,而且这些PV默认也不能被其他PVC Bound...如果你使用Kubernetes 1.5+的版本,当Node Condition是NetworkUnavailable时,node controller不会强制从apiserver中删除这个Node上的这些
常见的四层负载均衡策略是根据连接来源 IP 进行一致性 Hash,在节点数不变的情况下这样能保证每次都 Hash 到同一个 Broker 中,甚至在节点数稍微改变时也能大概率找到之前连接的节点。...之前我们也使用过来源 IP Hash 的策略,主要有两个缺点: 分布不够均匀,部分来源 IP 是大型局域网 NAT 出口,上面的连接数多,导致 Broker 上连接数不均衡 不能准确标识客户端,当移动客户端掉线切换网络就可能无法连接回刚才的...Hash 就拿到了固定的 Broker。...同时因为发布订阅基于 Kafka,可以保证在处理大规模数据时的消息可靠性。 订阅 当长连接 Broker 从 Kafka Topic 中消费出消息后会查找本地的订阅关系,然后将消息分发到客户端会话。...当客户端订阅一个 Topic 时我们就将客户端的会话对象放入以 Topic 为 Key 的订阅 Map 中,当反查消息的订阅关系时直接用 Topic 从 Map 上取值就行。
其中 Kafka 和 Redis 都是业界广泛使用的基础组件,它们在知乎都已平台化和容器化 (详见:《Redis at Zhihu》、《知乎基于 Kubernetes 的 Kafka 平台的设计和实现》...常见的四层负载均衡策略是根据连接来源 IP 进行一致性 Hash,在节点数不变的情况下这样能保证每次都 Hash 到同一个 Broker 中,甚至在节点数稍微改变时也能大概率找到之前连接的节点。...之前我们也使用过来源 IP Hash 的策略,主要有两个缺点: 1)分布不够均匀,部分来源 IP 是大型局域网 NAT 出口,上面的连接数多,导致 Broker 上连接数不均衡; 2)不能准确标识客户端...Hash 就拿到了固定的 Broker。...5.4 订阅 当长连接 Broker 从 Kafka Topic 中消费出消息后会查找本地的订阅关系,然后将消息分发到客户端会话。 我们最开始直接使用 HashMap 存储客户端的订阅关系。
通过这种方式,可以使用CBS盘来存储服务实例的状态信息。 Headless服务支持通过服务的域名解析得到服务所有实例的IP,如果服务实例数为1,则可以得到服务对应实例的IP。...这样在zookeeper和kafka服务创建时,将每一个服务实例拆分成一个独立的服务。这样每个服务实例可以单独设置环境变量,配置zookeeper和kafka服务实例需要的实例Id。...其中kafka程序的日志数据量较少,使用一个30G左右的小容量CBS盘。...注意:由于在kafka的镜像中,会对KAFKA*这样的环境变量进行解析,为了避免错误的解析,所有特意将服务名称设置成ckafka。...KAFKA_BROKER_ID=1 KAFKA_ADVERTISED_HOST_NAME=ckafka1 其中KAFKA_BROKER_ID和KAFKA_ADVERTISED_HOST_NAME根据服务实例的不同
领取专属 10元无门槛券
手把手带您无忧上云