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 客户端提供服务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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 对象:
1 2 3 | [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 对象资源记录:
1 2 3 4 5 | [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 资源。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | 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 文件:
1 2 | [root@k8s-master01- test -2-26 ~] # kubectl apply -f etcd.yaml statefulset.apps /etcd created |
下面命令结果表示它们都已经通过标签选择器关联到了由 Pod 资源生成的 Endpoints 资源之上。这些 Pod 资源都是由 StatefulSet 控制器 etcd 创建而成的。
1 | kubectl get endpoints |
上面 "kubect get endpoints" 命令结果中的 IP 地址和由 etcd 控制器创建的 Pod 资源的相关信息可以看出:
1 | kubect get pods -n etcd-cluster -o wide |
使用 etcd 的客户端工具 etcdctl 检测集群的健康装填:
1 | kubectl exec etcd-0 -- etcdctl cluster-health |
"kubectl rollout status" 命令监控其滚动升级过程中的状态变动:
1 | kubectl rollout status statefulset etcd |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具