此示例演示了如何将 StatefulSet 应用程序部署到 主管 上的 TKG 集群。
存储类
存储类存在,有两个版本可供选择。对于此部署,我们将使用
*-latebinding
版本。
kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE zonal-ds-policy-105 csi.vsphere.vmware.com Delete Immediate true 17h zonal-ds-policy-105-latebinding csi.vsphere.vmware.com Delete WaitForFirstConsumer true 17h
多区域 主管 拓扑
TKG 集群在跨
vSphere 区域 的
主管 上置备。
kubectl get nodes -L topology.kubernetes.io/zone NAME STATUS ROLES AGE VERSION ZONE test-cluster-e2e-script-105-m72sb-2dnsz Ready control-plane,master 18h v1.22.6+vmware.1 zone-1 test-cluster-e2e-script-105-m72sb-rmtjn Ready control-plane,master 18h v1.22.6+vmware.1 zone-2 test-cluster-e2e-script-105-m72sb-rvhb8 Ready control-plane,master 18h v1.22.6+vmware.1 zone-3 test-cluster-e2e-script-105-nodepool-1-p86fm-6dfcdc77b7-fxm4s Ready <none> 18h v1.22.6+vmware.1 zone-1 test-cluster-e2e-script-105-nodepool-2-gx5gs-7cf4895b77-6wlb4 Ready <none> 18h v1.22.6+vmware.1 zone-2 test-cluster-e2e-script-105-nodepool-3-fkkc9-856cd45985-d8nsl Ready <none> 18h v1.22.6+vmware.1 zone-3
StatefulSet
StatefulSet (
sts.yaml
) 将应用程序部署到 Pod,每个 Pod 都具有重新调度后仍然可用的永久标识符。
apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: replicas: 3 selector: matchLabels: app: nginx serviceName: nginx template: metadata: labels: app: nginx spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - zone-1 - zone-2 - zone-3 podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - nginx topologyKey: topology.kubernetes.io/zone containers: - name: nginx image: gcr.io/google_containers/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html - name: logs mountPath: /logs volumeClaimTemplates: - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] storageClassName: zonal-ds-policy-105-latebinding resources: requests: storage: 2Gi - metadata: name: logs spec: accessModes: [ "ReadWriteOnce" ] storageClassName: zonal-ds-policy-105-latebinding resources: requests: storage: 1Gi
部署应用程序
按如下方式部署
StatefulSet 应用程序。成功部署后,可以在后期绑定卷模式下使用 WaitForFirstConsumer 和存储类跨 3 个
vSphere 区域 调度应用程序。
- 部署 StatefulSet。
kubectl create -f sts.yaml statefulset.apps/web created
- 验证 StatefulSet。
kubectl get statefulset NAME READY AGE web 3/3 112s
- 验证 Pod。
kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-0 1/1 Running 0 117s 172.16.1.2 test-cluster-e2e-script-105-nodepool-3-fkkc9-856cd45985-d8nsl <none> <none> web-1 1/1 Running 0 90s 172.16.2.2 test-cluster-e2e-script-105-nodepool-2-gx5gs-7cf4895b77-6wlb4 <none> <none> web-2 1/1 Running 0 53s 172.16.3.2 test-cluster-e2e-script-105-nodepool-1-p86fm-6dfcdc77b7-fxm4s <none> <none>
- 验证 Pod 跨区域调度和后期卷绑定。
kubectl get pv -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.claimRef.name}{"\t"}{.spec.nodeAffinity}{"\n"}{end}' pvc-7010597f-31cf-4ab1-bbd7-98ac04e0c603 www-web-2 {"required":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"topology.kubernetes.io/zone","operator":"In","values":["zone-1"]}]}]}} pvc-921fadfc-df89-456d-a341-00f4117035f8 logs-web-0 {"required":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"topology.kubernetes.io/zone","operator":"In","values":["zone-3"]}]}]}} pvc-bcb46a24-58cb-4ec7-a964-391fe80400fc www-web-1 {"required":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"topology.kubernetes.io/zone","operator":"In","values":["zone-2"]}]}]}} pvc-f51a44e5-ec19-4bec-b67a-3e34512049b8 www-web-0 {"required":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"topology.kubernetes.io/zone","operator":"In","values":["zone-3"]}]}]}} pvc-fa68887a-31dd-4d9e-bb39-88653a9d80c9 logs-web-2 {"required":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"topology.kubernetes.io/zone","operator":"In","values":["zone-1"]}]}]}} pvc-fc2cd6f7-b033-48ee-892d-df5318ec6f3e logs-web-1 {"required":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"topology.kubernetes.io/zone","operator":"In","values":["zone-2"]}]}]}}