[Kubernetes] Uso de StatefulSet

¡Acostúmbrate a escribir juntos! Este es el día 17 de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de abril", haga clic para ver los detalles del evento .

1. Expansión y contracciónStatefulSet

StatefulSetAl igual que con Deployment, DaemonSettambién puede expandir o reducir manualmente. Principalmente modificando los replicascampos .

Expansión StatefulSet:

# 由于实验环境中只有两个 Node,扩容操作不会成功,大家可以自行在本地尝试
kubectl scale sts web --replicas=5
statefulset.apps/web scaled
复制代码

encogimiento StatefulSet:

kubectl patch sts web -p '{"spec":{"replicas":1}}'
statefulset.apps/web patched
复制代码

2. ActualizarStatefulSet

StatefulSetPuede usar el campo spec.updateStrategy.typepara establecer la estrategia de actualización, que se puede usar para actualizar ,StatefulSet , , y , etc. en la actualización Actualmente, se admiten dos estrategias de actualización:Podcontainer imagesresource requestslimitslabelsannotations

  • RolingUpdate: la estrategia predeterminada, después de actualizar la StatefulSetplantilla , la anterior se elimina automáticamente Pody se crea la nueva Pod, y el orden de actualización es opuesto al índice del número de serie
  • OnDelete: después de actualizar una StatefulSetplantilla , Podsolo se creará una nueva si la antigua se elimina manualmentePod
  1. Use la política predeterminada para actualizar la imagen del contenedor, primero abra Podun
kubectl get pods -w -l app=nginx
复制代码
  1. PodLa imagen actualizada esnginx-slim:0.7
$ kubectl patch statefulset web --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"registry-vpc.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/nginx-slim:0.7"}]'
statefulset.apps/web patched
复制代码
  1. Mira el proceso Podde cambio
$ kubectl get pods -w -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          38s
web-1   1/1     Running   0          36s
# 先更新 web-1 Pod
web-1   1/1     Terminating   0          68s
web-1   0/1     Terminating   0          69s
web-1   0/1     Terminating   0          75s
web-1   0/1     Terminating   0          75s
web-1   0/1     Pending       0          0s
web-1   0/1     Pending       0          0s
web-1   0/1     ContainerCreating   0          0s
web-1   1/1     Running             0          2s
# 然后更新 web-0 Pod
web-0   1/1     Terminating         0          79s
web-0   0/1     Terminating         0          79s
web-0   0/1     Terminating         0          87s
web-0   0/1     Terminating         0          87s
web-0   0/1     Pending             0          0s
web-0   0/1     Pending             0          0s
web-0   0/1     ContainerCreating   0          0s
web-0   1/1     Running             0          3s
复制代码
  1. Mirando Podla , puede encontrar que se ha actualizado a la nueva imagen
$ kubectl get pod -l app=nginx -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'
web-0   registry-vpc.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/nginx-slim:0.7
web-1   registry-vpc.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/nginx-slim:0.7

$ kubectl rollout status sts/web
partitioned roll out complete: 2 new pods have been updated...
复制代码

7. EliminarStatefulSet

StatefulSetHay dos formas de eliminar :

  • Eliminación no en cascada: StatefulSetal , el StatefulSetcreado por Podno se eliminará
  • Eliminación en cascada: StatefulSetal , se eliminarán tantoStatefulSet él mismo como lo creado , y el orden de eliminación es opuesto al índice ordinalPod

(1) Eliminación sin cascada

Use el --cascade=falseparámetro para indicar eliminaciones no en cascada:

$ kubectl delete statefulset web --cascade=false
statefulset.apps "web" deleted
# 由 StatefulSet 创建的 Pod 并没有被删除,依然是运行状态
$ kubectl get pods -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          50m
web-1   1/1     Running   0          51m
复制代码

intente eliminar manualmenteweb-0 Pod

$ kubectl delete pod web-0
pod "web-0" deleted
# 由于删除了 web StatefulSet,所以 web-0 Pod 没有被继续创建了
$ kubectl get pods -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-1   1/1     Running   0          53m
复制代码

