写在前面
本文整理了日常使用 Kubernetes 最常用的 kubectl 命令,涵盖资源查看、部署管理、排错调试和集群运维。每个命令都力求实用,避免罗列用不到的冷门参数。
本文按 Kubernetes 1.36 官方文档复核。kubectl 通常只保证与 API Server 相差一个次版本时受支持,执行前应先查看客户端和服务端版本;示例中的 <...> 是必须替换的占位符,latest 镜像标签仅适合临时学习。
一、基础操作
1.1 集群信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 查看集群信息
kubectl cluster-info
# 查看集群节点
kubectl get nodes
# 查看节点详细信息
kubectl describe node <node-name>
# 查看节点资源使用
kubectl top nodes
# 查看 kubeconfig 配置
kubectl config view
# 切换命名空间(需要 kubectx 或手动切换)
kubectl config set-context --current --namespace=<namespace>
|
1.2 命名空间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # 查看所有命名空间
kubectl get namespaces
kubectl get ns
# 创建命名空间
kubectl create namespace dev
# 删除命名空间
kubectl delete namespace dev
# 在指定命名空间下操作(-n 或 --namespace)
kubectl get pods -n dev
# 查看所有命名空间的资源
kubectl get pods --all-namespaces
kubectl get pods -A
|
1.3 通用操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| # 查看资源列表
kubectl get <resource> # 如 kubectl get pods
kubectl get <resource> -o wide # 显示更多信息
kubectl get <resource> -o yaml # 输出 YAML 格式
kubectl get <resource> -o json # 输出 JSON 格式
kubectl get <resource> -o name # 只显示资源名
kubectl get <resource> --show-labels # 显示标签
kubectl get <resource> --sort-by=.metadata.creationTimestamp # 按创建时间排序
# 查看资源详情
kubectl describe <resource> <name>
# 创建/更新资源
kubectl apply -f manifest.yaml # 推荐,幂等操作
kubectl apply -f ./manifests/ # 应用目录下所有文件
kubectl apply -f https://example.com/reviewed-manifest.yaml # 仅使用已审查并固定版本的可信清单
# 删除资源
kubectl delete -f manifest.yaml # 按文件删除
kubectl delete pod <pod-name> # 按名称删除
kubectl delete pod <pod-name> --grace-period=0 --force # 强制删除(卡住时用)
# 编辑资源
kubectl edit <resource> <name> # 打开编辑器修改
# 查看资源定义帮助
kubectl explain pod
kubectl explain pod.spec.containers
|
强制删除只会立即从 API 中移除对象,不保证节点上的旧进程已经停止;对有状态或单实例工作负载可能造成重复进程和数据损坏,必须先确认节点与存储状态。
二、Pod 管理
2.1 查看 Pod
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # 列出 Pod
kubectl get pods
kubectl get pods -o wide # 显示 IP 和所在节点
kubectl get pods -w # 持续监控变化(watch)
kubectl get pods --field-selector status.phase=Running # 按状态过滤
# 查看所有命名空间的 Pod
kubectl get pods -A
# 按标签筛选
kubectl get pods -l app=nginx
kubectl get pods -l 'app in (nginx, redis)'
# 查看 Pod 详情
kubectl describe pod <pod-name>
# 查看 Pod 的 YAML
kubectl get pod <pod-name> -o yaml
|
2.2 Pod 生命周期
1
2
3
4
5
6
7
8
| Pod 状态:
Pending — 正在调度或拉取镜像
Running — 正在运行
Succeeded — 执行完成(Job/CronJob)
Failed — 执行失败
Unknown — 无法获取状态(通常是节点失联)
CrashLoopBackOff — 容器反复崩溃重启
ImagePullBackOff — 镜像拉取失败
|
2.3 快速创建 Pod
1
2
3
4
5
6
| # 用命令行快速创建(临时测试用)
kubectl run nginx --image=nginx:latest
kubectl run busybox --image=busybox --rm -it -- /bin/sh # 运行后进入,退出自动删除
# 从 YAML 生成(不执行,输出到文件)
kubectl run nginx --image=nginx --dry-run=client -o yaml > pod.yaml
|
2.4 容器交互
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # 查看容器日志
kubectl logs <pod-name> # 查看当前日志
kubectl logs <pod-name> -f # 实时跟踪日志
kubectl logs <pod-name> -f --tail=100 # 最后100行,持续跟踪
kubectl logs <pod-name> -c <container-name> # 指定容器(多容器 Pod)
kubectl logs <pod-name> --previous # 查看上一次崩溃的日志(排错神器)
kubectl logs <pod-name> --since=1h # 最近1小时的日志
kubectl logs <pod-name> --since-time="2026-01-01T00:00:00Z"
# 进入容器
kubectl exec -it <pod-name> -- /bin/bash # 进入容器 shell
kubectl exec -it <pod-name> -- /bin/sh # 没有 bash 时用 sh
kubectl exec -it <pod-name> -c <container> -- sh # 指定容器
# 在容器中执行命令(不进入)
kubectl exec <pod-name> -- cat /etc/config/app.conf
kubectl exec <pod-name> -- env # 查看环境变量
kubectl exec <pod-name> -- df -h # 查看磁盘
# 文件拷贝
kubectl cp <pod-name>:/tmp/file.txt ./file.txt # 从容器拷贝到本地
kubectl cp ./file.txt <pod-name>:/tmp/file.txt # 从本地拷贝到容器
kubectl cp ./file.txt <pod-name>:/tmp/ -c <container> # 指定容器
|
kubectl cp 依赖容器镜像中存在 tar;精简镜像没有该命令时会失败。
2.5 端口转发
1
2
3
4
5
| # 本地端口转发到 Pod(调试用)
kubectl port-forward <pod-name> 8080:80 # 本地8080 → Pod的80
kubectl port-forward <pod-name> 8080:80 3306:3306 # 同时转发多个端口
kubectl port-forward svc/<service-name> 8080:80 # 转发到 Service
kubectl port-forward deploy/<deploy-name> 8080:80 # 转发到 Deployment
|
三、工作负载管理
3.1 Deployment
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| # 查看 Deployment
kubectl get deployments
kubectl get deploy
# 创建 Deployment
kubectl create deployment nginx --image=nginx:latest --replicas=3
kubectl create deployment nginx --image=nginx --replicas=3 --dry-run=client -o yaml > deploy.yaml
# 扩缩容
kubectl scale deployment nginx --replicas=5
# 更新镜像(触发滚动更新)
kubectl set image deployment/nginx nginx=nginx:1.25
kubectl edit deployment nginx # 直接编辑
# 查看滚动更新状态
kubectl rollout status deployment/nginx
# 查看更新历史
kubectl rollout history deployment/nginx
# 回滚到上一版本
kubectl rollout undo deployment/nginx
# 回滚到指定版本
kubectl rollout undo deployment/nginx --to-revision=2
# 暂停/恢复滚动更新(用于多次修改一次性生效)
kubectl rollout pause deployment/nginx
kubectl set image deployment/nginx nginx=nginx:1.25
kubectl set resources deployment/nginx -c nginx --limits=memory=512Mi
kubectl rollout resume deployment/nginx
# 查看 ReplicaSet(每个版本对应一个 RS)
kubectl get replicaset
|
3.2 StatefulSet
1
2
3
4
5
6
7
8
9
| # 查看 StatefulSet
kubectl get statefulsets
kubectl get sts
# 扩缩容
kubectl scale statefulset mysql --replicas=3
# 查看详情
kubectl describe statefulset mysql
|
3.3 DaemonSet
1
2
3
4
5
6
| # 查看 DaemonSet
kubectl get daemonsets
kubectl get ds
# 查看每个节点上的 Pod
kubectl get pods -o wide | grep <daemonset-name>
|
3.4 Job 和 CronJob
1
2
3
4
5
6
7
8
9
10
11
| # 查看 Job
kubectl get jobs
# 查看 CronJob
kubectl get cronjobs
# 手动触发 CronJob
kubectl create job --from=cronjob/<cronjob-name> <job-name>
# 删除 Job
kubectl delete job <job-name>
|
四、服务与网络
4.1 Service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 查看 Service
kubectl get services
kubectl get svc
# 查看 Service 详情
kubectl describe svc <service-name>
# 查看 EndpointSlice 后端(Endpoints API 自 Kubernetes 1.33 起已弃用)
kubectl get endpointslice -l kubernetes.io/service-name=<service-name>
# 暴露 Deployment 为 Service
kubectl expose deployment nginx --port=80 --target-port=80 --type=ClusterIP
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer
# 常用 Service 类型:
# ClusterIP — 集群内部访问(默认)
# NodePort — 通过节点端口外部访问(30000-32767)
# LoadBalancer — 云厂商提供的负载均衡器
# ExternalName — 映射到外部 DNS 名
|
4.2 Ingress
1
2
3
4
5
6
| # 查看 Ingress
kubectl get ingress
kubectl get ing
# 查看 Ingress 详情
kubectl describe ingress <ingress-name>
|
4.3 网络诊断
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 临时启动一个网络调试 Pod
kubectl run debug --image=busybox --rm -it --restart=Never -- sh
# 在调试 Pod 中测试 DNS
nslookup <service-name>
nslookup <service-name>.<namespace>.svc.cluster.local
# 测试 Service 连通性
wget -qO- http://<service-name>:<port>
curl http://<service-name>:<port>
# 查看集群 DNS 配置
kubectl get configmap coredns -n kube-system
|
五、配置与存储
5.1 ConfigMap
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 从字面量创建
kubectl create configmap app-config --from-literal=DB_HOST=mysql --from-literal=DB_PORT=3306
# 从文件创建
kubectl create configmap app-config --from-file=config.properties
# 从目录创建(目录下每个文件变成一个 key)
kubectl create configmap app-config --from-file=./config/
# 查看 ConfigMap
kubectl get configmaps
kubectl get cm
kubectl describe configmap app-config
|
5.2 Secret
1
2
3
4
5
6
7
8
9
10
11
12
| # 创建 Secret
kubectl create secret generic db-secret --from-literal=username=admin --from-literal=password='P@ssw0rd'
# 创建 kubernetes.io/tls 类型的 Secret
kubectl create secret tls tls-secret --cert=./cert.pem --key=./key.pem
# 查看 Secret(内容是 base64 编码的)
kubectl get secrets
kubectl describe secret <secret-name>
# 解码查看 Secret 内容
kubectl get secret <secret-name> -o jsonpath='{.data.password}' | base64 --decode
|
5.3 PV 和 PVC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 查看持久卷
kubectl get persistentvolumes
kubectl get pv
# 查看持久卷声明
kubectl get persistentvolumeclaims
kubectl get pvc
# 查看 PVC 绑定状态
kubectl get pvc -o wide
# 查看 PV 详情
kubectl describe pv <pv-name>
kubectl describe pvc <pvc-name>
|
六、排错调试
6.1 排查流程
1
2
3
4
5
| Pod 一直 Pending → kubectl describe pod 查看 Events,可能是资源、调度约束或 PVC 等问题
Pod 一直 CrashLoopBackOff → kubectl logs --previous 查看上次崩溃日志
Pod ImagePullBackOff → 检查镜像名和镜像仓库权限
Service 无法访问 → 检查 EndpointSlice 是否有就绪后端,标签和端口是否匹配
Pod 间无法通信 → 检查 NetworkPolicy,检查 DNS 解析
|
6.2 常用排错命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # 查看 Pod 事件(排错第一步)
kubectl describe pod <pod-name> | grep -A 20 Events
# 查看 Pod 状态和重启次数
kubectl get pods -o wide
# 查看容器日志
kubectl logs <pod-name> --previous # 上次崩溃的日志
kubectl logs <pod-name> -c <container> -f # 指定容器,实时跟踪
# 进入容器排查
kubectl exec -it <pod-name> -- sh
# 查看 Pod 失败原因
kubectl get pod <pod-name> -o jsonpath='{.status.conditions[?(@.type=="Ready")].message}'
# 查看近期事件;kubectl events 在较新的 kubectl 中更适合按资源过滤
kubectl events --for pod/<pod-name>
kubectl get events --sort-by='.metadata.creationTimestamp'
# 查看 API Server 暴露的 Prometheus 指标(需要相应 RBAC 权限)
kubectl get --raw /metrics
|
6.3 资源使用
1
2
3
4
5
6
7
8
9
10
11
| # 查看节点资源使用(需要 metrics-server)
kubectl top nodes
# 查看 Pod 资源使用
kubectl top pods
kubectl top pods -n <namespace>
kubectl top pods --sort-by=memory # 按内存排序
kubectl top pods --sort-by=cpu # 按 CPU 排序
# 安装 metrics-server(如果 top 命令报错)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
|
七、标签与选择器
7.1 标签操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 查看标签
kubectl get pods --show-labels
# 添加标签
kubectl label pod <pod-name> env=prod
# 修改标签(覆盖已有值)
kubectl label pod <pod-name> env=staging --overwrite
# 删除标签
kubectl label pod <pod-name> env-
# 按标签筛选
kubectl get pods -l app=nginx
kubectl get pods -l 'tier in (frontend,backend)'
kubectl get pods -l 'env!=debug'
kubectl get pods -l 'version in (v1, v2),app=nginx'
|
7.2 注解
1
2
3
4
5
6
7
8
| # 添加注解
kubectl annotate pod <pod-name> description="测试 Pod"
# 查看注解
kubectl describe pod <pod-name> | grep -A 5 Annotations
# 删除注解
kubectl annotate pod <pod-name> description-
|
八、集群运维
8.1 节点管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 查看节点详情
kubectl describe node <node-name>
# 节点资源使用
kubectl top nodes
# 标记节点为不可调度(维护前操作)
kubectl cordon <node-name>
# 恢复节点调度
kubectl uncordon <node-name>
# 驱逐节点上的 Pod(维护用)
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
# 查看节点标签
kubectl get nodes --show-labels
# 给节点打标签(用于调度)
kubectl label node <node-name> disktype=ssd
|
8.2 集群资源
1
2
3
4
5
6
7
8
9
10
11
| # 查看 API 资源类型
kubectl api-resources
# 查看 API 版本
kubectl api-versions
# 查看 kubectl get all 所覆盖的一组常用内置资源;它不代表全部资源,也不包含任意 CRD
kubectl get all -A
# 检查当前 API Server 的就绪探针(ComponentStatus API 已弃用)
kubectl get --raw='/readyz?verbose'
|
8.3 RBAC
1
2
3
4
5
6
7
8
9
10
11
| # 查看角色
kubectl get roles
kubectl get clusterroles
# 查看角色绑定
kubectl get rolebindings
kubectl get clusterrolebindings
# 查看角色详情
kubectl describe role <role-name>
kubectl describe clusterrole <clusterrole-name>
|
九、常用组合命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| # 快速查看所有命名空间的 Pod 状态(排除 Running 的)
kubectl get pods -A --field-selector=status.phase!=Running
# 查看 CrashLoopBackOff 的 Pod
kubectl get pods -A | grep -E "CrashLoop|Error|Pending"
# 批量删除 Completed 状态的 Pod
kubectl get pods -A --field-selector=status.phase=Succeeded -o json | \
kubectl delete -f -
# 批量删除 Evicted 状态的 Pod
kubectl get pods -A | grep Evicted | awk '{print $2 " --namespace=" $1}' | xargs -n 2 kubectl delete pod
# 查看 Deployment 的 Pod 模板镜像版本
kubectl get deployment <name> -o jsonpath='{.spec.template.spec.containers[*].image}'
# 查看所有 Deployment 的镜像版本
kubectl get deployments -A -o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,IMAGES:.spec.template.spec.containers[*].image'
# 快速导出资源定义(kubectl neat 是需另行安装的第三方插件)
kubectl get <resource> <name> -o yaml | kubectl neat
# 查看资源配额
kubectl describe resourcequota -n <namespace>
# 查看限制范围
kubectl describe limitrange -n <namespace>
|
十、kubectl 命令速查
按场景选命令
1
2
3
4
5
6
7
8
9
10
| 查状态 → kubectl get pods,svc,deploy -A
查日志 → kubectl logs <pod> -f --tail=100
查原因 → kubectl describe pod <pod>
进容器 → kubectl exec -it <pod> -- sh
调端口 → kubectl port-forward <pod> 8080:80
更新镜像 → kubectl set image deploy/<name> <container>=<image>
扩缩容 → kubectl scale deploy <name> --replicas=5
回滚 → kubectl rollout undo deploy/<name>
看资源 → kubectl top pods/nodes
节点维护 → kubectl drain <node> --ignore-daemonsets
|
输出格式
1
2
3
4
5
| -o wide # 更多列(IP、节点等)
-o yaml # YAML 格式
-o json # JSON 格式
-o name # 只显示资源名
-o custom-columns # 自定义列
|
常用简写
1
2
3
4
5
6
7
8
9
10
11
| po/pods → pod
svc/services → service
deploy/deployments → deployment
sts/statefulsets → statefulset
ds/daemonsets → daemonset
cm/configmaps → configmap
ns/namespaces → namespace
pv/persistentvolumes → persistentvolume
pvc/persistentvolumeclaims → persistentvolumeclaim
ing/ingress → ingress
no/nodes → node
|
上述 grep、awk、xargs、base64 --decode 和管道示例面向 Bash/POSIX 环境;PowerShell 的筛选、解码和引号规则不同,不应原样复制。
参考资料