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 spec: storageClassName: gluster-dynamic 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
标签:StatefulSet,Kubernetes,Service,--,cluster,2379,etcd,name 来源: https://www.cnblogs.com/zuoyang/p/16423791.html