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
StatefulSet
Assim como no Deployment
, DaemonSet
você também pode expandir ou reduzir manualmente. Principalmente modificando os replicas
campos .
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
StatefulSet
Você pode usar o campo spec.updateStrategy.type
para 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:Pod
container images
resource requests
limits
labels
annotations
RolingUpdate
: A estratégia padrão, após a atualização doStatefulSet
modelo , o antigo é excluído automaticamentePod
e o novo é criadoPod
, e a ordem de atualização é oposta ao índice do número de sérieOnDelete
: Após atualizar umStatefulSet
modelo , umPod
novo só será criado se o antigo for excluído manualmentePod
- Use a política padrão para atualizar a imagem do contêiner, primeiro abra
Pod
um
kubectl get pods -w -l app=nginx
复制代码
Pod
A 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
复制代码
- Veja o processo
Pod
de 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
复制代码
- Observando
Pod
a 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
StatefulSet
Existem duas maneiras de excluir :
- Exclusão sem cascata:
StatefulSet
ao , oStatefulSet
criado porPod
não será excluído - Exclusão em cascata:
StatefulSet
Ao ,StatefulSet
tanto o próprio quanto o criadoPod
serão excluídos, e a ordem de exclusão é oposta ao índice ordinal
(1) Exclusão sem cascata
Use o --cascade=false
parâ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:
StatefulSet
Ao , oPod
associado não será deletadoPersistentVolumes
. AoStatefulSet
reconstruir , o recém-criadoPod
montará o originalPersistentVolumes
.
(2) Exclusão em cascata
Omitir o --cascade
parâmetro significa exclusões em cascata:
$ kubectl delete statefulset web
statefulset.apps "web" deleted
复制代码
Veja Pod
o 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 nginx
serviço
$ kubectl delete service nginx
service "nginx" deleted
复制代码
3. Pod
Estratégia de gestão
Para alguns sistemas distribuídos, às vezes não é obrigatório que Pod
a inicialização esteja em ordem, apenas para utilizar StatefulSet
os recursos de exclusividade e identidade no , você pode definir a ordem de inicialização através do spec.podManagementPolicy
campo . Existem basicamente duas sequências:
OrderedReady
: opção padrão, que significa iniciar sequencialmenteParallel
: pode iniciar/terminar tudo em paraleloPod
,Pod
ao não precisa esperar o outroPod
deve iniciar/terminar primeiro
- criar
web.yaml
,podManagementPolicy: "Parallel"
---
spec:
serviceName: "nginx"
podManagementPolicy: "Parallel"
replicas: 2
复制代码
- Monitore
Pod
o 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
复制代码