[Kubernetes] Utilisation de StatefulSet

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

StatefulSetComme pour Deployment, DaemonSetvous pouvez également agrandir ou réduire manuellement. Principalement en modifiant les replicaschamps .

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

StatefulSetVous pouvez utiliser le champ spec.updateStrategy.typepour 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 :Podcontainer imagesresource requestslimitslabelsannotations

  • RolingUpdate: La stratégie par défaut, après la mise à jour du StatefulSetmodèle , l'ancien est automatiquement supprimé Podet le nouveau est créé Pod, et l'ordre de mise à jour est opposé à l'index du numéro de série
  • OnDelete: Après la mise à jour d'un StatefulSetmodèle , un Podnouveau ne sera créé que si l'ancien est supprimé manuellementPod
  1. Utilisez la politique par défaut pour mettre à jour l'image du conteneur, ouvrez d'abord Podun
kubectl get pods -w -l app=nginx
复制代码
  1. PodL' 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
复制代码
  1. Regardez le processus Podde 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
复制代码
  1. En regardant Podl' , 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

StatefulSetIl existe deux manières de supprimer :

  • Suppression non en cascade : StatefulSetlors de , le StatefulSetcréé par Podne sera pas supprimé
  • Suppression en cascade : StatefulSetlors de , StatefulSetlui-même et le créé Podseront supprimés, et l'ordre de suppression est opposé à l'index ordinal

(1) Suppression sans cascade

Utilisez le --cascade=falseparamè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 : StatefulSetlors , celui qui est Podassocié ne sera pas supprimé PersistentVolumes. Lors de la StatefulSetreconstruction , le nouveau créé Podmontera celui d'origine PersistentVolumes.

(2) Suppression en cascade

L'omission du --cascadeparamètre signifie des suppressions en cascade :

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

Voir Podle 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 nginxservice

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

3. PodStratégie de gestion

Pour certains systèmes distribués, il n'est parfois pas obligatoire que Podle démarrage soit dans l'ordre, juste pour utiliser StatefulSetles fonctionnalités d'unicité et d'identité dans le , vous pouvez définir l'ordre de démarrage via le spec.podManagementPolicychamp . Il y a principalement deux séquences :

  • OrderedReady: option par défaut, qui signifie démarrer séquentiellement
  • Parallel: peut démarrer/terminer tout en parallèle Pod, Podlors n'a pas besoin d'attendre que l'autre Poddoive démarrer/terminer en premier
  1. créer web.yaml,podManagementPolicy: "Parallel"
---
spec:
  serviceName: "nginx"
  podManagementPolicy: "Parallel"
  replicas: 2
复制代码
  1. Surveillez Podle 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
复制代码

Je suppose que tu aimes

Origine juejin.im/post/7087487256293802014
conseillé
Classement