此脚本可以实现自动给,你指定的一个名称空间下的所有 deployment 添加你指定的便签和值,并且同时给每个 deployment 下的所有 Pod 一起添加相同的标签。
已验证投产。
#!/bin/bash
# 设置命名空间
NAMESPACE="you-namespace" # 修改为你的命名空间
# 设置标签
LABEL_KEY="app.kubernetes.io/name" # 标签键
# 获取命名空间下所有的 Deployment 名称
deployments=$(kubectl get deployments -n "$NAMESPACE" -o=jsonpath='{.items[*].metadata.name}')
# 遍历每个 Deployment,添加标签
for deployment in $deployments; do
echo "为 Deployment '$deployment' 添加标签 $LABEL_KEY=$LABEL_VALUE"
kubectl label deployment "$deployment" "$LABEL_KEY"="$deployment" -n "$NAMESPACE" --overwrite
# 获取 Deployment 的 label selector
LABEL_SELECTOR=$(kubectl get deployment "$deployment" -n "$NAMESPACE" -o=jsonpath='{.spec.selector.matchLabels}')
# 检查是否成功获取到 label selector
if [ -z "$LABEL_SELECTOR" ]; then
echo "未能找到 Deployment '$DEPLOYMENT_NAME' 的 label selector"
exit 1
fi
# 将 JSON 格式的标签选择器转换为 key=value 格式
FORMATTED_SELECTOR=$(echo "$LABEL_SELECTOR" | jq -r 'to_entries | map("\(.key)=\(.value)") | join(",")')
# 获取所有符合标签选择器的 Pod 名称
echo "根据 label selector '$FORMATTED_SELECTOR' 获取 Pod 名称..."
PODS=$(kubectl get pods -n "$NAMESPACE" -l "$FORMATTED_SELECTOR" -o=jsonpath='{.items[*].metadata.name}')
# 循环所有pod 名称
for pod in $PODS
do
echo "为 Pod '$pod' 添加标签 $LABEL_KEY=$deployment"
kubectl label pod "$pod" "$LABEL_KEY"="$deployment" -n "$NAMESPACE" --overwrite
done
done
echo "所有 Deployment 和 Pod 标签添加完成!"