[Kubernetes] Uso do StatefulSet

Adquira o hábito de escrever juntos! Este é o 17º dia da minha participação no "Nuggets Daily New Plan · April Update Challenge", clique para ver os detalhes do evento .

1. Expansão e encolhimentoStatefulSet

StatefulSetAssim como no Deployment, DaemonSetvocê também pode expandir ou reduzir manualmente. Principalmente modificando os replicascampos .

Expansão StatefulSet:

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

Encolhimento StatefulSet:

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

2. AtualizarStatefulSet

StatefulSetVocê pode usar o campo spec.updateStrategy.typepara definir a estratégia de atualização, que pode ser usada para atualizar ,StatefulSet , , e , etc. na atualização . Atualmente, duas estratégias de atualização são suportadas:Podcontainer imagesresource requestslimitslabelsannotations

  • RolingUpdate: A estratégia padrão, após a atualização do StatefulSetmodelo , o antigo é excluído automaticamente Pode o novo é criado Pod, e a ordem de atualização é oposta ao índice do número de série
  • OnDelete: Após atualizar um StatefulSetmodelo , um Podnovo só será criado se o antigo for excluído manualmentePod
  1. Use a política padrão para atualizar a imagem do contêiner, primeiro abra Podum
kubectl get pods -w -l app=nginx
复制代码
  1. PodA imagem atualizada énginx-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. Veja o processo Podde mudança
$ 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. Observando Poda imagem do , você pode descobrir que ela foi atualizada para a nova imagem
$ 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. ExcluirStatefulSet

StatefulSetExistem duas maneiras de excluir :

  • Exclusão sem cascata: StatefulSetao , o StatefulSetcriado por Podnão será excluído
  • Exclusão em cascata: StatefulSetAo , StatefulSettanto o próprio quanto o criado Podserão excluídos, e a ordem de exclusão é oposta ao índice ordinal

(1) Exclusão sem cascata

Use o --cascade=falseparâmetro para indicar exclusões sem cascata:

$ 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
复制代码

tente excluir 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
复制代码

Visualização em execução no ambiente atualPod

# 当前环境运行的都是新创建的 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
复制代码

O processo mais detalhado é o seguinte:

$ 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: StatefulSetAo , o Podassociado não será deletado PersistentVolumes. Ao StatefulSetreconstruir , o recém-criado Podmontará o original PersistentVolumes.

(2) Exclusão em cascata

Omitir o --cascadeparâmetro significa exclusões em cascata:

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

Veja Podo processo de mudança

# 依然是先删除 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
复制代码

Remova manualmente o nginxserviço

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

3. PodEstratégia de gestão

Para alguns sistemas distribuídos, às vezes não é obrigatório que Poda inicialização esteja em ordem, apenas para utilizar StatefulSetos recursos de exclusividade e identidade no , você pode definir a ordem de inicialização através do spec.podManagementPolicycampo . Existem basicamente duas sequências:

  • OrderedReady: opção padrão, que significa iniciar sequencialmente
  • Parallel: pode iniciar/terminar tudo em paralelo Pod, Podao não precisa esperar o outro Poddeve iniciar/terminar primeiro
  1. criar web.yaml,podManagementPolicy: "Parallel"
---
spec:
  serviceName: "nginx"
  podManagementPolicy: "Parallel"
  replicas: 2
复制代码
  1. Monitore Podo processo de criação de , e execute a criação:
$ 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
复制代码

Acho que você gosta

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