乐趣区

关于java:基于-Kubernetes-部署-Zookeeper太有意思了

作者: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 开发手册(嵩山版)》最新公布,速速下载!

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

退出移动版