作者:fredalxin

地址:https://fredal.xin/deploy-zk-...

随着云原生化风行的大趋势,咱们的根底组件也须要逐步上Kubernetes了。Apache Zookeeper作为目前最风行的分布式协调组件,在咱们的微服务架构中负责表演注册核心的角色。

在Kubernetes中运行Zookeeper集群是很有意义的,能够利用其原生的弹性扩缩容、高可用个性。

应用StatefulSet部署Zookeeper

官网提供了应用statefulSet的形式来部署 Zookeeper 运行 Zookeeper,它会创立一个headless service,一个cluster service,一个podDisruptionBudget,一个statefulSet。

apiVersion: v1kind: Servicemetadata:  name: zk-hs  labels:    app: zkspec:  ports:  - port: 2888    name: server  - port: 3888    name: leader-election  clusterIP: None  selector:    app: zk---apiVersion: v1kind: Servicemetadata:  name: zk-cs  labels:    app: zkspec:  ports:  - port: 2181    name: client  selector:    app: zk---apiVersion: policy/v1beta1kind: PodDisruptionBudgetmetadata:  name: zk-pdbspec:  selector:    matchLabels:      app: zk  maxUnavailable: 1---apiVersion: apps/v1kind: StatefulSetmetadata:  name: zkspec:  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/v1beta1kind: ZookeeperClustermetadata:  name: zookeeperspec:  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开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!