我编写了一个 bash 脚本来获取 kubernetes 集群上的所有部署。 我有一个命令将所有部署扩展到零。 我面临的挑战是,我希望能够循环所有部署并保存它们的名称和副本数量,以便在缩小规模后将它们缩小到原始值。
我如何实现这一目标? 这就是我到目前为止所做的。
$ kubectl get deployments
$ kubectl scale deploy -n default --replicas=0 --all
您可以为先前的复制状态注释资源。然后您可以使用以下命令来更改副本。
# 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
您可以将输出保存到 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
首先获取所有部署的列表,这很重要,因为您需要它在需要时进行扩展:
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