在k8s上搭建kfk-zk集群(1)

2023-11-05 00:38
文章标签 云原生 集群 搭建 k8s zk kfk

本文主要是介绍在k8s上搭建kfk-zk集群(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在k8s上搭建kfk-zk集群(1)

kfk/zk属于有状态的应用,所以应当用StatefulSet来部署应用,但StatefulSet要比无状态的Deployment要复杂,主要表现在增加了:

  1. stable stroage,并且需要用StorageClass、PV
  2. 有状态应用的网络问题,需要Headless Service,并且每个pod是有序编号的,其DNS就是name-1.headlessService

这里,我们采用官方部署zk的教程,该教程有个前提(新手一般想打它)

This tutorial assumes that you have configured your cluster to dynamically provision PersistentVolumes. If your cluster is not configured to do so, you will have to manually provision three 20 GiB volumes before starting this tutorial.

这就给我们带来了一点麻烦,主要是创建PV以及如何让StatefulSet能够绑定我们创建的PV。那么,我们的工作就是创建PV,以及如何让StatefulSet绑定它们。

StatefulSet使用spec.volumeClaimTemplates为其pod创建PVC以此绑定PV。回想,之前PVC通过name的方式手动绑定到PV,但,这里肯定不行的,一个StatefulSet管理多个Pod,每个Pod都以自己的PVC,如果通过名字,那它们都会去找同一个PV,一个PV只能有一个PVC绑定,其他PVC就会处于pendding状态;这时,我们再看官方StatefulSets页的demo,会发现有个storageClassName,在Stable Storage下也说明了,StatefulSet创建的PVC是通过storageClassName的方式找到PV的,回到官方部署zk的教程,demo中storageNameClassName是缺失的,即,使用的是默认的StorageClass。

If no StorageClass is specified, then the default StorageClass will be used

至此,理解了k8s使用storageClass绑定pvc/pv的设计,也知道在statefulSet中如何使用,但,我们实验要简单,查阅资料storageClass大多是云厂商provisioner,可实验的是NFS和local,当然local更简单,但有个支持版本问题。

FEATURE STATE: Kubernetes v1.14
实验使用的是1.14.2集群,看下local-storageClass.yaml,kubectl create -f local-storageClass.yaml创建storageClass。

# Only create this for K8s 1.9+
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: local-class
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
# Supported policies: Delete, Retain
reclaimPolicy: Delete
root@hw1:~/zk# kubectl get storageclass
NAME          PROVISIONER                    AGE
local-class   kubernetes.io/no-provisioner   17h

接着,我们要创建属于local-class的PVs,为简单,使用本机文件作为存储,spec.storageClassName指定为上边创建的local-class,之后在statefulSet指定的PVC中指定该storageClass即可。这样操作简单,但为了方便管理以及生产,可以考虑NFS、甚至云服务商的PV。

kubectl -f pv-zk.yaml创建三个PVs。

kind: PersistentVolume
apiVersion: v1
metadata:name: datadir1labels:type: local
spec:storageClassName: local-classcapacity:storage: 5GiaccessModes:- ReadWriteOncehostPath:path: "/mnt/data1"
---
kind: PersistentVolume
apiVersion: v1
metadata:name: datadir2labels:type: local
spec:storageClassName: local-classcapacity:storage: 5GiaccessModes:- ReadWriteOncehostPath:path: "/mnt/data2"
---
kind: PersistentVolume
apiVersion: v1
metadata:name: datadir3labels:type: local
spec:storageClassName: local-classcapacity:storage: 5GiaccessModes:- ReadWriteOncehostPath:path: "/mnt/data3"

最后,我们要对官方的zk demo进行修改,将其spec.volumeClaimTemplates.storageClassName指定为lacal-class。

apiVersion: v1
kind: Service
metadata:name: zk-hslabels:app: zk
spec:ports:- port: 2888name: server- port: 3888name: leader-electionclusterIP: Noneselector:app: zk
---
apiVersion: v1
kind: Service
metadata:name: zk-cslabels:app: zk
spec:ports:- port: 2181name: clientselector:app: zk
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:name: zk-pdb
spec:selector:matchLabels:app: zkmaxUnavailable: 1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: zk
spec:selector:matchLabels:app: zkserviceName: zk-hsreplicas: 3updateStrategy:type: RollingUpdatepodManagementPolicy: OrderedReadytemplate:metadata:labels:app: zkspec:containers:- name: kubernetes-zookeeperimagePullPolicy: Always#image: k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10image: gcr.azk8s.cn/google_containers/kubernetes-zookeeper:1.0-3.4.10resources:requests:memory: "1Gi"cpu: "0.2"ports:- containerPort: 2181name: client- containerPort: 2888name: server- containerPort: 3888name: leader-electioncommand:- sh- -c- "start-zookeeper \--servers=3 \--data_dir=/var/lib/zookeeper/data \--data_log_dir=/var/lib/zookeeper/data/log \--conf_dir=/opt/zookeeper/conf \--client_port=2181 \--election_port=3888 \--server_port=2888 \--tick_time=2000 \--init_limit=10 \--sync_limit=5 \--heap=512M \--max_client_cnxns=60 \--snap_retain_count=3 \--purge_interval=12 \--max_session_timeout=40000 \--min_session_timeout=4000 \--log_level=INFO"readinessProbe:exec:command:- sh- -c- "zookeeper-ready 2181"initialDelaySeconds: 10timeoutSeconds: 5livenessProbe:exec:command:- sh- -c- "zookeeper-ready 2181"initialDelaySeconds: 10timeoutSeconds: 5volumeMounts:- name: datadirmountPath: /var/lib/zookeepersecurityContext:#runAsUser: 1000fsGroup: 1000volumeClaimTemplates:- metadata:name: datadirspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "local-class"resources:requests:storage: 1Gi

kubectl exec -it zk.yaml启动ZKs。查看zk状态,并进行测试。

root@hw1:~/zk# kubectl get pods
NAME                READY   STATUS    RESTARTS   AGE
busybox             1/1     Running   19         19h
zk-0                1/1     Running   0          17h
zk-1                1/1     Running   0          17h
zk-2                1/1     Running   0          17hroot@hw1:~/zk# kubectl get pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                     STORAGECLASS   REASON   AGE
Bound    default/datadir-kafka-2   local-class             17h
datadir1        5Gi        RWO            Retain           Bound    default/datadir-zk-0      local-class             17h
datadir2        5Gi        RWO            Retain           Bound    default/datadir-zk-1      local-class             17h
datadir3        5Gi        RWO            Retain           Bound    default/datadir-zk-2      local-class             17h
root@hw1:~/zk# kubectl get pvc
NAME              STATUS   VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS   AGE
datadir-zk-0      Bound    datadir1        5Gi        RWO            local-class    17h
datadir-zk-1      Bound    datadir2        5Gi        RWO            local-class    17h
datadir-zk-2      Bound    datadir3        5Gi        RWO            local-class    17h 

查看zk的状态

root@hw1:~/zk# for i in 0 1 2; do kubectl exec zk-$i -- hostname; done
zk-0
zk-1
zk-2
root@hw1:~/zk# for i in 0 1 2; do echo "myid zk-$i";kubectl exec zk-$i -- cat /var/lib/zookeeper/data/myid; done
myid zk-0
1
myid zk-1
2
myid zk-2
3
root@hw1:~/zk# for i in 0 1 2; do kubectl exec zk-$i -- hostname -f; done
zk-0.zk-hs.default.svc.cluster.local
zk-1.zk-hs.default.svc.cluster.local
zk-2.zk-hs.default.svc.cluster.local
root@hw1:~/zk# kubectl exec zk-0 -- cat /opt/zookeeper/conf/zoo.cfg
#This file was autogenerated DO NOT EDIT
clientPort=2181
dataDir=/var/lib/zookeeper/data
dataLogDir=/var/lib/zookeeper/data/log
tickTime=2000
initLimit=10
syncLimit=5
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
autopurge.snapRetainCount=3
autopurge.purgeInteval=12
server.1=zk-0.zk-hs.default.svc.cluster.local:2888:3888
server.2=zk-1.zk-hs.default.svc.cluster.local:2888:3888
server.3=zk-2.zk-hs.default.svc.cluster.local:2888:3888
root@hw1:~/zk# 

参考资料:

  1. StatefulSets
  2. Storage Classes
  3. Running ZooKeeper, A Distributed System Coordinator
  4. 也欢迎去我的github page访问,获取笔记及k8s模板

由于篇幅关系,kafka部分分在下一篇记录。

这篇关于在k8s上搭建kfk-zk集群(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/346246

相关文章

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

如何使用Haporxy搭建Web群集

《如何使用Haporxy搭建Web群集》Haproxy是目前比较流行的一种群集调度工具,同类群集调度工具有很多如LVS和Nginx,本案例介绍使用Haproxy及Nginx搭建一套Web群集,感兴趣的... 目录一、案例分析1.案例概述2.案例前置知识点2.1 HTTP请求2.2 负载均衡常用调度算法 2.

SpringBoot连接Redis集群教程

《SpringBoot连接Redis集群教程》:本文主要介绍SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 依赖2. 修改配置文件3. 创建RedisClusterConfig4. 测试总结1. 依赖 <de

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

pytest+allure环境搭建+自动化实践过程

《pytest+allure环境搭建+自动化实践过程》:本文主要介绍pytest+allure环境搭建+自动化实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、pytest下载安装1.1、安装pytest1.2、检测是否安装成功二、allure下载安装2.

使用vscode搭建pywebview集成vue项目实践

《使用vscode搭建pywebview集成vue项目实践》:本文主要介绍使用vscode搭建pywebview集成vue项目实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录环境准备项目源码下载项目说明调试与生成可执行文件核心代码说明总结本节我们使用pythonpywebv

Windows Server 2025 搭建NPS-Radius服务器的步骤

《WindowsServer2025搭建NPS-Radius服务器的步骤》本文主要介绍了通过微软的NPS角色实现一个Radius服务器,身份验证和证书使用微软ADCS、ADDS,具有一定的参考价... 目录简介示意图什么是 802.1X?核心作用802.1X的组成角色工作流程简述802.1X常见应用802.