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