Prenez l'habitude d'écrire ensemble ! C'est le 17ème jour de ma participation au "Nuggets Daily New Plan · April Update Challenge", cliquez pour voir les détails de l'événement .
1. Dilatation et retraitStatefulSet
StatefulSet
Comme pour Deployment
, DaemonSet
vous pouvez également agrandir ou réduire manuellement. Principalement en modifiant les replicas
champs .
Agrandissement StatefulSet
:
# 由于实验环境中只有两个 Node,扩容操作不会成功,大家可以自行在本地尝试
kubectl scale sts web --replicas=5
statefulset.apps/web scaled
复制代码
Rétrécissement StatefulSet
:
kubectl patch sts web -p '{"spec":{"replicas":1}}'
statefulset.apps/web patched
复制代码
2. Mettre à jourStatefulSet
StatefulSet
Vous pouvez utiliser le champ spec.updateStrategy.type
pour définir la stratégie de mise à jour, qui peut être utilisée pour mettre à jour ,StatefulSet
, , , et , etc. dans la mise à jour . Actuellement, deux stratégies de mise à jour sont prises en charge :Pod
container images
resource requests
limits
labels
annotations
RolingUpdate
: La stratégie par défaut, après la mise à jour duStatefulSet
modèle , l'ancien est automatiquement suppriméPod
et le nouveau est crééPod
, et l'ordre de mise à jour est opposé à l'index du numéro de sérieOnDelete
: Après la mise à jour d'unStatefulSet
modèle , unPod
nouveau ne sera créé que si l'ancien est supprimé manuellementPod
- Utilisez la politique par défaut pour mettre à jour l'image du conteneur, ouvrez d'abord
Pod
un
kubectl get pods -w -l app=nginx
复制代码
Pod
L' image mise à jour estnginx-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
复制代码
- Regardez le processus
Pod
de changement
$ 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
复制代码
- En regardant
Pod
l' , vous pouvez constater qu'elle a été mise à jour avec la nouvelle image
$ 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. SupprimerStatefulSet
StatefulSet
Il existe deux manières de supprimer :
- Suppression non en cascade :
StatefulSet
lors de , leStatefulSet
créé parPod
ne sera pas supprimé - Suppression en cascade :
StatefulSet
lors de ,StatefulSet
lui-même et le crééPod
seront supprimés, et l'ordre de suppression est opposé à l'index ordinal
(1) Suppression sans cascade
Utilisez le --cascade=false
paramètre pour indiquer des suppressions sans cascade :
$ 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
复制代码
essayez de supprimer manuellementweb-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
复制代码
reconstruireweb StatefulSet
# 由于没有删除 nginx 服务,所以重新创建的时候有报错提醒,可以忽略
$ kubectl create -f web.yaml
statefulset.apps/web created
Error from server (AlreadyExists): error when creating "web.yaml": services "nginx" already exists
复制代码
Afficher en cours d'exécution dans l'environnement actuelPod
# 当前环境运行的都是新创建的 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
复制代码
Le processus plus détaillé est le suivant :
$ 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
复制代码
Remarque :
StatefulSet
lors , celui qui estPod
associé ne sera pas suppriméPersistentVolumes
. Lors de laStatefulSet
reconstruction , le nouveau crééPod
montera celui d'originePersistentVolumes
.
(2) Suppression en cascade
L'omission du --cascade
paramètre signifie des suppressions en cascade :
$ kubectl delete statefulset web
statefulset.apps "web" deleted
复制代码
Voir Pod
le processus de changement
# 依然是先删除 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
复制代码
Supprimer manuellement le nginx
service
$ kubectl delete service nginx
service "nginx" deleted
复制代码
3. Pod
Stratégie de gestion
Pour certains systèmes distribués, il n'est parfois pas obligatoire que Pod
le démarrage soit dans l'ordre, juste pour utiliser StatefulSet
les fonctionnalités d'unicité et d'identité dans le , vous pouvez définir l'ordre de démarrage via le spec.podManagementPolicy
champ . Il y a principalement deux séquences :
OrderedReady
: option par défaut, qui signifie démarrer séquentiellementParallel
: peut démarrer/terminer tout en parallèlePod
,Pod
lors n'a pas besoin d'attendre que l'autrePod
doive démarrer/terminer en premier
- créer
web.yaml
,podManagementPolicy: "Parallel"
---
spec:
serviceName: "nginx"
podManagementPolicy: "Parallel"
replicas: 2
复制代码
- Surveillez
Pod
le processus de création de et exécutez la création :
$ 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
复制代码