🚀 阅读提示:本文假设你已经有一个可用的K8s集群。如果还没有,请参考前两篇文章先搭建集群。
前言
还记得我第一次面对 kubectl 时的窘境。
好不容易用 kubeadm 把集群搭好了,信心满满地准备部署应用。打开终端,输入 kubectl,然后……就卡住了。
面对黑漆漆的屏幕,脑海里一片空白:
- 创建应用用
create还是apply? - 查看状态用
get还是describe? - Pod 显示
ContainerCreating是什么意思? - 日志怎么看?怎么进入容器内部?
那时候我深刻体会到:搭建集群只是开始,学会用 kubectl 管理应用才是真正的入门。
所以今天这篇文章,把我从"面对黑屏无所适从"到"熟练排查问题"的经验分享出来。跟着做,你也能在30分钟内掌握 kubectl 的核心用法。
一、kubectl 是什么?
kubectl 是 Kubernetes 的命令行工具,是运维人员和 K8s 集群交互的主要方式。
你可以把它理解为:kubectl 就是你操作 K8s 集群的"遥控器"。
1.1 kubectl 的核心能力
| 能力 | 对应命令 | 用途 |
|---|---|---|
| 创建/更新资源 | apply, create | 部署应用、更新配置 |
| 查看资源状态 | get, describe | 查看 Pod、Deployment 状态 |
| 查看日志 | logs | 排查应用问题 |
| 进入容器 | exec | 调试、查看容器内部 |
| 删除资源 | delete | 清理应用 |
| 端口转发 | port-forward | 本地访问集群服务 |
1.2 配置 kubectl
在使用之前,确保 kubectl 已经配置好集群连接:
# 验证连接
kubectl cluster-info
# 查看当前上下文
kubectl config current-context
# 查看所有集群配置
kubectl config get-contexts
如果显示集群信息,说明配置成功。
二、Deployment:管理应用的"管家"
在部署应用之前,先理解 Deployment 这个核心概念。
2.1 什么是 Deployment?
Deployment 是 Kubernetes 中用于管理无状态应用的核心资源。
它负责:
- 创建和管理 Pod 实例
- 确保指定数量的 Pod 始终运行(自我修复)
- 支持滚动更新和版本回滚
- 自动创建和维护 ReplicaSet
2.2 Deployment 的工作流程
你(用户)
↓ 提交 Deployment YAML
Deployment Controller
↓ 创建/管理
ReplicaSet
↓ 控制
Pod(实际运行容器)
关键认知:我们很少直接操作 Pod,而是通过 Deployment 来间接管理。Pod 是临时的,而 Deployment 是持久的。
2.3 Deployment 的 YAML 结构
apiVersion: apps/v1 # API 版本
kind: Deployment # 资源类型
metadata: # 元数据
name: nginx-deployment # Deployment 名称
labels: # 标签
app: nginx
spec: # 期望状态
replicas: 1 # Pod 副本数
selector: # 选择器(用于匹配 Pod)
matchLabels:
app: nginx
template: # Pod 模板
metadata:
labels: # Pod 标签
app: nginx
spec:
containers: # 容器定义
- name: nginx # 容器名称
image: nginx:1.7.9 # 镜像
ports:
- containerPort: 80 # 暴露端口
重要字段解释:
| 字段 | 说明 | 注意点 |
|---|---|---|
replicas | Pod 副本数 | 建议生产环境至少2个,实现高可用 |
selector | 标签选择器 | 必须和 Pod 的 labels 匹配 |
template | Pod 模板 | 定义 Pod 的具体配置 |
image | 容器镜像 | 建议指定具体版本号,不要用 latest |
⚠️ 踩坑记录:我曾经没注意
selector和template.metadata.labels的匹配,结果 Deployment 创建成功但 Pod 一直没起来。kubectl 不会报错,就是看不到 Pod。务必确保这两个地方的标签一致!
三、实战:部署你的第一个应用
3.1 创建 Deployment YAML 文件
创建一个文件 nginx-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
3.2 应用配置
使用 kubectl apply 命令部署应用:
# 应用 YAML 文件
kubectl apply -f nginx-deployment.yaml
# 预期输出
# deployment.apps/nginx-deployment created
kubectl apply 的特点:
- 如果资源不存在,会创建它
- 如果资源已存在,会更新它(幂等操作)
- 支持声明式管理(推荐)
💡 apply vs create:
create只能创建新资源,如果资源已存在会报错。apply更智能,建议日常使用apply。
四、查看资源状态:get 命令详解
4.1 查看 Deployment
# 查看所有 Deployment
kubectl get deployments
# 预期输出
# NAME READY UP-TO-DATE AVAILABLE AGE
# nginx-deployment 1/1 1 1 5m2s
字段说明:
READY:当前可用数/期望数(1/1 表示期望1个,实际可用1个)UP-TO-DATE:已更新到最新版本的 Pod 数AVAILABLE:可用的 Pod 数AGE:Deployment 创建时间
4.2 查看 Pod
# 查看所有 Pod
kubectl get pods
# 查看详细信息(包括 IP、所在节点)
kubectl get pods -o wide
# 预期输出
# NAME READY STATUS RESTARTS AGE IP NODE
# nginx-deployment-746fbb99df-tdmb7 1/1 Running 0 7m 10.100.85.230 k8s-node01
Pod 状态(STATUS)说明:
| 状态 | 含义 | 说明 |
|---|---|---|
Running | 运行中 | Pod 已启动,容器正常运行 |
Pending | 等待中 | 正在调度或拉取镜像 |
ContainerCreating | 创建容器 | 正在创建容器,如果长时间卡在这里,通常是镜像拉取失败 |
CrashLoopBackOff | 循环崩溃 | 容器启动后崩溃,正在不断重启 |
Error | 错误 | 容器启动失败 |
Completed | 完成 | 容器已完成任务(适用于 Job) |
🔥 必杀技 1:如果 Pod 状态不是
Running,用kubectl describe pod <pod-name>查看详细原因。
4.3 查看其他资源
# 查看所有资源(简写)
kubectl get all
# 查看节点
kubectl get nodes
# 查看服务
kubectl get svc
# 查看 ReplicaSet
kubectl get rs
4.4 查看所有命名空间的资源
# 查看所有命名空间的 Deployment
kubectl get deployments -A
# 或
kubectl get deployments --all-namespaces
常见命名空间:
default:默认命名空间,用户资源一般放这里kube-system:K8s 系统组件kube-public:公开资源kube-node-lease:节点租约
4.5 指定命名空间查看
# 查看 kube-system 命名空间的 Pod
kubectl get pods -n kube-system
# 查看指定命名空间的 Deployment
kubectl get deployments -n kube-system
五、排查问题:describe 命令详解
当 Pod 状态异常时,kubectl describe 是最重要的排查工具。
5.1 查看 Deployment 详情
kubectl describe deployment nginx-deployment
输出解读:
Name: nginx-deployment
Namespace: default
Selector: app=nginx
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.7.9
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 19m deployment-controller Scaled up replica set nginx-deployment-746fbb99df to 1
重点关注:
Replicas:期望数、实际数、可用数Conditions:当前状态条件Events:事件日志,排查问题的关键!
5.2 查看 Pod 详情(排查利器)
kubectl describe pod nginx-deployment-746fbb99df-tdmb7
实战案例:排查镜像拉取失败
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 30s default-scheduler Successfully assigned default/nginx-deployment-xxxxx to k8s-node01
Normal Pulling 30s kubelet Pulling image "nginx:1.7.9"
Warning Failed 10s kubelet Failed to pull image "nginx:1.7.9": rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection
Warning Failed 10s kubelet Error: ErrImagePull
Normal BackOff 5s (x2 over 10s) kubelet Back-off pulling image "nginx:1.7.9"
Warning Failed 5s (x2 over 10s) kubelet Error: ImagePullBackOff
问题分析:
- 从 Events 可以看到,Pod 调度成功了(Scheduled)
- 但在拉取镜像时失败(Failed to pull image)
- 原因是网络问题,无法连接 Docker Hub
解决方案:
# 配置镜像加速器
# 修改 /etc/docker/daemon.json,添加阿里云镜像加速
🔥 必杀技 2:describe 的 Events 部分会按时间顺序显示关键事件,从最新的往前看,通常能快速定位问题。
六、查看日志:logs 命令详解
应用运行异常时,查看日志是最直接的排查方式。
6.1 查看 Pod 日志
# 查看 Pod 日志
kubectl logs nginx-deployment-746fbb99df-tdmb7
# 实时查看日志(类似 tail -f)
kubectl logs nginx-deployment-746fbb99df-tdmb7 -f
# 查看最近100行日志
kubectl logs nginx-deployment-746fbb99df-tdmb7 --tail=100
# 查看前10分钟的日志
kubectl logs nginx-deployment-746fbb99df-tdmb7 --since=10m
6.2 查看多容器 Pod 的日志
如果一个 Pod 有多个容器,需要指定容器名:
# 查看指定容器的日志
kubectl logs pod-name -c container-name
6.3 查看已重启 Pod 的历史日志
如果 Pod 崩溃重启了,加 --previous 查看上次运行的日志:
kubectl logs pod-name --previous
💡 实战技巧:对于系统组件(如 coredns),日志中经常能看到 DNS 解析失败的错误,这是排查网络问题的线索。
七、进入容器:exec 命令详解
有时候需要进入容器内部调试,比如查看配置文件、执行命令等。
7.1 进入容器执行命令
# 在 Pod 中执行命令
kubectl exec nginx-deployment-746fbb99df-tdmb7 -- ls /etc/nginx
# 进入容器的交互式 shell
kubectl exec -it nginx-deployment-746fbb99df-tdmb7 -- /bin/sh
# 如果容器使用 bash
kubectl exec -it nginx-deployment-746fbb99df-tdmb7 -- /bin/bash
参数说明:
-i:保持 stdin 打开-t:分配一个伪终端--:分隔符,后面是要在容器内执行的命令
7.2 实战:查看 Nginx 配置
# 进入容器
kubectl exec -it nginx-deployment-746fbb99df-tdmb7 -- /bin/sh
# 在容器内执行
# cat /etc/nginx/nginx.conf
# cat /etc/resolv.conf
# exit
🔥 必杀技 3:进入容器后,可以用
cat,ls,ps,netstat等命令排查问题。如果发现配置文件不对,就知道为什么应用报错了。
八、kubectl 常用技巧
8.1 简写资源类型
kubectl 支持资源类型的简写:
| 完整名称 | 简写 | 示例 |
|---|---|---|
| pods | po | kubectl get po |
| deployments | deploy | kubectl get deploy |
| services | svc | kubectl get svc |
| nodes | no | kubectl get no |
| replicasets | rs | kubectl get rs |
| namespaces | ns | kubectl get ns |
8.2 输出格式
# JSON 格式输出
kubectl get pod pod-name -o json
# YAML 格式输出
kubectl get pod pod-name -o yaml
# 只输出特定字段
kubectl get pod pod-name -o jsonpath='{.status.phase}'
# 自定义输出格式
kubectl get pods -o custom-columns='NAME:.metadata.name,STATUS:.status.phase,IP:.status.podIP'
8.3 监听资源变化
# 实时监听 Pod 状态变化
kubectl get pods -w
# 监听 Deployment 变化
kubectl get deployments -w
8.4 快速删除资源
# 删除 Deployment
kubectl delete deployment nginx-deployment
# 删除 Pod(Deployment 会重新创建)
kubectl delete pod nginx-deployment-xxx
# 删除所有 Deployment
kubectl delete deployments --all
# 根据标签删除
kubectl delete pods -l app=nginx
8.5 端口转发(本地调试神器)
# 将本地 8080 端口转发到 Pod 的 80 端口
kubectl port-forward pod/nginx-deployment-xxx 8080:80
# 将本地 8080 端口转发到 Service 的 80 端口
kubectl port-forward svc/nginx-service 8080:80
# 后台运行
kubectl port-forward pod/nginx-deployment-xxx 8080:80 &
然后本地访问 http://localhost:8080 就能访问到集群内的应用。
九、故障排查速查表
遇到问题时,按这个顺序排查:
9.1 Pod 状态异常排查流程
1. kubectl get pods 查看状态
↓
2. 如果状态不是 Running:
kubectl describe pod <pod-name> 查看 Events
↓
3. 根据 Events 判断问题类型:
- ImagePullBackOff:镜像拉取失败
→ 检查镜像名称、标签是否正确
→ 配置镜像加速器
- CrashLoopBackOff:容器启动后崩溃
→ kubectl logs <pod-name> 查看应用日志
→ 进入容器检查配置
- Pending:调度失败
→ describe 查看事件详情
→ 可能是资源不足(CPU/内存)
- ContainerCreating:容器创建中卡死
→ 通常是网络插件问题
→ 检查 CNI 插件状态
9.2 常见问题及解决
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
ImagePullBackOff | 镜像不存在或拉取失败 | 检查镜像名、标签;配置镜像加速 |
CrashLoopBackOff | 容器启动后退出 | 查看日志;检查启动命令 |
Pending | 资源不足或调度失败 | 扩容节点;检查资源配额 |
ContainerCreating | 网络插件问题 | 检查 CNI 插件;重启 kubelet |
ErrImagePull | 镜像拉取超时 | 检查网络;使用国内镜像源 |
OOMKilled | 内存溢出 | 增加内存限制;优化应用 |
十、实战练习
现在,跟着做一遍完整的部署流程:
练习 1:部署并验证 Nginx
# 1. 创建 YAML 文件
cat > nginx-deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
EOF
# 2. 部署
kubectl apply -f nginx-deployment.yaml
# 3. 验证
kubectl get deployments
kubectl get pods -o wide
# 4. 查看详情
kubectl describe deployment nginx-deployment
# 5. 查看日志
kubectl logs -l app=nginx
# 6. 进入容器
kubectl exec -it deployment/nginx-deployment -- /bin/sh
# 7. 端口转发测试
kubectl port-forward deployment/nginx-deployment 8080:80
# 然后访问 http://localhost:8080
练习 2:排查一个"故障"Pod
# 部署一个有问题的应用(镜像不存在)
cat > bad-deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: bad-deployment
spec:
replicas: 1
selector:
matchLabels:
app: bad
template:
metadata:
labels:
app: bad
spec:
containers:
- name: bad
image: nginx:not-exist-tag
EOF
kubectl apply -f bad-deployment.yaml
# 现在尝试排查:
# 1. 查看 Pod 状态
kubectl get pods
# 2. 查看详情(应该能看到镜像拉取失败)
kubectl describe pod bad-deployment-xxx
# 3. 修复:更新为正确的镜像
kubectl set image deployment/bad-deployment bad=nginx:alpine
# 4. 观察修复过程
kubectl get pods -w
十一、kubectl 命令速查表
11.1 基础命令
| 命令 | 说明 | 示例 |
|---|---|---|
kubectl apply | 应用配置 | kubectl apply -f deployment.yaml |
kubectl create | 创建资源 | kubectl create -f service.yaml |
kubectl get | 查看资源 | kubectl get pods |
kubectl describe | 查看详情 | kubectl describe pod xxx |
kubectl delete | 删除资源 | kubectl delete deployment xxx |
kubectl logs | 查看日志 | kubectl logs pod-xxx |
kubectl exec | 执行命令 | kubectl exec -it pod-xxx -- /bin/sh |
11.2 高级命令
| 命令 | 说明 | 示例 |
|---|---|---|
kubectl edit | 编辑资源 | kubectl edit deployment xxx |
kubectl patch | 部分更新 | kubectl patch deployment xxx -p '{"spec":{"replicas":3}}' |
kubectl scale | 扩缩容 | kubectl scale deployment xxx --replicas=3 |
kubectl rollout | 滚动管理 | kubectl rollout status deployment/xxx |
kubectl port-forward | 端口转发 | kubectl port-forward pod-xxx 8080:80 |
kubectl top | 查看资源使用 | kubectl top nodes |
总结
通过这篇文章,你应该掌握了 kubectl 的核心用法:
核心命令回顾
kubectl apply:部署/更新应用(声明式,推荐)kubectl get:查看资源状态(加-o wide看详情)kubectl describe:排查问题(重点看 Events)kubectl logs:查看应用日志(加-f实时查看)kubectl exec:进入容器调试(类似docker exec)
故障排查三步法
遇到问题 → kubectl describe → 看 Events 找原因 → kubectl logs/exec 深入排查
建议收藏关注,持续更新 K8s 系列教程!

1119

被折叠的 条评论
为什么被折叠?



