Kubernetes(K8s)常用命令全解析:从基础到进阶
Kubernetes(K8s)常用命令全解析:从基础到进阶
引言:为什么掌握K8s命令是云原生时代的必备技能?
Kubernetes(简称K8s)作为容器编排的事实标准,已成为云原生应用部署、扩展和管理的核心平台。其命令行工具kubectl
是与集群交互的主要入口,掌握其常用命令不仅能提高日常运维效率,更能深入理解K8s的资源模型(如声明式API、控制器模式)和调度逻辑。
本文将系统梳理kubectl
命令,按资源管理、集群运维、部署与伸缩、故障排查、高级操作五大维度分类,涵盖高频使用、易混淆及进阶命令,补充场景化示例与注意事项。
目录
- Kubernetes(K8s)常用命令全解析:从基础到进阶
- 引言:为什么掌握K8s命令是云原生时代的必备技能?
- 一、资源管理基础命令
- 1.1 资源查看(`kubectl get`)
- 1.2 资源创建(`kubectl create`与`kubectl apply`)
- 1.3 资源删除(`kubectl delete`)
- 1.4 资源详情查看(`kubectl describe`)
- 1.5 配置资源修改(`kubectl edit`)
- 二、集群管理命令
- 2.1 集群信息查看
- 2.2 节点管理
- 2.3 命名空间管理
- 三、部署与伸缩命令
- 3.1 Deployment管理
- 3.2 自动伸缩(HPA)
- 3.3 StatefulSet与DaemonSet
- 四、故障排查命令
- 4.1 Pod诊断
- 4.2 网络诊断
- 4.3 存储诊断
- 五、高级操作命令
- 5.1 标签与注解管理
- 5.2 配置与密钥管理(ConfigMap/Secret)
- 5.3 权限管理(RBAC)
- 5.4 作业与定时任务
- 六、易错点与最佳实践
- 总结
一、资源管理基础命令
1.1 资源查看(kubectl get
)
最常用的命令之一,用于查询集群中各类资源的状态,支持多种输出格式和过滤条件。
命令 | 作用 | 示例 | 补充说明 |
---|---|---|---|
kubectl get pods | 查看当前命名空间的所有Pod | kubectl get pods (简写成po ) | 输出包含名称、就绪数、状态、重启次数、年龄 |
kubectl get pods -n <namespace> | 查看指定命名空间的Pod | kubectl get po -n kube-system | -n 指定命名空间,如kube-system 是系统组件所在命名空间 |
kubectl get pods --all-namespaces | 查看所有命名空间的Pod | kubectl get po -A (-A 是简写) | 适合全局排查跨命名空间问题 |
kubectl get pods -o wide | 查看Pod的详细信息 | kubectl get po -o wide | 额外显示Pod的IP、所在节点、镜像等 |
kubectl get pods -l <label> | 按标签过滤Pod | kubectl get po -l app=nginx | 标签是K8s资源关联的核心,如Service通过标签关联Pod |
kubectl get deployments | 查看Deployment | kubectl get deploy (简写deploy ) | Deployment是无状态应用的主要控制器 |
kubectl get services | 查看Service | kubectl get svc (简写svc ) | 输出包含ClusterIP、端口映射等网络信息 |
kubectl get nodes | 查看集群节点 | kubectl get no (简写no ) | 显示节点状态(Ready/NotReady)、角色、版本等 |
kubectl get namespaces | 查看命名空间 | kubectl get ns (简写ns ) | 命名空间用于资源隔离,默认有default 、kube-system 等 |
kubectl get <resource> -o yaml/json | 以YAML/JSON格式输出资源详情 | kubectl get pod nginx -o yaml | 用于查看资源的完整配置(如标签、注解、调度策略等) |
1.2 资源创建(kubectl create
与kubectl apply
)
用于创建或更新集群资源,两者的核心区别在于:create
是"命令式创建"(已存在则报错),apply
是"声明式更新"(存在则更新,不存在则创建)。
命令 | 作用 | 示例 | 适用场景 |
---|---|---|---|
kubectl create -f <file> | 通过配置文件创建资源 | kubectl create -f nginx-deploy.yaml | 仅用于新资源创建,重复执行会报错 |
kubectl create <resource> <name> | 直接创建资源(简单场景) | kubectl create deployment nginx --image=nginx:1.23 | 快速创建测试资源,不适合复杂配置 |
kubectl apply -f <file> | 通过配置文件创建或更新资源 | kubectl apply -f nginx-deploy.yaml | 生产环境推荐,支持增量更新(仅修改配置文件中变化的字段) |
kubectl apply -f <dir> | 批量处理目录下的所有配置文件 | kubectl apply -f ./k8s-configs | 适合多资源协同部署(如Deployment+Service+ConfigMap) |
1.3 资源删除(kubectl delete
)
用于删除集群中的资源,支持按名称、标签、配置文件等方式删除。
命令 | 作用 | 示例 | 注意事项 |
---|---|---|---|
kubectl delete <resource> <name> | 删除指定名称的资源 | kubectl delete pod nginx-7f9f6f5c9d-2xqkf | 仅删除单个资源,需准确指定名称 |
kubectl delete <resource> -l <label> | 按标签删除资源 | kubectl delete deploy -l app=nginx | 批量删除同一标签的资源,适合清理测试环境 |
kubectl delete -f <file> | 删除配置文件定义的资源 | kubectl delete -f nginx-deploy.yaml | 与apply -f 对应,确保资源完整删除 |
kubectl delete <resource> --all | 删除当前命名空间的所有该类型资源 | kubectl delete pods --all | 谨慎使用,可能误删重要资源 |
kubectl delete pod <name> --grace-period=0 --force | 强制删除Pod | kubectl delete pod nginx --grace-period=0 --force | 仅用于异常卡住的Pod(如状态为Terminating但无法退出),可能导致数据不一致 |
1.4 资源详情查看(kubectl describe
)
用于查看资源的详细状态(如事件、关联资源、配置细节等),是故障排查的核心命令。
命令 | 作用 | 示例 | 关键输出解读 |
---|---|---|---|
kubectl describe <resource> <name> | 查看指定资源的详细信息 | kubectl describe pod nginx | 重点关注Events 部分(如调度失败、镜像拉取错误原因) |
kubectl describe node <node-name> | 查看节点详情 | kubectl describe node node-1 | 关注Conditions (节点健康状态)、Allocatable (可分配资源)、Taints (污点,影响调度) |
kubectl describe svc <service-name> | 查看Service详情 | kubectl describe svc nginx-svc | 关注Endpoints (后端Pod的IP:Port,为空则说明Pod未匹配标签) |
1.5 配置资源修改(kubectl edit
)
用于在线编辑集群中已存在的资源配置(等效于修改YAML后apply
)。
kubectl edit deployment nginx # 编辑Deployment配置(自动打开默认编辑器)
kubectl edit svc nginx-svc -n dev # 编辑指定命名空间的Service
注意:编辑后需确保语法正确(如YAML缩进),保存后配置会自动生效(触发滚动更新等操作)。
二、集群管理命令
2.1 集群信息查看
用于了解集群的基本状态、版本及节点信息。
命令 | 作用 | 示例 | 输出解读 |
---|---|---|---|
kubectl cluster-info | 查看集群核心组件地址 | kubectl cluster-info | 显示API Server、ETCD、CoreDNS等组件的访问地址,若某组件未就绪会提示错误 |
kubectl cluster-info dump | 导出集群详细信息 | kubectl cluster-info dump > cluster-dump.log | 包含所有资源配置、事件、日志片段,用于离线诊断 |
kubectl version | 查看版本信息 | kubectl version --short | 显示客户端(kubectl)和服务端(API Server)版本,需确保版本兼容(客户端与服务端版本差不超过1个大版本) |
kubectl api-versions | 查看支持的API版本 | kubectl api-versions | 如apps/v1 (Deployment所在API组)、v1 (Pod、Service所在API组),不同资源可能属于不同API组 |
kubectl api-resources | 查看支持的资源类型 | kubectl api-resources | 包含资源名称、简写、API组、命名空间范围(是否集群级)等,如pods 是命名空间级,nodes 是集群级 |
2.2 节点管理
用于节点的调度控制(如维护时标记不可调度)。
命令 | 作用 | 示例 | 场景说明 |
---|---|---|---|
kubectl cordon <node-name> | 标记节点为"不可调度" | kubectl cordon node-1 | 阻止新Pod调度到该节点,但不影响已运行的Pod(用于临时维护) |
kubectl uncordon <node-name> | 解除"不可调度"标记 | kubectl uncordon node-1 | 允许新Pod调度到该节点 |
kubectl drain <node-name> --ignore-daemonsets | 排空节点(驱逐所有Pod) | kubectl drain node-1 --ignore-daemonsets | 用于节点下线维护,--ignore-daemonsets 跳过DaemonSet管理的Pod(DaemonSet要求所有节点运行) |
kubectl top node | 查看节点资源使用情况 | kubectl top node | 需部署metrics-server,显示CPU/内存使用率,用于识别节点过载 |
2.3 命名空间管理
命名空间用于隔离集群资源(如开发、测试、生产环境分离)。
命令 | 作用 | 示例 | 注意事项 |
---|---|---|---|
kubectl create namespace <name> | 创建命名空间 | kubectl create ns dev | 命名空间名称需符合DNS-1123规范(小写字母、数字、-) |
kubectl delete namespace <name> | 删除命名空间 | kubectl delete ns dev | 会递归删除命名空间内所有资源,操作不可逆 |
kubectl config set-context --current --namespace=<name> | 切换默认命名空间 | kubectl config set-context --current --namespace=dev | 避免每次命令加-n <namespace> ,通过kubectl config view 查看当前上下文 |
三、部署与伸缩命令
3.1 Deployment管理
Deployment是最常用的无状态应用部署控制器,支持滚动更新、回滚等功能。
命令 | 作用 | 示例 | 核心逻辑 |
---|---|---|---|
kubectl create deployment <name> --image=<image> | 创建Deployment | kubectl create deployment nginx --image=nginx:1.23 | 自动创建ReplicaSet和Pod,默认1个副本 |
kubectl scale deployment <name> --replicas=<num> | 调整副本数 | kubectl scale deploy nginx --replicas=3 | 扩缩容时通过ReplicaSet控制Pod数量,确保服务不中断 |
kubectl rollout status deployment <name> | 查看滚动更新状态 | kubectl rollout status deploy nginx | 显示更新进度(如"3 out of 3 new replicas have been updated") |
kubectl rollout history deployment <name> | 查看更新历史 | kubectl rollout history deploy nginx | 每个版本(revision)对应一次配置变更,包含变更时间、原因 |
kubectl rollout undo deployment <name> --to-revision=<num> | 回滚到指定版本 | kubectl rollout undo deploy nginx --to-revision=2 | 回滚会创建新ReplicaSet,逐步替换旧Pod,确保零 downtime |
3.2 自动伸缩(HPA)
Horizontal Pod Autoscaler(HPA)可根据CPU使用率、自定义指标自动调整副本数。
命令 | 作用 | 示例 | 配置说明 |
---|---|---|---|
kubectl autoscale deployment <name> --min=<min> --max=<max> --cpu-percent=<percent> | 创建HPA | kubectl autoscale deploy nginx --min=2 --max=5 --cpu-percent=80 | 当平均CPU使用率超过80%时扩容(最多5副本),低于阈值时缩容(最少2副本) |
kubectl get hpa | 查看HPA状态 | kubectl get hpa | 显示当前副本数、目标指标(如targets: 50%/80% )、最小/最大副本数 |
注意:HPA依赖metrics-server收集指标,需先部署(kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
)。
3.3 StatefulSet与DaemonSet
-
StatefulSet:用于部署有状态应用(如数据库、分布式系统),提供稳定的网络标识(固定域名)和存储(PVC模板)。
kubectl get statefulsets # 查看StatefulSet(简写sts) kubectl scale statefulset <name> --replicas=<num> # 调整副本数(需确保存储可用)
-
DaemonSet:确保所有(或指定)节点运行相同的Pod(如日志收集器、监控代理、网络插件)。
kubectl get daemonsets # 查看DaemonSet(简写ds) kubectl describe ds <name> # 查看调度节点选择器(如通过标签限制仅在特定节点运行)
四、故障排查命令
4.1 Pod诊断
Pod是K8s的最小部署单元,其故障排查是日常运维的重点。
命令 | 作用 | 示例 | 排查场景 |
---|---|---|---|
kubectl logs <pod-name> -f | 查看Pod日志(实时跟踪) | kubectl logs nginx-7f9f6f5c9d-2xqkf -f | 定位应用运行时错误(如日志中的Exception) |
kubectl logs <pod-name> -c <container-name> | 查看指定容器的日志 | kubectl logs nginx-pod -c sidecar -f | 多容器Pod(如主应用+sidecar)需指定容器,否则默认第一个容器 |
kubectl exec -it <pod-name> -- <command> | 进入容器执行命令 | kubectl exec -it nginx-pod -- /bin/bash | 检查容器内文件、网络(如ping 、curl )、环境变量 |
kubectl cp <pod-name>:<path> <local-path> | 从Pod拷贝文件到本地 | kubectl cp nginx-pod:/etc/nginx/nginx.conf ./nginx.conf | 提取配置文件或日志文件离线分析 |
kubectl cp <local-path> <pod-name>:<path> | 从本地拷贝文件到Pod | kubectl cp ./index.html nginx-pod:/usr/share/nginx/html/ | 临时替换应用文件(如调试静态页面) |
kubectl get events -n <namespace> --sort-by=.metadata.creationTimestamp | 查看命名空间事件 | kubectl get events -n dev --sort-by=.metadata.creationTimestamp | 定位Pod启动失败原因(如"FailedScheduling"调度失败、"ErrImagePull"镜像拉取失败) |
4.2 网络诊断
网络问题是K8s中最常见的故障类型,需检查Service、网络策略、DNS等。
命令 | 作用 | 示例 | 排查逻辑 |
---|---|---|---|
kubectl get svc <name> -o wide | 查看Service网络信息 | kubectl get svc nginx-svc -o wide | 确认ClusterIP、端口映射是否正确(如80:30080/TCP 表示集群内80端口映射到节点30080端口) |
kubectl describe svc <name> | 查看Service关联的Endpoints | kubectl describe svc nginx-svc | Endpoints为空→检查Pod标签是否与Service的selector 匹配 |
kubectl port-forward <pod-name> <local-port>:<pod-port> | 本地端口转发 | kubectl port-forward nginx-pod 8080:80 | 绕过Service直接访问Pod,验证Pod本身是否正常(排除Service配置问题) |
kubectl run -it --rm --image=busybox:1.35 dns-test -- nslookup <service-name> | 测试DNS解析 | kubectl run -it --rm --image=busybox:1.35 dns-test -- nslookup nginx-svc | 解析失败→检查CoreDNS是否正常(`kubectl get po -n kube-system |
kubectl get networkpolicies -n <namespace> | 查看网络策略 | kubectl get networkpolicies -n dev | 若Pod间无法通信,检查是否有网络策略(NetworkPolicy)阻止流量 |
4.3 存储诊断
存储相关故障(如PVC绑定失败、挂载异常)需检查PV、PVC、存储类等。
命令 | 作用 | 示例 | 排查方向 |
---|---|---|---|
kubectl get pv | 查看持久卷(PV) | kubectl get pv | 关注PV的STATUS (Available/ Bound/ Released),若PVC未绑定,检查是否有匹配的PV(容量、访问模式、存储类一致) |
kubectl get pvc -n <namespace> | 查看持久卷声明(PVC) | kubectl get pvc -n dev | Pending 状态→PV不足或不匹配;Bound 状态→正常绑定 |
kubectl describe pvc <name> -n <namespace> | 查看PVC绑定失败原因 | kubectl describe pvc nginx-pvc -n dev | 事件中可能提示"no persistent volumes available for this claim and no storage class is set"(未指定存储类且无可用PV) |
kubectl get storageclasses | 查看存储类(StorageClass) | kubectl get sc | 存储类用于动态创建PV,若PVC指定了存储类,需确保该存储类存在且可用 |
五、高级操作命令
5.1 标签与注解管理
标签(Label)用于资源分组和选择(如Service关联Pod),注解(Annotation)用于存储非标识性元数据(如构建信息、运维说明)。
命令 | 作用 | 示例 | 规范说明 |
---|---|---|---|
kubectl label <resource> <name> <key>=<value> | 为资源添加标签 | kubectl label pod nginx-pod env=dev | 标签键需符合[a-z0-9A-Z_-] ,长度≤63字符 |
kubectl label <resource> <name> <key>=<new-value> --overwrite | 更新标签 | kubectl label pod nginx-pod env=prod --overwrite | 必须加--overwrite ,否则无法更新已有标签 |
kubectl label <resource> <name> <key>- | 删除标签 | kubectl label pod nginx-pod env- | 标签键后加- 表示删除 |
kubectl annotate <resource> <name> <key>=<value> | 为资源添加注解 | kubectl annotate pod nginx-pod build-id=12345 | 注解可存储长文本(如JSON),不用于资源选择,仅用于描述 |
5.2 配置与密钥管理(ConfigMap/Secret)
-
ConfigMap:存储非敏感配置(如应用参数),通过环境变量或文件挂载注入Pod。
kubectl create configmap nginx-conf --from-file=nginx.conf # 从文件创建 kubectl get configmaps # 查看ConfigMap(简写cm) kubectl describe cm nginx-conf # 查看配置内容
-
Secret:存储敏感信息(如密码、证书),默认base64编码(非加密,需配合RBAC或外部密钥管理)。
kubectl create secret generic db-creds --from-literal=username=admin --from-literal=password=123456 # 创建密钥 kubectl get secrets # 查看Secret(简写secret) kubectl describe secret db-creds # 查看密钥结构(值隐藏) kubectl get secret db-creds -o jsonpath='{.data.password}' | base64 -d # 解码查看值(谨慎操作)
5.3 权限管理(RBAC)
基于角色的访问控制(RBAC)用于管理集群资源的访问权限,核心是"谁(Subject)能对什么资源(Resource)执行什么操作(Verb)"。
命令 | 作用 | 示例 | 权限范围 |
---|---|---|---|
kubectl get roles -n <namespace> | 查看命名空间内的角色 | kubectl get roles -n dev | 角色(Role)仅作用于所在命名空间 |
kubectl get rolebindings -n <namespace> | 查看角色绑定 | kubectl get rolebindings -n dev | 角色绑定(RoleBinding)将角色与用户(如ServiceAccount)关联 |
kubectl get clusterroles | 查看集群级角色 | kubectl get clusterroles | 集群角色(ClusterRole)作用于全集群 |
kubectl get clusterrolebindings | 查看集群角色绑定 | kubectl get clusterrolebindings | 绑定集群角色与用户 |
kubectl auth can-i <action> <resource> --as=<user> | 验证用户权限 | kubectl auth can-i get pods --as=dev-user | 快速确认权限配置是否生效(如返回yes /no ) |
5.4 作业与定时任务
-
Job:用于执行一次性任务(如数据备份、初始化),确保任务成功完成(即使节点故障)。
kubectl get jobs # 查看Job kubectl describe job <name> # 查看任务执行状态(如成功的Pod数、失败原因) kubectl delete job <name> # 删除Job(会保留已完成的Pod,需手动删除)
-
CronJob:用于执行定时任务(如日志清理、周期性报表生成),基于Cron表达式调度。
kubectl get cronjobs # 查看CronJob(简写cj) kubectl describe cronjob <name> # 查看调度规则(如`Schedule: 0 3 * * *`表示每天凌晨3点执行) kubectl create cronjob cleanup --image=busybox --schedule="0 3 * * *" -- rm -rf /tmp/* # 创建定时任务
六、易错点与最佳实践
-
命令缩写与复数形式
资源简写需用复数(如kubectl get po
正确,kubectl get pod
错误),常见简写:pod→po
、deployment→deploy
、service→svc
、node→no
、namespace→ns
。 -
命名空间上下文
未指定-n
时默认操作default
命名空间,切换默认命名空间后(kubectl config set-context
),所有命令默认在该命名空间执行,避免跨命名空间误操作。 -
create
vsapply
的选择- 临时测试用
create
(如kubectl create deployment test --image=nginx
); - 生产环境用
apply
(配合Git管理配置文件,支持版本控制和增量更新)。
- 临时测试用
-
强制删除的风险
--grace-period=0 --force
会跳过K8s的优雅终止流程,可能导致数据丢失(如数据库未完成事务提交),仅用于Pod长时间卡在Terminating
状态的极端场景。 -
日志查看技巧
- 多容器Pod必须用
-c
指定容器(如kubectl logs <pod> -c <container>
); - 实时日志加
-f
,配合--tail=<num>
查看最近N行(如kubectl logs <pod> -f --tail=100
); - 查看历史日志可用
--previous
(如kubectl logs <pod> --previous
查看崩溃容器的日志)。
- 多容器Pod必须用
-
资源依赖关系
部署时需注意资源依赖顺序:先创建ConfigMap/Secret,再创建Deployment(避免Pod启动时配置文件不存在);先创建Deployment,再创建Service(确保Endpoints能关联Pod)。 -
HPA不生效排查
- 检查metrics-server是否运行(
kubectl get po -n kube-system | grep metrics-server
); - 确保Pod设置了资源请求(
resources.requests.cpu
),HPA基于请求值计算使用率; - 查看HPA事件(
kubectl describe hpa <name>
),可能提示"missing request for cpu"(未设置CPU请求)。
- 检查metrics-server是否运行(
总结
Kubernetes命令的本质是与声明式API交互的工具,掌握命令的同时需理解其背后的资源模型(如控制器模式、标签选择器、命名空间隔离)。高频命令(get
、describe
、apply
)是日常运维的基石,而故障排查命令(logs
、exec
、events
)则是定位问题的关键。
建议通过实际场景练习(如部署Nginx→暴露Service→配置HPA→模拟故障排查)加深理解,并善用kubectl --help
和官方 cheatsheet 快速查询。随着实践深入,命令会逐渐内化为运维直觉,助力高效管理K8s集群。