K8s部署ZooKeeper 官方文档

此实验可以了解到几个知识点

  1. StatefulSets
  2. PodDisruptionBudgets
  3. PodAntiAffinity
  4. Apache Zookeeper

推荐先去搭建下Zookeeper分布式服务。更加方便此次实验
二进制部署Zookeeper分布式服务

一、简介StatefulSets特性

优点:

  • 稳定的唯一网络标识符。
  • 稳定,持久的存储。
  • 有序,顺畅的部署和扩展。
  • 有序的自动滚动更新。

局限性:

  • 给定Pod的存储必须由PersistentVolume Provisioner根据所请求的进行设置storage class,或者由管理员预先设置。
  • 删除和/或缩小StatefulSet 不会删除与StatefulSet关联的卷。这样做是为了确保数据安全这通常比自动清除所有相关的StatefulSet资源有价值。
  • StatefulSet当前需要无头服务来负责Pod的网络身份。您负责创建此服务
  • 删除StatefulSet时,StatefulSet不提供对Pod终止的任何保证。为了实现StatefulSet中Pod的有序且正常的终止,可以在删除之前将StatefulSet缩小为0
  • 当使用带有默认Pod管理策略的滚动更新时 ,有可能进入需要人工干预才能修复的损坏状态 OrderedReady
主机IP提供服务
k8s-masterr192.168.11.128NFS
k8s-node1192.168.11.129-
k8s-node2192.168.11.130-

二、搭建NFS文件共享服务

1、搭建NFS服务

2、创建提供给有状态服务的卷

mkdir  -p  /nfs{1,2,3}

3、共享nfs1、2、3文件目录

cat <<EOF > /etc/exports
/nfs1 192.168.11.0/24(rw,no_root_squash,async)
/nfs2 192.168.11.0/24(rw,no_root_squash,async)
/nfs3 192.168.11.0/24(rw,no_root_squash,async)
EOF

4、重新加载nfs共享文件

exportfs  -arv

三、创建PV存储卷

1、创建PersistentVolume卷(仅NFS和HostPath支持回收策略)

stspv.yaml
apiVersion: v1
kind: PersistentVolume    #设置控制器为PV
metadata:
  name:  nfsv1          #定义pv名称
  labels:
    name: nfsv1
spec:
  nfs:     #定义存储类型为nfs
    path: /nfs1   #nfs共享路径
    server: 192.168.11.128    #nfs共享服务service
  storageClassName: nfs       #存储类名  
  persistentVolumeReclaimPolicy: Retain  #卷的策略(保留)
  accessModes:          #访问模式
  - ReadWriteOnce       #该卷可以通过单个节点以读写方式安装
  capacity:             #容量
    storage: 3Gi        #存储大小
---
apiVersion: v1
kind: PersistentVolume    #设置控制器为PV
metadata:
  name:  nfsv2            #定义pv名称
  labels:
    name: nfsv2
spec:
  nfs:            #定义存储类型为nfs
    path: /nfs2   #nfs共享路径
    server: 192.168.11.128    #nfs共享服务service
  storageClassName: nfs       #存储类名 
  persistentVolumeReclaimPolicy: Retain  #卷的策略(保留)
  accessModes:          #访问模式
  - ReadWriteOnce       #该卷可以通过单个节点以读写方式安装
  capacity:             #容量
    storage: 3Gi        #存储大小
---
apiVersion: v1
kind: PersistentVolume    #设置控制器为PV
metadata:
  name:  nfsv3            #定义pv名称
  labels:
    name: nfsv3
spec:
  nfs:            #定义存储类型为nfs
    path: /nfs3   #nfs共享路径
    server: 192.168.11.128    #nfs共享服务service
  storageClassName: nfs		  #存储类名 
  persistentVolumeReclaimPolicy: Retain   #卷的策略(保留)
  accessModes:          #访问模式
  - ReadWriteOnce       #该卷可以通过单个节点以读写方式安装
  capacity:             #容量
    storage: 3Gi        #存储大小

2、生成提供服务PV卷yaml文件并且查看

kubectl  apply -f stspv.yaml  && kubectl  get  pv

在这里插入图片描述

四、部署Zookeeper分布式服务

1、书写yaml配置文件

vim zookeeper.yaml
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  #OrderedReady顺序创建及逆序删除Pod,Parallel同时创建删除Pod(sfs.spec.podManagementPolicy)
  template:
    metadata:
      labels:
        app: zk
    spec:
      #terminationGracePeriodSeconds: 10
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                    - zk
              topologyKey: "kubernetes.io/hostname"
      containers:
      - name: kubernetes-zookeeper
        imagePullPolicy: Always
        image: "mirrorgooglecontainers/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: data
          mountPath: /var/lib/zookeeper
      securityContext:   #限制不可信容器的行为,保护系统和其他容器不受其影响
        runAsUser: 1000   #user ID
        fsGroup: 1000	  #volume FSGroup
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "nfs"
      resources:
        requests:
          storage: 1Gi

