¡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
StatefulSet
Al igual que con Deployment
, DaemonSet
también puede expandir o reducir manualmente. Principalmente modificando los replicas
campos .
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
StatefulSet
Puede usar el campo spec.updateStrategy.type
para 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:Pod
container images
resource requests
limits
labels
annotations
RolingUpdate
: la estrategia predeterminada, después de actualizar laStatefulSet
plantilla , la anterior se elimina automáticamentePod
y se crea la nuevaPod
, y el orden de actualización es opuesto al índice del número de serieOnDelete
: después de actualizar unaStatefulSet
plantilla ,Pod
solo se creará una nueva si la antigua se elimina manualmentePod
- Use la política predeterminada para actualizar la imagen del contenedor, primero abra
Pod
un
kubectl get pods -w -l app=nginx
复制代码
Pod
La 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
复制代码
- Mira el proceso
Pod
de 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
复制代码
- Mirando
Pod
la , 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
StatefulSet
Hay dos formas de eliminar :
- Eliminación no en cascada:
StatefulSet
al , elStatefulSet
creado porPod
no se eliminará - Eliminación en cascada:
StatefulSet
al , 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=false
pará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:
StatefulSet
Al , no se borrará elPod
asociado ,PersistentVolumes
alStatefulSet
reconstruir , el recién creadoPod
montará el originalPersistentVolumes
.
(2) Eliminación en cascada
Omitir el --cascade
parámetro significa eliminar en cascada:
$ kubectl delete statefulset web
statefulset.apps "web" deleted
复制代码
Ver Pod
el 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 nginx
servicio
$ kubectl delete service nginx
service "nginx" deleted
复制代码
3. Pod
Estrategia de gestión
Para algunos sistemas distribuidos, a veces no es obligatorio que Pod
el inicio deba estar en orden, solo para usar StatefulSet
las características de unicidad e identidad en el , puede establecer el orden de inicio a través del spec.podManagementPolicy
campo . Hay principalmente dos secuencias:
OrderedReady
: opción predeterminada, lo que significa comenzar secuencialmenteParallel
: puede iniciar/terminar todo en paraleloPod
,Pod
al no necesita esperar a que el otroPod
debe iniciar/terminar primero
- crear
web.yaml
,podManagementPolicy: "Parallel"
---
spec:
serviceName: "nginx"
podManagementPolicy: "Parallel"
replicas: 2
复制代码
- Supervise
Pod
el 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
复制代码