将Kubernetes部署缩减至0,并恢复到原始副本集的数量。

13
我已经编写了一个bash脚本来获取Kubernetes集群上的所有部署。 我有一个命令将所有部署的副本数缩减为零。 我面临的挑战是,我希望能够循环遍历所有部署并保存它们的名称和副本数,以便在缩减后将它们恢复到原始状态。
我该如何实现这一点? 这是我目前所做的。
$ kubectl get deployments
$ kubectl scale deploy -n default  --replicas=0 --all

5
如果你想在缩小后立即扩展,使用 kubectl rollout restart 是更好的选项。 - Henry
eberz 写了一个 回答,说:“我已经为此实现了一个 bash 脚本,请查看:https://gist.github.com/evertonberz/93ec7c445fbd13ae9e0abc585eabd2d2”。 - Scratte
3个回答

28

您可以为先前的副本状态注释资源。然后,您可以使用以下命令更改副本。

# annotate first 
kubectl get deploy -o jsonpath='{range .items[*]}{"kubectl annotate --overwrite deploy "}{@.metadata.name}{" previous-size="}{@.spec.replicas}{" \n"}{end}' | sh

# scale to 0
kubectl scale --replicas=0 $(kubectl get deploy -o name) 

## scaleback 
kubectl get deploy -o jsonpath='{range .items[*]}{"kubectl scale deploy "}{@.metadata.name}{" --replicas="}{.metadata.annotations.previous-size}{"\n"}{end}' | sh

@Emre Oodabaş 能否解释一下它是如何工作的? - Observer

2

首先获取所有部署的列表,这很重要,因为你需要在需要时将其扩展回来:

kubectl get deploy -A --no-headers | grep -v 'kube' > deploy_state_before_scale.txt

将所有非k8s系统相关的部署缩放为0:

kubectl get deploy --no-headers -A | grep -v 'kube' | awk '{print $1}' | while read  DEPLOY; do kubectl scale --replicas=0 deployment/$DEPLOY -n $DEPLOY; done

将集群缩小回之前扩展到0的状态。请确保使用在扩展到0之前创建的“deploy_state_before_scale.txt”:

awk '{print $1,$4}' deploy_state_before_scale.txt | while read DEPLOY SCALE; do kubectl scale --replicas=$SCALE deployment/$DEPLOY -n $DEPLOY; done

2
你可以把输出保存到一个bash数组中:
declare -A arr
for i in $(kubectl get deployment -o name)
do
  arr+=( [$i]="$(kubectl get $i -o=jsonpath='{.spec.replicas}')")
done

然后再次使用它进行扩展:

for key in ${!arr[@]}
do
  kubectl scale deploy $key --replicas=${arr[${key}]}
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接