Skip to content
Kubectl 命令行操作

Kubectl 命令行操作

常用 kubectl 命令速查:Pod、Deployment、ReplicaSet、Service、Namespace、DaemonSet、Job/CronJob 的全场景操作,以及调试技巧和日常高频模式。


1. Pod 操作

1.1 创建 Pod

# 直接创建
kubectl run mynginx --image=nginx:latest

# 创建并进入交互模式
kubectl run mynginx --image=nginx:latest -it --rm -- /bin/bash
参数 说明
-it 分配交互终端
--rm 退出时自动删除 Pod

1.2 查看 Pod

# 查看默认命名空间的 Pod
kubectl get pod
kubectl get po                    # po = pod 的缩写

# 查看所有命名空间的 Pod
kubectl get pod -A
kubectl get pod --all-namespaces

# 查看详细信息(含 IP、节点等)
kubectl get pod -owide

# 查看指定 Pod 的详细状态
kubectl describe pod mynginx

# 查看带标签的 Pod
kubectl get pod --show-labels

1.3 日志与调试

# 查看日志(实时滚动)
kubectl logs -f mynginx

# 查看前一个崩溃容器的日志
kubectl logs mynginx --previous

# 进入 Pod 执行命令
kubectl exec -it mynginx -- /bin/bash

# 直接执行单条命令
kubectl exec mynginx -- ls /app

1.4 删除 Pod

kubectl delete pod mynginx

# 强制删除(跳过优雅终止)
kubectl delete pod mynginx --force --grace-period=0

🚨 注意:首次拉取镜像时可能较慢,Pod 会停留在 ContainerCreatingErrImagePull 状态。用 kubectl describe pod 查看进度。


2. Deployment & ReplicaSet

Deployment 是对 ReplicaSet 和 Pod 的更高级抽象,提供副本控制、滚动更新、扩缩容、回滚等能力。

2.1 创建 Deployment

kubectl create deployment nginx-deploy --image=nginx:latest --replicas=3

2.2 查看

# 查看 Deployment
kubectl get deploy
kubectl get deploy -owide

# 查看 ReplicaSet
kubectl get rs
kubectl get rs -w                    # 监听状态变化

# 查看所有相关资源
kubectl get all

2.3 扩缩容

# 手动扩容/缩容
kubectl scale deploy nginx-deploy --replicas=5

# 自动扩缩容(HPA)
kubectl autoscale deploy nginx-deploy --min=3 --max=10 --cpu-percent=75

# 查看 HPA 状态
kubectl get hpa

# 删除 HPA
kubectl delete hpa nginx-deploy

2.4 更新镜像

kubectl set image deploy/nginx-deploy nginx=nginx:1.23
# deploy/<deploy名> <容器名>=<新镜像>

2.5 版本管理

# 查看发布历史
kubectl rollout history deploy/nginx-deploy

# 查看指定版本的详细信息
kubectl rollout history deploy/nginx-deploy --revision=2

# 回滚到上一版本
kubectl rollout undo deploy/nginx-deploy

# 回滚到指定版本
kubectl rollout undo deploy/nginx-deploy --to-revision=1

# 查看回滚状态
kubectl rollout status deploy/nginx-deploy

2.6 删除 Deployment

kubectl delete deploy nginx-deploy
# 注意:删除 Deployment 会级联删除其管理的 ReplicaSet 和 Pod

3. Service

3.1 创建 Service

# 为 Deployment 创建 Service
kubectl expose deploy/nginx-deploy --name=nginx-service --port=8080 --target-port=80

# 指定类型为 NodePort
kubectl expose deploy/nginx-deploy --name=nginx-service --port=8080 --target-port=80 --type=NodePort
参数 说明
--port Service 的端口
--target-port 目标端口,即 Pod 提供服务的端口
--type Service 类型:ClusterIP / NodePort / LoadBalancer

3.2 查看

kubectl get svc
kubectl get svc -owide

# 查看 Endpoints(后端 Pod IP 列表)
kubectl get endpoints
kubectl get ep

3.3 删除

kubectl delete svc nginx-service

4. Namespace

Namespace 是资源隔离机制,将集群资源划分为逻辑分组。

4.1 查看

# 列出所有命名空间
kubectl get ns
kubectl get namespace

# 查看 lease 对象(心跳检测)
kubectl get lease -A

4.2 创建与使用

# 创建命名空间
kubectl create ns develop

# 在指定命名空间中创建 Pod
kubectl run nginx --image=nginx:1.22 -n=develop

# 查看指定命名空间下的 Pod
kubectl get pod -n=develop

