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-labels1.3 日志与调试
# 查看日志(实时滚动)
kubectl logs -f mynginx
# 查看前一个崩溃容器的日志
kubectl logs mynginx --previous
# 进入 Pod 执行命令
kubectl exec -it mynginx -- /bin/bash
# 直接执行单条命令
kubectl exec mynginx -- ls /app1.4 删除 Pod
kubectl delete pod mynginx
# 强制删除(跳过优雅终止)
kubectl delete pod mynginx --force --grace-period=0🚨 注意:首次拉取镜像时可能较慢,Pod 会停留在
ContainerCreating或ErrImagePull状态。用kubectl describe pod查看进度。
2. Deployment & ReplicaSet
Deployment 是对 ReplicaSet 和 Pod 的更高级抽象,提供副本控制、滚动更新、扩缩容、回滚等能力。
2.1 创建 Deployment
kubectl create deployment nginx-deploy --image=nginx:latest --replicas=32.2 查看
# 查看 Deployment
kubectl get deploy
kubectl get deploy -owide
# 查看 ReplicaSet
kubectl get rs
kubectl get rs -w # 监听状态变化
# 查看所有相关资源
kubectl get all2.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-deploy2.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-deploy2.6 删除 Deployment
kubectl delete deploy nginx-deploy
# 注意:删除 Deployment 会级联删除其管理的 ReplicaSet 和 Pod3. 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 ep3.3 删除
kubectl delete svc nginx-service4. Namespace
Namespace 是资源隔离机制,将集群资源划分为逻辑分组。
4.1 查看
# 列出所有命名空间
kubectl get ns
kubectl get namespace
# 查看 lease 对象(心跳检测)
kubectl get lease -A4.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=develop4.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.yaml5.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.yaml8. 资源发现与帮助
# 列出所有 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-info9. 等待与条件判断
# 等待 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=30s10. DaemonSet 操作
# 查看所有 DaemonSet
kubectl get ds
kubectl get ds -A
# 查看 DaemonSet 详情
kubectl describe ds fluentd
# DaemonSet 没有 scale 命令(每个节点一个 Pod)
# 但可以查看分布在哪些节点
kubectl get pod -l app=fluentd -owide11. 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-container12.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 containerStatuses12.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/health13. 常用缩写速查
| 资源全称 | 缩写 |
|---|---|
| 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-