2、生成zk服务yaml文件并且查看服务调度(pod会调度到不同的节点)

kubectl  apply -f zookeeper.yaml && kubectl  get  pod -o wide -w

在这里插入图片描述
OK,查看详细信息日志

kubectl   logs  zk-0

在这里插入图片描述
3、修改共享文件的属主属组并且查看其中权限

chown  -R 1000:1000  /nfs{1,2,3} && cd / &&  ls -al |grep nfs  && cd  -

在这里插入图片描述
在这里插入图片描述

4、再次查看服务(如果有3个node节点可跳过)

 kubectl  get  pod -o wide -w

在这里插入图片描述
查看zk-2 Pod的详细情况

kubectl  describe   po  zk-2

在这里插入图片描述

3、去除k8s-master节点上的污

kubectl  taint  node k8s-master node-role.kubernetes.io/master:NoSchedule-  && kubectl  describe  nodes  k8s-master

在这里插入图片描述
再次查看服务是否全部允许

kubectl  get  pod -o wide

在这里插入图片描述

4、查看PV与PVC情况

kubectl   get pv,pvc

在这里插入图片描述

五、查看zookeeper是否正常运行服务

1、查看Pod的Hostname(主机名采用的形式<statefulset name>-<ordinal index>

for i in 0 1 2; do kubectl exec zk-$i -- hostname; done

在这里插入图片描述
2、查看你每个Pod的myid值

for i in 0 1 2; do echo   "主机zk-$i myid值";kubectl exec zk-$i -- cat /var/lib/zookeeper/data/myid; done

在这里插入图片描述
这里大家可以发现一个规律了吧有序,顺畅的部署和扩展 ,里面的myid同时也是有序的。

3、检查服务是否真的运行同时分配到了对应的角色

for i in 0 1 2 ;do echo 当前输出是zk-$i的信息  ; kubectl  exec -it  zk-$i   --  /opt/zookeeper/bin/zkServer.sh status;done

在这里插入图片描述

六、zookeeper配置对比文件分析(可跳过)

1、对比zookeeper中的zoo.cfg文件
二进制部署zookeeper:在这里插入图片描述
kubernets部署zookeeper:
在这里插入图片描述
OK,对此我们进行展开说明
statefulset篇章有个网络格式说明,如下图
在这里插入图片描述
1、查看zk服务的Pod的域

for i in 0 1 2; do kubectl exec zk-$i -- hostname -f; done

在这里插入图片描述
可以看下就是kubernets部署zookeeper中zoo.cfg文件内容

2、查看本地解析的hosts文件

for i in 0 1 2 ;do echo 当前输出是zk-$i的本地解析信息:; kubectl  exec -it  zk-$i   -- cat  /etc/hosts|tail -n 1;echo -e " ";done

在这里插入图片描述
OK,可以看到hosts里面做了域名解析,IP会变化但是域名固定的。不管Pod删除,更新,重新生成只是IP变化域名不会有所变化,zookeeper配置文件只需要去解析本机的域名对应去IP即可。具体可查看生成的格式:<hostname>.<service>.<ns>.svc.<zone>
DNS的服务发现
在这里插入图片描述

七、测试数据是否可读写

1、 zk-0执行zkCli.sh脚本以写入数据

kubectl exec zk-0 zkCli.sh create /hello  world

2、 zk-1执行zkCli.sh脚本以读取数据

kubectl exec zk-1 zkCli.sh get /hello

在这里插入图片描述
测试OK。可以正常读写

八、测试是否具有持久存储

1、删除zk StatefulSet服务

kubectl delete statefulset zk  && kubectl get pods -w -l app=zk

在这里插入图片描述

2、重新生成zk有状态服务并且查看状态

kubectl  apply -f zookeeper.yaml  && kubectl  get  po -w

在这里插入图片描述
发现一个点了吗? 再次生成Pod是从zk-0开始创建最后才创建zk-2。可以回去看下第一次生成Pod是从后面倒序创建。

3、zk-2再次读取数据

kubectl exec zk-2 zkCli.sh get /hello

在这里插入图片描述
OK,测试确实具有可持久性。

后期的探针、容忍、维护可按官方文档进行操作。

Logo

开源、云原生的融合云平台

更多推荐