时间:2025-09-18 18:11
人气:
作者:admin
在日常Kubernetes运维中,资源更新是常见操作。虽然kubectl apply和kubectl edit都有其用途,但它们存在明显局限:
相比之下,kubectl patch命令提供了精准的局部更新能力,只需指定变更部分,极大提升了运维效率和自动化可能性。
Kubernetes特有的智能补丁机制,基于字段的patchStrategy和patchMergeKey标签实现智能合并。
实战示例:向Deployment动态添加容器
# 创建基础Deployment
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: patch-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:1.19
ports:
- containerPort: 80
EOF
# 使用patch添加Redis容器
kubectl patch deployment patch-demo --patch '{
"spec": {
"template": {
"spec": {
"containers": [
{
"name": "redis-container",
"image": "redis:6.0",
"ports": [
{"containerPort": 6379}
]
}
]
}
}
}
}'
智能合并机制解析:
containers、initContainers等数组字段,Kubernetes使用name作为合并键遵循RFC 7386标准,行为直观:
null表示删除)实战示例:灵活调整资源配置
# 调整副本数量
kubectl patch deployment --type merge patch-demo --patch '{
"spec": {
"replicas": 5
}
}'
# 更新资源限制
kubectl patch deployment --type merge patch-demo --patch '{
"spec": {
"template": {
"spec": {
"containers": [{
"name": "nginx-container",
"resources": {
"requests": {"cpu": "200m", "memory": "256Mi"},
"limits": {"cpu": "500m", "memory": "512Mi"}
}
}]
}
}
}
}'
重要限制:JSON Merge Patch会整体替换数组,不适合精细操作容器列表等数组字段。
遵循RFC 6902标准,通过明确的操作指令实现精确控制:
六种操作类型:
add:添加字段或数组元素remove:删除字段或数组元素replace:替换字段值move:移动字段值copy:复制字段值test:验证字段值(条件执行)实战示例:精确的字段级操作
# 精确更新特定字段
kubectl patch deployment --type json patch-demo --patch '[
{
"op": "replace",
"path": "/spec/replicas",
"value": 3
},
{
"op": "replace",
"path": "/spec/template/spec/containers/0/image",
"value": "nginx:1.21"
}
]'
# 删除特定注解
kubectl patch deployment --type json patch-demo --patch '[{
"op": "remove",
"path": "/metadata/annotations/old-annotation"
}]'
| 特性 | Strategic Merge Patch | JSON Merge Patch | JSON Patch |
|---|---|---|---|
| 数组处理 | ⭐⭐⭐ 智能合并(按key) | ⭐ 整体替换 | ⭐⭐⭐ 精确操作(按索引) |
| 资源兼容 | ⭐⭐ K8s原生资源 | ⭐⭐⭐ 任意JSON资源 | ⭐⭐⭐ 任意JSON资源 |
| 操作精度 | ⭐⭐ 中等 | ⭐ 较低 | ⭐⭐⭐ 极高 |
| 学习成本 | ⭐⭐⭐ 低 | ⭐⭐⭐ 低 | ⭐ 较高 |
| 自动化友好 | ⭐⭐⭐ 优秀 | ⭐⭐ 良好 | ⭐⭐ 良好 |
选型建议:
对于复杂变更,使用独立的patch文件:
# deployment-patch.yaml
spec:
template:
spec:
containers:
- name: nginx-container
image: nginx:1.21.3
resources:
requests:
cpu: 300m
memory: 512Mi
limits:
cpu: 800m
memory: 1Gi
kubectl patch deployment patch-demo --patch-file deployment-patch.yaml
执行前充分验证变更:
# 预览变更效果
kubectl patch deployment patch-demo \
--patch '{"spec":{"replicas":5}}' \
--dry-run=client -o yaml
# 结合kubectl diff(需安装diff插件)
kubectl diff -f deployment-patch.yaml
某些字段需要特殊处理策略:
# 更新Deployment策略类型
kubectl patch deployment patch-demo --patch '{
"spec": {
"strategy": {
"$retainKeys": ["type", "rollingUpdate"],
"type": "RollingUpdate",
"rollingUpdate": {
"maxSurge": "25%",
"maxUnavailable": "25%"
}
}
}
}'
# 批量更新所有匹配的Deployment
kubectl get deployments -l app=webapp -o name | \
xargs -I {} kubectl patch {} --patch '{
"spec": {
"template": {
"metadata": {
"labels": {
"updated": "'$(date +%s)'"
}
}
}
}
}'
# 在CI/CD流水线中使用
kubectl patch deployment $APP_NAME --type json --patch '[{
"op": "replace",
"path": "/spec/template/spec/containers/0/image",
"value": "'${NEW_IMAGE}'"
}]'
# 精确更新镜像版本
kubectl patch deployment my-app --type json --patch '[{
"op": "replace",
"path": "/spec/template/spec/containers/0/image",
"value": "my-registry/app:v2.1.0"
}]'
# 多容器应用选择性更新
kubectl patch deployment multi-container-app --type json --patch '[
{
"op": "replace",
"path": "/spec/template/spec/containers/0/image",
"value": "nginx:1.21"
},
{
"op": "replace",
"path": "/spec/template/spec/containers/1/image",
"value": "redis:6.2"
}
]'
# 根据负载调整资源配额
kubectl patch deployment my-app --patch '{
"spec": {
"template": {
"spec": {
"containers": [{
"name": "app",
"resources": {
"requests": {
"cpu": "500m",
"memory": "1Gi"
},
"limits": {
"cpu": "2",
"memory": "4Gi"
}
}
}]
}
}
}
}'
# 调整HPA相关注解
kubectl patch deployment my-app --type json --patch '[{
"op": "add",
"path": "/metadata/annotations/autoscaling.alpha.kubernetes.io~1metrics",
"value": "[{\"type\":\"Resource\",\"resource\":{\"name\":\"cpu\",\"targetAverageUtilization\":70}}]"
}]'
# 添加业务标签
kubectl patch deployment my-app --type json --patch '[{
"op": "add",
"path": "/metadata/labels/environment",
"value": "production"
}, {
"op": "add",
"path": "/metadata/labels/team",
"value": "platform-engineering"
}]'
# 更新监控注解
kubectl patch deployment my-app --type json --patch '[{
"op": "replace",
"path": "/metadata/annotations/prometheus.io~1port",
"value": "8080"
}, {
"op": "replace",
"path": "/metadata/annotations/prometheus.io~1path",
"value": "/metrics"
}]'
# 仅当当前副本数为3时才执行更新
current_replicas=$(kubectl get deployment patch-demo -o jsonpath='{.spec.replicas}')
if [ "$current_replicas" -eq 3 ]; then
kubectl patch deployment patch-demo --patch '{"spec":{"replicas":5}}'
fi
# 带错误处理和重试的patch操作
max_retries=3
retry_count=0
while [ $retry_count -lt $max_retries ]; do
if kubectl patch deployment patch-demo --patch '...'; then
echo "Patch successful"
break
else
((retry_count++))
echo "Patch failed, retrying... ($retry_count/$max_retries)"
sleep 5
fi
done
# 合并多个操作为单个API调用
kubectl patch deployment patch-demo --type json --patch '[
{
"op": "replace",
"path": "/spec/replicas",
"value": 4
},
{
"op": "replace",
"path": "/spec/template/spec/containers/0/image",
"value": "nginx:latest"
},
{
"op": "add",
"path": "/metadata/annotations/deployed-at",
"value": "'$(date -Iseconds)'"
}
]'
kubectl patch是Kubernetes运维中不可或缺的精准操作工具,其核心价值在于:
最佳实践总结:
掌握kubectl patch的高级用法,将显著提升你的Kubernetes运维效能,实现真正意义上的"基础设施即代码"的精准管理。
本文来自博客园,作者:dashery,转载请注明原文链接:https://www.cnblogs.com/ydswin/p/19099353
Ubuntu离线环境部署Kubernetes v1.31.3(ARM64)