kubectl实战指南——从部署第一个应用到排查问题

🚀 阅读提示:本文假设你已经有一个可用的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  # 暴露端口

重要字段解释

字段说明注意点
replicasPod 副本数建议生产环境至少2个,实现高可用
selector标签选择器必须和 Pod 的 labels 匹配
templatePod 模板定义 Pod 的具体配置
image容器镜像建议指定具体版本号,不要用 latest

⚠️ 踩坑记录:我曾经没注意 selectortemplate.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 createcreate 只能创建新资源,如果资源已存在会报错。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 支持资源类型的简写:

完整名称简写示例
podspokubectl get po
deploymentsdeploykubectl get deploy
servicessvckubectl get svc
nodesnokubectl get no
replicasetsrskubectl get rs
namespacesnskubectl 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 的核心用法:

核心命令回顾

  1. kubectl apply:部署/更新应用(声明式,推荐)
  2. kubectl get:查看资源状态(加 -o wide 看详情)
  3. kubectl describe:排查问题(重点看 Events)
  4. kubectl logs:查看应用日志(加 -f 实时查看)
  5. kubectl exec:进入容器调试(类似 docker exec

故障排查三步法

遇到问题 → kubectl describe → 看 Events 找原因 → kubectl logs/exec 深入排查

建议收藏关注,持续更新 K8s 系列教程!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加倍巴巴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值