zk在k8s中的部署


ZooKeeper 基础 Apache ZooKeeper是一个分布式的开源协调服务,用于分布式系统。

ZooKeeper 允许你读取、写入数据和发现数据更新。数据按层次结构组织在文件系统中,并复制到 ensemble(一个 ZooKeeper 服务的集合) 中所有的 ZooKeeper 服务。对数据的所有操作都是原子的和顺序一致的。ZooKeeper 通过 Zab 一致性协议在 ensemble 的所有服务之间复制一个状态机来确保这个特性。

ensemble 使用 Zab 协议选举一个 leader,在选举出 leader 前不能写入数据。一旦选举出了 leader,ensemble 使用 Zab 保证所有写入被复制到一个 quorum,然后这些写入操作才会被确认并对客户端可用。如果没有遵照加权 quorums,一个 quorum 表示包含当前 leader 的 ensemble 的多数成员。例如,如果 ensemble 有3个服务,一个包含 leader 的成员和另一个服务就组成了一个 quorum。如果 ensemble 不能达成一个 quorum,数据将不能被写入。

ZooKeeper 在内存中保存它们的整个状态机,但是每个改变都被写入一个在存储介质上的持久 WAL(Write Ahead Log)。当一个服务故障时,它能够通过回放 WAL 恢复之前的状态。为了防止 WAL 无限制的增长,ZooKeeper 服务会定期的将内存状态快照保存到存储介质。这些快照能够直接加载到内存中,所有在这个快照之前的 WAL 条目都可以被安全的丢弃。

主要是创建3个pv,然后通过pvc绑定相应pv。

按照下面的部署

https://kubernetes.io/zh/docs/tutorials/stateful-application/zookeeper/

做了一些变更

---
#nfs_server_ip=为nfs服务器地址
apiVersion: v1
kind: PersistentVolume
metadata:
  name: datadir0
  annotations:
      volume.beta.kubernetes.io/storage-class: "zk-0"
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /mnt/nfs/k8s/zk/zk0
    server: nfs_server_ip
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: datadir1
  annotations:
      volume.beta.kubernetes.io/storage-class: "zk-1"
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /mnt/nfs/k8s/zk/zk1
    server: nfs_server_ip
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: datadir2
  annotations:
      volume.beta.kubernetes.io/storage-class: "zk-2"
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /mnt/nfs/k8s/zk/zk2
    server: nfs_server_ip
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: datadir-zk-0
spec:
  storageClassName: zk-0
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 500Mi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: datadir-zk-1
spec:
  storageClassName: zk-1
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 500Mi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: datadir-zk-2
spec:
  storageClassName: zk-2
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 500Mi
---
省略

状态监测

➜  zk git:(master) ✗ kubectl exec zk-0 zkServer.sh status -n uat

ZooKeeper JMX enabled by default
Using config: /usr/bin/../etc/zookeeper/zoo.cfg
Mode: follower
➜  zk git:(master) ✗ kubectl exec zk-1 zkServer.sh status -n uat

ZooKeeper JMX enabled by default
Using config: /usr/bin/../etc/zookeeper/zoo.cfg
Mode: leader
➜  zk git:(master) ✗ kubectl exec zk-2 zkServer.sh status -n uat

ZooKeeper JMX enabled by default
Using config: /usr/bin/../etc/zookeeper/zoo.cfg
Mode: follower