# 设置默认命名空间
kubectl config set-context $(kubectl config current-context) --namespace=develop

4.3 删除

kubectl delete ns develop

🚨 注意:删除命名空间会级联删除该空间下的所有资源。如果资源处于不可删除状态(如 finalizer 阻塞),删除操作将失败。


5. 声明式操作

5.1 应用 YAML 配置

# 创建/更新资源
kubectl apply -f my-pod.yaml

# 应用整个目录
kubectl apply -f ./configs/

# 删除通过 YAML 创建的资源
kubectl delete -f my-pod.yaml

5.2 端口转发

# 将本地端口转发到 Pod
kubectl port-forward pod/my-pod 8080:80

# 指定监听地址
kubectl port-forward pod/my-pod --address=0.0.0.0 8080:80

# 转发到 Service
kubectl port-forward svc/my-service 8080:80

此命令在前台运行,Ctrl+C 终止后转发结束。


6. Kubernetes 上下文(Context)管理

日常使用中频繁切换集群和命名空间,需要掌握 context 管理。

# 查看当前上下文
kubectl config current-context

# 列出所有上下文
kubectl config get-contexts

# 切换上下文(切换集群/用户)
kubectl config use-context <context-name>

# 查看 kubeconfig 配置
kubectl config view

# 显示合并后的 kubeconfig(含多文件合并结果)
kubectl config view --raw

# 设置默认命名空间(当前上下文)
kubectl config set-context --current --namespace=develop

💡 实用技巧:配合别名可以快速切换:

alias kprod='kubectl --context=prod'
alias kdev='kubectl --context=dev'

7. YAML 生成与 diff

7.1 快速生成 YAML 模板(💡 高频操作)

# 生成 Deployment YAML 模板(不实际创建)
kubectl create deploy nginx --image=nginx:1.22 --dry-run=client -o yaml

# 生成 Pod YAML 模板
kubectl run nginx --image=nginx:1.22 --dry-run=client -o yaml

# 生成 Service YAML 模板
kubectl expose deploy nginx --port=80 --dry-run=client -o yaml

# 生成 Job YAML 模板
kubectl create job my-job --image=busybox --dry-run=client -o yaml -- /bin/sh -c "date"

# 生成 CronJob YAML 模板
kubectl create cj my-cron --image=busybox --schedule="*/5 * * * *" --dry-run=client -o yaml -- /bin/sh -c "date"

💡 最佳实践:总是用 --dry-run=client -o yaml 生成模板再编辑,而非从零手写 YAML。这能避免 apiVersion 和字段名错误。

7.2 查看差异

# 查看本地文件与集群中正在运行版本的差异
kubectl diff -f deploy.yaml

# 应用前先 diff(安全习惯)
kubectl diff -f deploy.yaml && kubectl apply -f deploy.yaml

8. 资源发现与帮助

# 列出所有 API 资源
kubectl api-resources

# 按 API 组过滤
kubectl api-resources --api-group=apps

# 查看资源定义的字段说明(💡 极其有用)
kubectl explain pod
kubectl explain pod.spec
kubectl explain pod.spec.containers --recursive

# 查看 API 版本
kubectl api-versions

# 查看集群信息
kubectl cluster-info

9. 等待与条件判断

# 等待 Pod 就绪(脚本中非常有用)
kubectl wait --for=condition=Ready pod/my-pod --timeout=60s

# 等待 Deployment 完成更新
kubectl wait --for=condition=Available deploy/nginx --timeout=120s

# 等待所有 Pod 就绪(按标签)
kubectl wait --for=condition=Ready pod -l app=nginx --timeout=60s

# 等待 Job 完成
kubectl wait --for=condition=Complete job/migration --timeout=300s

# 等待资源被删除
kubectl wait --for=delete pod/my-pod --timeout=30s

10. DaemonSet 操作

# 查看所有 DaemonSet
kubectl get ds
kubectl get ds -A

# 查看 DaemonSet 详情
kubectl describe ds fluentd

# DaemonSet 没有 scale 命令(每个节点一个 Pod)
# 但可以查看分布在哪些节点
kubectl get pod -l app=fluentd -owide

11. Job / CronJob 操作

# 创建一次性 Job
kubectl create job db-migration --image=mysql:8.0 -- /bin/sh -c "sleep 30 && echo done"

# 查看 Job
kubectl get job

# 查看 Job 的 Pod 日志
kubectl logs job/db-migration

# 创建 CronJob
kubectl create cj db-backup --image=mysql:8.0 --schedule="0 2 * * *" -- /backup.sh

# 查看 CronJob
kubectl get cj

