kubectl 是 Kubernetes 的 CLI 工具,堪称管理 K8s 集群的“瑞士军刀”。然而,对于初学者甚至有一定经验的用户来说,kubectl 官方提供的命令列表虽然功能完备,却并不总是易于理解和记忆。官方将命令分为“声明式资源管理”、“命令式资源管理”、“打印工作负载状态”、“与容器交互”、“集群管理”等类别。这种组织方式从技术实现角度出发,但忽略了用户实际使用 Kubernetes 时的操作流程和认知习惯。
本文提出一种以用户操作流程为核心的 kubectl 命令分类方法,旨在帮助开发者更自然地理解、学习和使用 kubectl。
1. 查看与诊断:先了解集群状态
在进行任何操作之前,我们通常希望先了解当前集群的状态。这一阶段的核心是“观察”。
kubectl version:查看客户端和服务端的版本信息。kubectl cluster-info:显示集群的概要信息,包括 API Server 和 CoreDNS 的地址。kubectl config view:查看当前 kubeconfig 的配置内容。kubectl get nodes:列出集群中所有节点及其状态。kubectl get <resource>:获取各类资源的信息,如 Pod、Service、Deployment 等。常用参数包括-n指定命名空间、-o wide显示更多信息、-o yaml/json输出为 YAML 或 JSON 格式。kubectl describe <resource> <name>:显示指定资源的详细信息,是排查问题的利器。kubectl logs <pod>:查看 Pod 中容器的日志;加上-f参数可实时跟踪日志。kubectl top node/pod:实时查看节点或 Pod 的 CPU 和内存使用情况。kubectl get events:查看集群事件,按时间排序可快速定位问题。kubectl api-resources:查看集群支持的所有 API 资源类型及其简写。kubectl api-versions:查看集群支持的 API 版本。
这些命令构成了我们对 Kubernetes 集群的“感知层”,是后续操作的基础。
2. 获取与准备资源:从配置到就绪
Kubernetes 的核心是声明式管理,资源定义通常存放在 YAML 或 JSON 配置文件中。
kubectl explain <resource>:查看资源的字段说明和文档,是编写 YAML 时的最佳帮手。kubectl create -f <file>:根据配置文件创建资源。kubectl apply -f <file>:声明式地创建或更新资源,是生产环境管理的首选方式。kubectl diff -f <file>:预览当前配置与目标配置之间的差异,相当于“变更前的检查”。
apply是管理 Kubernetes 集群中资源的首选机制。与 Docker 的docker pull从仓库拉取镜像不同,Kubernetes 的“获取资源”更多是指准备好资源定义文件,为部署做准备。
3. 部署与运行应用:让工作负载“活”起来
有了资源定义之后,下一步是将其部署到集群中,让应用真正运行起来。
创建与部署
kubectl run <name> --image=<image>:快速创建并运行一个 Pod。主要用于开发测试环境。kubectl create deployment <name> --image=<image>:创建 Deployment 来管理应用副本。kubectl expose <resource>:将 Deployment、Pod 等资源暴露为 Service。
更新与扩缩容
kubectl scale deployment <name> --replicas=<n>:动态调整副本数量,实现扩缩容。kubectl autoscale deployment <name> --min=<n> --max=<n> --cpu-percent=<p>:创建 Horizontal Pod Autoscaler,实现自动扩缩容。kubectl set image deployment/<name> <container>=<new-image>:更新 Deployment 中容器的镜像版本。kubectl edit <resource> <name>:直接在编辑器中修改线上资源。
停止与清理
kubectl delete <resource> <name>:删除指定资源。kubectl delete -f <file>:删除配置文件中定义的所有资源。
值得注意的是,kubectl run和kubectl create这类命令式操作带有明显的命令行风味,表达力有限,官方建议仅用于开发环境;生产环境应优先使用声明式的apply方式。
4. 管理应用生命周期:滚动更新与回滚
应用上线后,还需要持续管理其更新过程。
kubectl rollout status deployment/<name>:查看滚动更新的状态。kubectl rollout history deployment/<name>:查看部署历史记录。kubectl rollout undo deployment/<name>:回滚到上一个版本。kubectl rollout restart deployment/<name>:重启 Deployment 下的所有 Pod。
这些命令构成了 Kubernetes 应用发布的“控制层”,让版本变更变得可控和可追溯。
5. 调试与故障排查:深入容器内部
当应用出现问题时,需要进入容器内部或与容器进行交互。
kubectl exec -it <pod> -- <command>:在运行中的 Pod 容器内执行命令,常用于进入 shell 调试。kubectl attach <pod>:连接到正在运行的容器。kubectl port-forward <pod> <local-port>:<pod-port>:将本地端口转发到 Pod 端口,便于本地调试。kubectl cp <pod>:<path> <local>:从 Pod 复制文件到本地。kubectl cp <local> <pod>:<path>:将本地文件复制到 Pod 中。kubectl debug <pod>:启动一个调试容器并附加到指定 Pod 上。
kubectl 通过提供这些命令,支持打印容器日志、打印集群事件、执行或挂接到容器、从容器复制文件等调试功能。
6. 网络与存储管理:服务的连接与数据持久化
Kubernetes 中的网络和服务发现、存储管理是应用运行的关键支撑。
服务与网络
kubectl get svc:查看所有 Service。kubectl describe svc <name>:查看 Service 的详细信息。kubectl get ingress:查看 Ingress 规则。kubectl port-forward svc/<name> <local-port>:<service-port>:将本地端口转发到 Service。
配置与存储
kubectl get configmap:查看 ConfigMap。kubectl describe configmap <name>:查看 ConfigMap 详情。kubectl create configmap <name> --from-literal=<key>=<value>:创建 ConfigMap。kubectl get secret:查看 Secret。kubectl describe secret <name>:查看 Secret 详情。kubectl get pv/pvc:查看持久卷和持久卷声明。
7. 多资源与命名空间管理:组织与隔离
Kubernetes 通过命名空间实现资源隔离,通过标签实现灵活的资源筛选。
kubectl get ns:查看所有命名空间。kubectl create ns <name>:创建命名空间。kubectl delete ns <name>:删除命名空间。kubectl config set-context --current --namespace=<ns>:切换当前上下文中的默认命名空间。kubectl get <resource> --all-namespaces:查看所有命名空间下的指定资源。kubectl label <resource> <name> <key>=<value>:为资源添加或修改标签。kubectl annotate <resource> <name> <key>=<value>:为资源添加或修改注解。kubectl get <resource> -l <key>=<value>:按标签筛选资源。
8. 集群与节点管理:管理员视角
从集群运维角度,还有一些关键的管理命令。
kubectl cordon <node>:将节点标记为不可调度,新 Pod 不会再调度到该节点。kubectl drain <node>:将节点上的 Pod 驱逐到其他节点,便于节点维护。kubectl uncordon <node>:恢复节点的可调度状态。kubectl taint nodes <node> <key>=<value>:<effect>:为节点添加污点,控制 Pod 的调度策略。kubectl top node:查看节点的资源使用情况。kubectl get nodes -o wide:查看节点的详细信息,包括内外部 IP、操作系统等。
结语
Kubernetes 官方的命令分类方式侧重于技术模块划分(声明式/命令式/集群管理等),而本文提出的分类方法则以用户的实际操作流程为主线:从观察集群、准备资源定义、部署应用,到管理生命周期、调试排查、管理网络存储,最终扩展到命名空间组织和集群运维。
这种结构更贴近人类的认知逻辑,有助于降低学习曲线,提升使用效率。无论你是刚开始接触 Kubernetes 的新手,还是正在编写团队内部文档,采用这种“以用户为中心”的命令组织方式,都能带来更好的体验和更高的生产力。
值得一提的是,kubectl的命令行帮助本身就非常出色,不仅有功能说明和分类,还有难度标识,每个命令都可以用--help查看进一步的帮助说明——这本身就是学习 kubectl 最好的起点。
希望这一思路能为你理解和使用 kubectl 提供新的视角。