1. Kubernetes脚本开发实战指南
在云原生技术栈中,Kubernetes已成为容器编排的事实标准。但很多开发者在使用kubectl命令行工具时,常常陷入重复输入相似命令的困境。本文将分享如何通过Shell和Python脚本实现Kubernetes操作的自动化,涵盖从基础运维到高级集成的完整解决方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心脚本场景解析
2.1 日常运维自动化
对于K8s集群管理员来说,以下场景特别适合脚本化:
- 批量查询Pod状态
- 定期清理Evicted状态的Pod
- 自动伸缩Deployment副本数
- 跨Namespace的资源监控
bash复制#!/bin/bash
# 批量获取所有Namespace的Pod状态
for ns in $(kubectl get ns -o jsonpath='{.items[*].metadata.name}'); do
echo "Namespace: $ns"
kubectl get pods -n $ns --field-selector=status.phase!=Running
done
2.2 CI/CD流水线集成
在持续集成环境中,脚本可以:
- 自动部署测试环境
- 执行滚动更新验证
- 收集部署指标数据
- 触发回滚机制
python复制import subprocess
import json
def deploy_to_env(manifest_path, env):
apply_cmd = f"kubectl apply -f {manifest_path} --context={env}"
result = subprocess.run(apply_cmd.split(), capture_output=True)
if result.returncode != 0:
send_alert(f"Deploy failed to {env}")
rollback_last_deploy(env)
3. Shell脚本开发详解
3.1 基础语法要点
开发K8s脚本需要掌握:
- 命令替换:
$(kubectl get pods) - JSONPath过滤:
-o jsonpath='{.items[*].metadata.name}' - 退出码处理:
if [ $? -ne 0 ]; then - 并发控制:
xargs -P
重要提示:所有kubectl命令都应设置--request-timeout参数,避免脚本挂起
3.2 实用脚本示例
资源监控脚本:
bash复制#!/bin/bash
WARNING_THRESHOLD=80
CRITICAL_THRESHOLD=90
check_cpu_usage() {
kubectl top pods --all-namespaces | awk 'NR>1 {
if ($3 > CRITICAL_THRESHOLD) system("kubectl describe pod " $2 " -n " $1)
}' CRITICAL_THRESHOLD=$CRITICAL_THRESHOLD
}
4. Python脚本高级应用
4.1 官方客户端库使用
python复制from kubernetes import client, config
config.load_kube_config()
v1 = client.CoreV1Api()
def list_pods(namespace):
pods = v1.list_namespaced_pod(namespace)
return [p.metadata.name for p in pods.items]
4.2 自定义Operator开发
通过Python可以:
- 监听K8s事件
- 实现自定义调度逻辑
- 扩展CRD控制器
- 集成监控告警
python复制from kubernetes.client.rest import ApiException
from kubernetes.watch import Watch
def pod_event_watcher():
w = Watch()
for event in w.stream(v1.list_pod_for_all_namespaces):
print(f"Event: {event['type']} Pod: {event['object'].metadata.name}")
5. 安全与最佳实践
5.1 权限控制方案
- 使用最小权限ServiceAccount
- 配置RBAC规则
- 敏感信息使用Secret
- 审计日志记录
bash复制# 创建受限权限的ServiceAccount
kubectl create sa script-runner
kubectl create role pod-reader --verb=get,list --resource=pods
kubectl create rolebinding script-pod-reader --role=pod-reader --serviceaccount=default:script-runner
5.2 错误处理模式
- 重试机制(指数退避)
- 超时控制
- 熔断设计
- 优雅降级
python复制from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
def safe_k8s_call():
try:
return v1.list_pod_for_all_namespaces()
except ApiException as e:
if e.status == 403:
raise PermissionError("Insufficient permissions")
raise
6. 调试与性能优化
6.1 脚本调试技巧
- 使用
set -x开启调试模式 - 保存临时manifest文件
- 模拟运行(--dry-run=client)
- 性能分析工具
bash复制#!/bin/bash
set -eo pipefail
# 调试模式示例
PS4='+${BASH_SOURCE}:${LINENO}: ' set -x
kubectl apply -f deployment.yaml --dry-run=client -o yaml > debug.yaml
6.2 大规模集群优化
当处理大量资源时:
- 增加--chunk-size参数
- 使用label选择器过滤
- 并行处理(GNU parallel)
- 缓存机制
python复制from concurrent.futures import ThreadPoolExecutor
def batch_process_pods(pod_names):
with ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(process_pod, name) for name in pod_names]
for future in as_completed(futures):
handle_result(future.result())
7. 实用脚本仓库
7.1 常用功能脚本
- 自动证书续期
- 节点维护模式切换
- 镜像版本批量更新
- 配置热加载
bash复制# 批量更新Deployment镜像版本
kubectl get deploy -o name | xargs -I {} kubectl set image {} \
my-container=my-repo/my-image:new-version
7.2 监控告警脚本
- 资源阈值检测
- 异常Pod重启
- 调度失败告警
- 存储容量预警
python复制def check_pending_pods():
field_selector = "status.phase=Pending"
pending_pods = v1.list_pod_for_all_namespaces(field_selector=field_selector)
for pod in pending_pods.items:
for condition in pod.status.conditions:
if condition.reason == "Unschedulable":
notify_slack(f"Unschedulable pod: {pod.metadata.name}")
8. 版本控制与协作
8.1 Git集成模式
- 脚本与manifest同仓库管理
- 预提交钩子检查
- 变更审计追踪
- 版本化脚本库
bash复制#!/bin/bash
# pre-commit hook示例
kubectl kustomize ./overlays/prod | kubectl apply --dry-run=server -f -
if [ $? -ne 0 ]; then
echo "Kustomize validation failed"
exit 1
fi
8.2 团队协作规范
- 统一脚本模板
- 文档自动生成
- 参数校验标准
- 测试用例要求
python复制def validate_k8s_yaml(filepath):
"""使用kubeval验证YAML文件"""
try:
subprocess.run(["kubeval", filepath], check=True)
except subprocess.CalledProcessError:
logging.error(f"Invalid K8s YAML: {filepath}")
raise
在实际生产环境中,我发现将复杂运维操作脚本化后,不仅减少了人为错误,还能通过版本控制追踪所有变更。特别是在处理大规模集群时,合理的脚本设计可以节省90%以上的重复操作时间。建议从简单的日常任务开始,逐步构建自己的K8s脚本工具库。
