作者:fredalxin
地址:https://fredal.xin/deploy-zk-…
随着云原生化风行的大趋势,咱们的根底组件也须要逐步上 Kubernetes 了。Apache Zookeeper 作为目前最风行的分布式协调组件,在咱们的微服务架构中负责表演注册核心的角色。
在 Kubernetes 中运行 Zookeeper 集群是很有意义的,能够利用其原生的弹性扩缩容、高可用个性。
应用 StatefulSet 部署 Zookeeper
官网提供了应用 statefulSet 的形式来部署 Zookeeper 运行 Zookeeper,它会创立一个 headless service,一个 cluster service,一个 podDisruptionBudget,一个 statefulSet。
apiVersion: v1
kind: Service
metadata:
name: zk-hs
labels:
app: zk
spec:
ports:
- port: 2888
name: server
- port: 3888
name: leader-election
clusterIP: None
selector:
app: zk
---
apiVersion: v1
kind: Service
metadata:
name: zk-cs
labels:
app: zk
spec:
ports:
- port: 2181
name: client
selector:
app: zk
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
selector:
matchLabels:
app: zk
maxUnavailable: 1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: zk
spec:
selector:
matchLabels:
app: zk
serviceName: zk-hs
replicas: 3
updateStrategy:
type: RollingUpdate
podManagementPolicy: OrderedReady
template:
metadata:
labels:
app: zk
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- zk
topologyKey: "kubernetes.io/hostname"
containers:
- name: kubernetes-zookeeper
imagePullPolicy: Always
image: "k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10"
resources:
requests:
memory: "1Gi"
cpu: "0.5"
ports:
- containerPort: 2181
name: client
- containerPort: 2888
name: server
- containerPort: 3888
name: leader-election
command:
- 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: 10
timeoutSeconds: 5
livenessProbe:
exec:
command:
- sh
- -c
- "zookeeper-ready 2181"
initialDelaySeconds: 10
timeoutSeconds: 5
volumeMounts:
- name: datadir
mountPath: /var/lib/zookeeper
securityContext:
runAsUser: 1000
fsGroup: 1000
volumeClaimTemplates:
- metadata:
name: datadir
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
应用 kubectl apply
利用这个配置文件,期待一会之后,发现 pod 和 service 都已创立胜利。
咱们检查一下 zookeeper 节点的状态:
将 zookeeper 部署在 kubernetes 上一大长处就是能够不便扩缩容,这边咱们以扩容成 4 个节点为例,kubectl edit sts zk
,批改 replica:4
以及 --server=4
。能够看到通过一段时间的滚动更新,最终扩容成了 4 个节点。
应用 Kubernetes Operator 部署 Zookeeper
除了 StatefulSet 的形式外,咱们还能够应用 Kubernetes Operator 的形式部署。目前咱们能够参考应用 pravega 提供的 operator。
首先创立自定义的 crd ZookeeperCluster
kubectl create -f deploy/crds
接着创立权限相干的,包含 serviceAccount、Role 和 RoleBinding (留神须要批改一下权限相干的 rbac.yaml 的配置,如果你以后的 namespace 不是 default,须要把 namespcae: default 去掉,不然权限验证有问题)。
kubectl create -f deploy/default_ns/rbac.yaml
而后给 operator 创立 deployment
kubectl create -f deploy/default_ns/operator.yaml
咱们看到 operator 曾经创立好了:
接下来咱们本人编写一个 CR 即可:
apiVersion: zookeeper.pravega.io/v1beta1
kind: ZookeeperCluster
metadata:
name: zookeeper
spec:
replicas: 3
image:
repository: pravega/zookeeper
tag: 0.2.9
storageType: persistence
persistence:
reclaimPolicy: Delete
spec:
storageClassName: "rbd"
resources:
requests:
storage: 8Gi
这里的 storageClassName 配合自建集群抉择了 rbd。apply 之后等一会儿能够看到 zk 曾经创立结束。
扩缩容的话也十分不便,还是以扩容 4 节点为例,间接 patch 咱们创立的 cr 即可:
kubectl patch zk zookeeper --type='json' -p='[{"op":"replace","path":"/spec/replicas","value":4}]'
应用 Kubernetes Kudo 部署 Zookeeper
kudo 是一个实用于 kubernetes operator 的组装器,也是官网举荐的。
首先咱们装置一下 kudo,在 mac 上装置:
brew install kudo
装置完之后进行初始化
kubectl kudo init
这个时候咱们会发现 kudo operator 曾经装好了:
而后间接装置一下 zookeeper 即可 (kudo 内置了 zookeeper operator),留神这里同样申明一下 storage class 为 rbd。
kubectl kudo install zookeeper --instance=zookeeper-instance -p STORAGE_CLASS=rbd
扩缩容的话也十分不便:
kubectl kudo update --instance=zookeeper-instance -p NODE_COUNT=4
。
近期热文举荐:
1.600+ 道 Java 面试题及答案整顿 (2021 最新版)
2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!
3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!
4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!
5.《Java 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!