kubectl 是 Kubernetes 集群管理的瑞士军刀,这个命令行工具是与 API Server 交互的主要入口。它就像交响乐团的指挥棒,将用户指令转化为对集群资源的精确操作。我常跟团队新人说:"掌握 kubectl,就掌握了 Kubernetes 运维的主动权。"
在实际生产环境中,kubectl 的使用频率远超 Dashboard 等图形化工具。根据 CNCF 2023 年调查报告,87% 的 Kubernetes 用户日常操作首选 kubectl。这主要得益于其:
创建/更新资源的三种典型方式:
bash复制# 声明式应用(推荐)
kubectl apply -f deployment.yaml
# 命令式创建
kubectl create deployment nginx --image=nginx:1.23
# 命令式更新(慎用)
kubectl edit deployment/nginx
关键区别:
apply 采用声明式管理,记录 last-applied-configuration 注解create 是纯命令式操作,不适合后续更新edit 直接修改实时配置,可能造成配置漂移生产环境建议:始终使用
apply配合版本控制的 YAML 文件,这是 GitOps 实践的基础。
基础查询命令:
bash复制kubectl get pods -n kube-system
进阶查询组合:
bash复制# 带自定义列输出
kubectl get pods -o custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName
# JSONPath 过滤
kubectl get pods -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.podIP}{"\n"}{end}'
# 跨命名空间筛选
kubectl get pods --all-namespaces --field-selector=status.phase=Running
性能注意:在超过 1000 个节点的集群中,避免频繁使用 --all-namespaces,建议配合 --chunk-size 参数分块获取。
排错黄金命令组合:
bash复制# 查看事件流(按时间排序)
kubectl get events --sort-by=.metadata.creationTimestamp
# 实时日志跟踪
kubectl logs -f pod/nginx-7cdbd8cdc9-zwxr5 --tail=50
# 进入容器诊断
kubectl exec -it pod/nginx -- /bin/sh
# 端口转发调试
kubectl port-forward svc/nginx-service 8080:80
诊断技巧:
kubectl describe pod 中的 LastState--previous 参数获取崩溃前的容器日志kubectl logs --since=5m 限定时间范围通过 krew 扩展 kubectl 能力:
bash复制# 安装 krew
(
set -x; cd "$(mktemp -d)" &&
OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
KREW="krew-${OS}_${ARCH}" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
tar zxvf "${KREW}.tar.gz" &&
./"${KREW}" install krew
)
# 安装常用插件
kubectl krew install access-matrix ctx ns tail
推荐插件:
neat:清理 YAML 中的默认字段view-allocations:查看资源分配情况doctor:集群健康检查企业级安全实践:
bash复制# 创建受限的 kubeconfig
kubectl config set-credentials dev-user \
--client-certificate=dev.crt \
--client-key=dev.key \
--embed-certs=true
# 启用审计日志
kubectl create -f - <<EOF
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: ""
resources: ["secrets"]
EOF
安全要点:
--audit-policy-file大规模集群优化配置:
bash复制# 调整 API 查询限制
kubectl get pods --chunk-size=500
# 启用缓存
export KUBECACHEDIR="$HOME/.kube/cache"
kubectl get pods --cache
# 并行处理示例
for ns in $(kubectl get ns -o name | cut -d/ -f2); do
kubectl get pods -n $ns &
done
wait
性能数据:
kubectl get pods -A 在 5000 节点集群可能消耗 2GB 内存--server-print=false 可减少 40% 的响应时间bash复制# 检查证书过期时间
openssl x509 -noout -dates -in ~/.kube/config
# 验证 API 连通性
kubectl --v=8 get nodes 2>&1 | grep -A5 "Response Status"
# 重置认证缓存
kubectl config view --raw > new_config && mv new_config ~/.kube/config
常见证书错误:
x509: certificate has expired or is not yet valid → 时钟不同步x509: certificate signed by unknown authority → CA 证书缺失Unable to connect to the server: net/http: TLS handshake timeout → 网络策略拦截Pod 卡在 Pending 状态检查清单:
bash复制kubectl describe pod | grep -A5 "Requests"
bash复制kubectl describe nodes | grep -A10 "Allocatable"
bash复制kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
bash复制kubectl get events --field-selector=involvedObject.kind=Pod,reason=FailedScheduling
Service 不可访问排查步骤:
bash复制# 验证 Endpoints 是否正常
kubectl get endpoints my-service
# 检查 kube-proxy 日志
kubectl logs -l k8s-app=kube-proxy -n kube-system
# 测试 ClusterIP 连通性
kubectl run -it --rm test-pod --image=alpine -- sh
apk add curl
curl -v http://<cluster-ip>:<port>
典型网络问题:
推荐的项目目录结构:
code复制k8s/
├── base/ # 基础配置
│ ├── kustomization.yaml
│ └── deployment.yaml
├── overlays/
│ ├── dev/
│ │ ├── kustomization.yaml
│ │ └── patch.yaml
│ └── prod/
│ ├── kustomization.yaml
│ └── patch.yaml
└── scripts/ # 部署脚本
└── deploy.sh
版本控制策略:
apply never edit)kubectl diff -f ./ 预览变更CI/CD 集成示例:
bash复制# 蓝绿部署切换
kubectl apply -f new-deployment.yaml
kubectl rollout status deployment/new-version
kubectl patch svc/my-app -p '{"spec":{"selector":{"version":"new"}}}'
# 金丝雀发布策略
kubectl set image deployment/my-app app=my-image:v2 --record
kubectl rollout pause deployment/my-app
kubectl rollout resume deployment/my-app
发布检查清单:
kubectl rollout historyprogressDeadlineSecondspreStop 钩子实现优雅终止使用 kubectx 切换上下文:
bash复制# 列出所有上下文
kubectl config get-contexts
# 快速切换
kubectl ctx prod-cluster
# 跨集群操作
kubectl --context=dev-cluster get pods
企业级多集群架构建议:
team-a-prod)