reconstruirweb StatefulSet

# 由于没有删除 nginx 服务,所以重新创建的时候有报错提醒,可以忽略
$ kubectl create -f web.yaml
statefulset.apps/web created
Error from server (AlreadyExists): error when creating "web.yaml": services "nginx" already exists
复制代码

Ver ejecución en el entorno actualPod

# 当前环境运行的都是新创建的 Pod,原来单独剩下的 web-1 Pod 被删除了
$ kubectl get pods -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          3m7s
web-1   1/1     Running   0          2m54s
复制代码

El proceso más detallado es el siguiente:

$ kubectl get pods -w -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
# 删除 web-0
web-0   1/1     Terminating   0          52m
web-0   0/1     Terminating   0          52m
web-0   0/1     Terminating   0          52m
web-0   0/1     Terminating   0          52m
# web-1 处于运行状态
web-1   1/1     Running       0          62m
# 新创建 web StatefulSet 时,按顺序首先创建 web-0 Pod,创建成功后,由于检测到环境中有单独留下的 web-1 Pod,于是老的 web-1 Pod 被删除,然后重新创建新的 web-1 Pod
web-0   0/1     Pending       0          0s
web-0   0/1     Pending       0          0s
web-0   0/1     ContainerCreating   0          0s
web-0   1/1     Running             0          2s
web-1   1/1     Terminating         0          62m
web-1   0/1     Terminating         0          62m
web-1   0/1     Terminating         0          62m
web-1   0/1     Terminating         0          62m
web-1   0/1     Pending             0          0s
web-1   0/1     Pending             0          0s
web-1   0/1     ContainerCreating   0          0s
web-1   1/1     Running             0          1s
复制代码

Nota: StatefulSetAl , no se borrará el Podasociado , PersistentVolumesal StatefulSetreconstruir , el recién creado Podmontará el original PersistentVolumes.

(2) Eliminación en cascada

Omitir el --cascadeparámetro significa eliminar en cascada:

$ kubectl delete statefulset web
statefulset.apps "web" deleted
复制代码

Ver Podel proceso de cambio

# 依然是先删除 web-1 Pod,然后删除 web-0 Pod
$ kubectl get pods -w -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          19m
web-1   1/1     Running   0          19m
web-1   1/1     Terminating   0          19m
web-0   1/1     Terminating   0          20m
web-0   0/1     Terminating   0          20m
web-1   0/1     Terminating   0          19m
复制代码

Eliminar manualmente el nginxservicio

$ kubectl delete service nginx
service "nginx" deleted
复制代码

3. PodEstrategia de gestión

Para algunos sistemas distribuidos, a veces no es obligatorio que Podel inicio deba estar en orden, solo para usar StatefulSetlas características de unicidad e identidad en el , puede establecer el orden de inicio a través del spec.podManagementPolicycampo . Hay principalmente dos secuencias:

  • OrderedReady: opción predeterminada, lo que significa comenzar secuencialmente
  • Parallel: puede iniciar/terminar todo en paralelo Pod, Podal no necesita esperar a que el otro Poddebe iniciar/terminar primero
  1. crear web.yaml,podManagementPolicy: "Parallel"
---
spec:
  serviceName: "nginx"
  podManagementPolicy: "Parallel"
  replicas: 2
复制代码
  1. Supervise Podel proceso de creación de y ejecute la creación:
$ kubectl create -f web.yaml
service/nginx created
statefulset.apps/web created
# 可以看到同时启动了 web-0 和 web-1 Pod
$ kubectl get pods -w -l app=nginx
web-0   0/1   Pending   0     0s
web-1   0/1   Pending   0     0s
web-0   0/1   Pending   0     0s
web-1   0/1   Pending   0     0s
web-1   0/1   ContainerCreating   0     0s
web-0   0/1   ContainerCreating   0     0s
web-1   1/1   Running             0     2s
web-0   1/1   Running             0     2s
复制代码

Supongo que te gusta

Origin juejin.im/post/7087487256293802014
Recomendado
Clasificación