# 手动触发 CronJob 一次执行
kubectl create job --from=cj/db-backup manual-backup-001

# 暂停/恢复 CronJob
kubectl patch cj db-backup -p '{"spec":{"suspend":true}}'
kubectl patch cj db-backup -p '{"spec":{"suspend":false}}'

12. 调试工具箱(💡 高频操作)

12.1 临时调试 Pod

# 启动一个临时 Pod 测试网络连通性
kubectl run debug --image=busybox:1.36 -it --rm -- /bin/sh
# 进入后:nslookup my-service、wget -O- http://my-service:8080/health

# 使用带工具的调试镜像
kubectl run debug --image=nicolaka/netshoot -it --rm -- /bin/bash

# 在指定节点上启动调试 Pod
kubectl run debug --image=busybox -it --rm --overrides='{"spec":{"nodeName":"work-node-1"}}' -- /bin/sh

# 使用已有的 Pod 副本进行调试(kubectl debug,1.20+)
kubectl debug -it my-pod --image=busybox:1.36 --target=my-container

12.2 排查 Pod 问题

# 最常用排障三步
kubectl describe pod <name>           # 第1步:看 Events
kubectl logs <name>                   # 第2步:看日志
kubectl logs <name> --previous        # 第3步:看上一次崩溃日志

# 查看 Events(按时间排序)
kubectl get events --sort-by=.metadata.creationTimestamp
kubectl get events -w                 # 实时监听

# 查看 Pod 的完整状态(含退出码、重启原因)
kubectl get pod <name> -o yaml | grep -A 20 containerStatuses

12.3 排查节点问题

kubectl describe node <node-name>     # 查看节点 Conditions
kubectl top node                      # 查看节点资源使用(需 metrics-server)
kubectl cordon <node-name>            # 标记节点不可调度(维护前)
kubectl drain <node-name>             # 驱逐节点上的 Pod(维护前)
kubectl uncordon <node-name>          # 恢复调度

12.4 查看 Service 连通性

# 查看 Endpoints(确认后端 Pod 是否正确绑定)
kubectl get ep my-service -o yaml

# 在临时 Pod 中测试 Service DNS
kubectl run test --image=busybox -it --rm -- nslookup my-service
kubectl run test --image=busybox -it --rm -- wget -qO- http://my-service:8080/health

13. 常用缩写速查

资源全称 缩写
namespaces ns
nodes no
pods po
services svc
deployments deploy
replicasets rs
statefulsets sts
daemonsets ds
jobs (无,用 job)
cronjobs cj
configmaps cm
persistentvolumes pv
persistentvolumeclaims pvc
ingresses ing
endpoints ep
horizontalpodautoscalers hpa
serviceaccounts sa
clusterroles (无)
clusterrolebindings (无)
roles (无)
rolebindings (无)
networkpolicies netpol

14. 实用技巧汇总(💡 最佳实践)

# ====== 快速排障 ======

# 查看所有命名空间中非 Running 的 Pod
kubectl get pod -A --field-selector=status.phase!=Running

# 查看最近 30 分钟的 Events
kubectl get events -A --sort-by=.metadata.creationTimestamp | tail -20

# 按状态码统计 Pod
kubectl get pod -A --no-headers | awk '{print $4}' | sort | uniq -c

# ====== 格式化输出 ======

# JSONPath 获取所有 Pod IP
kubectl get pod -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.podIP}{"\n"}{end}'

# 获取 Deployment 的镜像版本
kubectl get deploy -o jsonpath='{.items[*].spec.template.spec.containers[*].image}'

# 自定义列(💡 超实用)
kubectl get pod -o custom-columns=NAME:.metadata.name,NODE:.spec.nodeName,IP:.status.podIP,STATUS:.status.phase

# ====== 操作技巧 ======

# 强制重启 Pod(通过 rollout restart)
kubectl rollout restart deploy/myapp

# 批量删除 Evicted/Failed 状态的 Pod
kubectl get pod -A | grep Evicted | awk '{print $2}' | xargs kubectl delete pod -n kube-system

# 复制文件到 Pod / 从 Pod 复制出来
kubectl cp my-pod:/app/logs/app.log ./app.log
kubectl cp ./config.yaml my-pod:/app/config/config.yaml

# 编辑资源后自动 apply
kubectl edit deploy nginx
# (保存退出后立即生效)

# 给节点打标签
kubectl label node work-node-1 disktype=ssd

# 给节点打污点(排斥 Pod)
kubectl taint node work-node-1 dedicated=special:NoSchedule

# 删除污点
kubectl taint node work-node-1 dedicated:NoSchedule-