Kubernetes——StatefulSet控制器——案例:etcd集群

StatefulSet控制器——案例:etcd集群

  Kubernetes 的所有对象都需要持久化存储于 etcd 存储系统中,以确保系统重启或故障恢复后能将它们予以还原。

一、创建 Service 资源

  StatefulSet 资源依赖于 Headless Service 为各 Pod 资源提供名称解析服务,其他 Pod 资源可直接使用 DNS 名称来获取相关的服务。如 etcd-o.etcd,etcd-1.etcd 等。

  下面的资源清单(etcd-services.yaml)中定义的第一个资源 etcd 就是此类的 Service 资源。第二个名为 etcd-client 的 Service 资源是一个正常的 Service,它拥有 ClusterIP,并可通过 NodePort 向 Kubernetes 集群外部的 etcd 客户端提供服务。

apiVersion: v1
kind: Service
metadata:
  name: etcd
  namespace: etcd-cluster
  annotations:
   # Create endpoints also if the related pod isn't ready
   service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
  ports:
  - port: 2379
    name: client
  - port: 2380
    name: peer
  clusterIP: None
  selector:
    app: etcd-member
---
apiVersion: v1
kind: Service
metadata:
  name: etcd-client
  namespace: etcd-cluster
spec:
  ports:
  - name: etcd-client
    port: 2379
    protocol: TCP
    targetPort: 2379
  selector:
    app: etcd-member
  type: NodePort

  运行上面 2个 Service 对象:

[root@k8s-master01-test-2-26 etcd-cluster]# kubectl apply -f etcd-service.yaml 
service/etcd created
service/etcd-client created

  而后,可于 etcd-cluster 名称空间下看到如下 2个 Service 对象资源记录:

[root@k8s-master01-test-2-26 etcd-cluster]# kubectl get svc  -n etcd-cluster
NAME          TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)             AGE
etcd          ClusterIP   None          <none>        2379/TCP,2380/TCP   2m49s
etcd-client   NodePort    10.233.48.3   <none>        2379:32490/TCP      2m49s
[root@k8s-master01-test-2-26 etcd-cluster]# 

  由上面输出信息可以看出,etcd-client 通过 10.233.48.3 向客户端提供服务,它是一个标准类型的 Service 资源,类型为 NodePort,可通过各工作节点的 30290 端口将服务暴露到集群外部。

  Service 服务类型的资源创建完成后,接下来便可创建 StatefulSet 控制器,构建分布式 etcd 集群。

二、创建 StatefulSet 资源

  下面是定义在 etcd-statefulset.yaml 文件中的配置示例,它定义了一个名为 etcd 的 StatefulSet 资源。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: etcd
  namespace: etcd-cluster
  labels:
    app: etcd
spec:
  serviceName: etcd
  replicas: 3
  selector:
    matchLabels:
      app: etcd-member
  template:
    metadata:
      name: etcd
      namespace: etcd-cluster
      labels:
        app: etcd-member
    spec:
      containers:
      - name: etcd
        image: "quay.io/coreos/etcd:v3.2.16"
        ports:
        - containerPort: 2379
          name: client
        - containerPort: 2389
          name: peer
        env:
        - name: CLUSTER_SIZE
          value: "3"
        - name: SET_NAME
          value: "etcd"
        volumeMounts:
        - name: data
          mountPath: /var/run/etcd
        command:
        - "/bin/sh"
        - "-exc"
        - |
           IP=$(hostname -i)
           PEERS=""
           for i in $(seq 0 $((${CLUSTER_SIZE} - 1))); 
           do
             PEERS="${PEERS}${PEERS:+,}${SET_NAME}-${i}=http://${SET_NAME}-${i}.${SET_NAME}:2380"
           done
           exec etcd --name ${HOSTNAME} \
           --listen-peer-urls http://${IP}:2380 \
           --listen-client-urls http://${IP}:2379,http://127.0.0.1:2379 \
           --advertise-client-urls http://${HOSTNAME}.${SET_NAME}:2379 \
           --initial-advertise-peer-urls http://${HOSTNAME}.${SET_NAME}:2379 \
           --initial-cluster-token etcd-cluster-1 \
           --initial-cluster=${PEERS} \
           --initial-cluster-state new \
           --data-dir= /var/run/etcd/default.etcd 
  volumeClaimTemplates:
  - metadata:
      name: data
      annotations:
        volume.beta.kubernetes.io/storage-class: managed-nfs-storage
    spec:
      accessModes:
        - "ReadWriteOnce"
      resources:
        requests:
          storage: 1Gi                                     

  首先,将上述资源定义创建于集群中,然后运行 etcd-statefulset.yaml 文件:

[root@k8s-master01-test-2-26 ~]# kubectl apply -f etcd.yaml 
statefulset.apps/etcd created

  下面命令结果表示它们都已经通过标签选择器关联到了由 Pod 资源生成的 Endpoints 资源之上。这些 Pod 资源都是由 StatefulSet 控制器 etcd 创建而成的。

 kubectl get endpoints

  上面 "kubect get endpoints" 命令结果中的 IP 地址和由 etcd 控制器创建的 Pod 资源的相关信息可以看出:

kubect get pods -n etcd-cluster -o wide

  使用 etcd 的客户端工具 etcdctl 检测集群的健康装填:

kubectl exec etcd-0 -- etcdctl cluster-health

  "kubectl rollout status" 命令监控其滚动升级过程中的状态变动:

kubectl rollout status statefulset etcd
posted @ 2022-07-01 13:55  左扬  阅读(526)  评论(0编辑  收藏  举报
levels of contents