跳至内容

K8s 常用命令

常用 kubectl 命令与输出速查。

  • Kubernetes
  • kubectl

【…】 为待替换参数,各条命令按需使用。-n 【命名空间】 指定操作范围,-A 查询所有命名空间。路径或参数含空格等 Shell 特殊字符时,需加引号。

1. 集群切换

代码块 Shell
1
2
3
4
5
6
7
8
9
kubectl config get-contexts                    # 已配置的 context
kubectl config current-context                 # 当前 context
kubectl config use-context 【context名】       # 切换默认 context
kubectl version                                # 客户端与服务端版本
kubectl version --client                       # 仅客户端版本
kubectl cluster-info                           # 集群入口

# 仅本次使用指定 context,查询 Pod
kubectl --context=【context名】 get pods -n 【命名空间】

get-contexts 输出示例:

运行结果 Text
1
2
3
# CURRENT   NAME           CLUSTER        AUTHINFO    NAMESPACE
# *         dev-cluster    dev-cluster    developer   default
#           prod-cluster   prod-cluster   operator    production

context 包含集群、访问身份和默认命名空间,名称取自 NAME 列,* 是当前选择。use-context 会影响后续命令;修改或删除资源前先确认集群。

2. 资源列表

代码块 Shell
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
kubectl get ns                                # 命名空间
kubectl get nodes -o wide                      # 节点及 IP
kubectl get pods -n 【命名空间】              # Pod
kubectl get pods -A                            # 所有命名空间的 Pod
kubectl get deploy -n 【命名空间】            # Deployment
kubectl get sts -n 【命名空间】               # StatefulSet
kubectl get ds -n 【命名空间】                # DaemonSet
kubectl get svc -n 【命名空间】               # Service
kubectl get ingress -n 【命名空间】           # HTTP/HTTPS 路由
kubectl get cm -n 【命名空间】                # ConfigMap
kubectl get secrets -n 【命名空间】           # Secret 列表,不展开内容
kubectl get pvc -n 【命名空间】               # 持久卷声明
kubectl get pv                                # 持久卷
kubectl get sc                                # 存储类
kubectl get netpol -n 【命名空间】            # 网络策略
kubectl get crd                               # 自定义资源定义

资源名称取自对应列表的 NAME 列。Node、PV、StorageClass 和 CRD 属于集群范围,不需要 -n;CRD 是资源类型的定义,查实例要用它注册的资源名。

get pods 输出示例:

运行结果 Text
1
2
3
# NAME                   READY   STATUS             RESTARTS      AGE
# web-6d8b9f7c5d-k2p4x   1/1     Running            0             12m
# web-6d8b9f7c5d-m8q7s   0/1     CrashLoopBackOff   4 (25s ago)   8m
  • READY:就绪容器数 / 总数;RESTARTS:重启次数;AGE:Pod 对象存在时长。
  • Running 不保证应用可用;CrashLoopBackOff 表示容器反复退出后正在延迟重启,需要查详情和日志。

筛选与观察:

代码块 Shell
1
2
3
4
5
6
7
8
9
kubectl get pods -n 【命名空间】 -o wide         # 增加 Pod IP、节点等字段
kubectl get pods -n 【命名空间】 --show-labels   # 显示标签
kubectl get pods -n 【命名空间】 -w             # 持续观察,Ctrl+C 结束

# 按标签筛选;多个条件用逗号连接,需同时满足
kubectl get pods -n 【命名空间】 -l '【标签键】=【标签值】'
kubectl get pods -n 【命名空间】 -l '【键1】=【值1】,【键2】=【值2】'
# 查询指定节点上的 Pod
kubectl get pods -n 【命名空间】 --field-selector=spec.nodeName=【节点名】

3. 详情与配置

代码块 Shell
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
kubectl describe pod 【Pod名】 -n 【命名空间】  # 容器状态、配置和事件
kubectl describe node 【节点名】               # 节点容量、资源分配和事件
kubectl get deploy 【名称】 -n 【命名空间】 -o yaml  # YAML 格式
kubectl get deploy 【名称】 -n 【命名空间】 -o json  # JSON 格式
kubectl api-resources                          # 资源类型、缩写和作用范围
kubectl api-versions                           # 支持的 API 版本
kubectl explain deployment.spec.replicas        # 字段说明

# 期望副本数
kubectl get deploy 【名称】 -n 【命名空间】 -o jsonpath='{.spec.replicas}{"\n"}'
# 按事件创建时间排序
kubectl get events -n 【命名空间】 --sort-by=.metadata.creationTimestamp

describe pod 的异常输出节选:

运行结果 Text
1
2
3
4
5
6
7
# State:          Waiting
#   Reason:       CrashLoopBackOff
# Last State:     Terminated
#   Reason:       Error
#   Exit Code:    1
# Ready:          False
# Restart Count:  4

这里上一次容器以退出码 1 结束,具体原因继续看日志。describe 不支持 -o wide;扩展列表用 get -o wide。

现象优先检查
Pending调度事件、资源申请、PVC
ImagePullBackOff镜像地址、仓库认证、网络
CrashLoopBackOff上一次日志、退出码、启动配置、探针
Running 但未就绪readiness probe、容器状态、依赖服务

事件里的 Insufficient cpu 表示资源申请无法满足,不等于实时 CPU 已满。重复事件可能聚合,创建时间也不等于最后发生时间。

4. 容器日志

代码块 Shell
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
kubectl logs 【Pod名】 -n 【命名空间】 --tail=【行数】  # 最后 N 行
kubectl logs 【Pod名】 -n 【命名空间】 -f          # 持续跟踪,Ctrl+C 结束
kubectl logs 【Pod名】 -n 【命名空间】 --since=10m # 最近 10 分钟
kubectl logs 【Pod名】 -n 【命名空间】 --timestamps # 带时间戳
kubectl logs 【Pod名】 -n 【命名空间】 --previous  # 上一次容器日志
kubectl logs 【Pod名】 -n 【命名空间】 -c 【容器名】 # 指定容器

# 按标签查看多个 Pod 的全部容器日志,并标明来源
kubectl logs -n 【命名空间】 -l '【标签键】=【标签值】' --all-containers=true --prefix=true --tail=100
# 筛选关键词
kubectl logs 【Pod名】 -n 【命名空间】 --since=1h | grep -F '【关键词】'

容器名可从 describe pod 的 Containers 部分查看;多容器 Pod 用 -c 指定。上述参数可组合,例如同时使用 -f --tail=100。

Nginx 容器的 --previous 日志示例:

运行结果 Text
1
# nginx: [emerg] unknown directive "invalid_directive" in /etc/nginx/nginx.conf:12

这条错误指向 Nginx 配置第 12 行。--previous 只查同一 Pod 上一个已终止的容器实例,不能找回已删除 Pod 的日志。logs 读取标准输出和标准错误,不会自动读取应用的日志文件。

5. 容器操作

代码块 Shell
1
2
3
4
5
6
7
8
9
kubectl exec 【Pod名】 -n 【命名空间】 -- 【命令】  # 在容器内执行命令
kubectl exec -it 【Pod名】 -n 【命名空间】 -- sh    # 进入交互式 Shell

# 在指定容器内执行命令
kubectl exec 【Pod名】 -n 【命名空间】 -c 【容器名】 -- 【命令】
# 本机 → 容器;多容器 Pod 加 -c 【容器名】
kubectl cp 【本地文件】 【命名空间】/【Pod名】:【容器路径】
# 容器 → 本机
kubectl cp 【命名空间】/【Pod名】:【容器文件】 【本地路径】

将 【命令】 换成 nginx -v,在装有 Nginx 的容器中执行,输出示例:

运行结果 Text
1
# nginx version: nginx/1.28.0

-- 后面是容器内命令,镜像中必须有相应程序。容器名取自 describe pod 的 Containers 部分。cp 要求容器有 tar、目标路径可写,可能覆盖同名文件;成功时通常没有输出。

6. 服务访问

代码块 Shell
1
2
3
4
5
6
7
kubectl get svc 【服务名】 -n 【命名空间】       # 服务地址与端口
kubectl describe svc 【服务名】 -n 【命名空间】  # selector、端口和事件

# Service 对应的后端地址
kubectl get endpointslices -n 【命名空间】 -l kubernetes.io/service-name=【服务名】
# 详细配置,含地址及 conditions.ready
kubectl get endpointslices -n 【命名空间】 -l kubernetes.io/service-name=【服务名】 -o yaml

查询名为 web 的 Service 及其 EndpointSlice,列表输出示例:

运行结果 Text
1
2
3
4
5
# NAME   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
# web    ClusterIP   10.96.120.30   <none>        80/TCP    20m
#
# NAME        ADDRESSTYPE   PORTS   ENDPOINTS                AGE
# web-h7x2m   IPv4          80      10.244.1.8,10.244.2.9   20m

<none> 表示没有外部 IP。访问失败时,检查 selector、端口和后端就绪状态。Service 的 port 是访问端口,targetPort 指向容器监听端口,两者可以不同。

临时转发到本机:

代码块 Shell
1
kubectl port-forward svc/【服务名】 -n 【命名空间】 【本机端口】:【服务端口】

本机端口设为 8080、Service 端口设为 80,且对应 Pod 的 80 端口时,输出示例:

运行结果 Text
1
2
# Forwarding from 127.0.0.1:8080 -> 80
# Forwarding from [::1]:8080 -> 80

Service 需有 selector。按示例端口设置后,保持终端运行,在本机访问 http://127.0.0.1:8080。默认只监听本机,Ctrl+C 停止,选中的 Pod 终止后需重连;转发成功不代表常规 Service 访问链路正常。

7. 创建与更新

代码块 Shell
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
kubectl create namespace 【命名空间】           # 新建命名空间
kubectl create -f 【文件.yaml】                 # 按清单创建
kubectl diff -f 【文件.yaml】                   # 查看将发生的差异
kubectl apply -f 【文件.yaml】                  # 创建或更新
kubectl apply -f 【清单目录】                   # 应用目录中的清单
kubectl apply -R -f 【清单目录】                # 包含子目录
kubectl apply --dry-run=server -f 【文件.yaml】  # 服务端校验,不保存对象
kubectl edit deploy 【名称】 -n 【命名空间】    # 编辑线上对象

# 新建 Deployment,指定镜像和副本数
kubectl create deployment 【名称】 -n 【命名空间】 --image=【镜像:标签】 --replicas=【副本数】
# 为 Deployment 新建同名 Service
kubectl expose deployment 【名称】 -n 【命名空间】 --port=【服务端口】 --target-port=【容器端口】

创建命名空间内的资源时,命名空间需先存在。create 遇到同名对象会报错;apply 可更新已有对象。apply 更新 Deployment 的输出示例:

运行结果 Text
1
# deployment.apps/web configured

created / configured / unchanged 分别表示新建、已更新、无变化;不代表应用已就绪,可用 kubectl rollout status deployment/【名称】 -n 【命名空间】 确认。diff 退出码 1 表示有差异,不是执行失败。临时修改线上对象后,应同步配置来源,避免后续部署覆盖。

8. 发布管理

代码块 Shell
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
kubectl get deploy 【名称】 -n 【命名空间】       # 就绪与可用副本
kubectl rollout restart deploy/【名称】 -n 【命名空间】 # 按更新策略重建 Pod
kubectl rollout history deploy/【名称】 -n 【命名空间】 # 历史修订
kubectl rollout undo deploy/【名称】 -n 【命名空间】    # 回滚上一个修订

# 调整副本数,0 表示停止全部副本
kubectl scale deploy/【名称】 -n 【命名空间】 --replicas=【副本数】
# 更新指定容器的镜像
kubectl set image deploy/【名称】 -n 【命名空间】 【容器名】=【镜像:标签】
# 等待发布完成,最多等 120 秒
kubectl rollout status deploy/【名称】 -n 【命名空间】 --timeout=120s
# 回滚指定修订
kubectl rollout undo deploy/【名称】 -n 【命名空间】 --to-revision=【修订号】

rollout status 成功输出:

运行结果 Text
1
# deployment "web" successfully rolled out
  • scaled 只说明期望副本数已修改,仍需检查实际就绪数量。
  • 镜像值不变不会触发新发布。滚动更新能否保持服务可用,取决于副本、探针、更新策略和容量。
  • 回滚恢复仍保留的历史 Pod 模板,不恢复副本数、数据库或独立 ConfigMap;修订号也不是镜像版本。回滚后同样检查 rollout status。

9. 用量与配额

代码块 Shell
1
2
kubectl top nodes                              # 节点 CPU、内存用量
kubectl top pods -n 【命名空间】 --containers  # 按容器查看用量

两条命令的输出示例:

运行结果 Text
1
2
3
4
5
6
# NAME       CPU(cores)   CPU(%)   MEMORY(bytes)   MEMORY(%)
# worker-1   350m         8%       1536Mi          20%
# worker-2   180m         4%       1024Mi          13%
#
# POD                    NAME    CPU(cores)   MEMORY(bytes)
# web-6d8b9f7c5d-k2p4x   nginx   12m          20Mi

top 依赖资源指标 API,通常由 Metrics Server 提供。1000m 等于一个 CPU 核,Mi 是 MiB;describe node 中的容量和 Requests/Limits 不是实时用量。

命名空间配额与限制:

代码块 Shell
1
2
3
4
kubectl get resourcequota -n 【命名空间】      # 配额列表
kubectl describe resourcequota -n 【命名空间】 # 总额使用情况与上限
kubectl get limitrange -n 【命名空间】         # 单对象限制列表
kubectl describe limitrange -n 【命名空间】    # 范围与默认值

describe resourcequota 输出节选:

运行结果 Text
1
2
3
4
5
# Resource         Used    Hard
# --------         ----    ----
# pods             3       20
# requests.cpu     300m    4
# requests.memory  192Mi   8Gi

Hard 是上限,Used 是对应项目的已用额度;requests.cpu 统计申请量,不是实际 CPU 消耗。

10. 自动扩缩容

按 CPU 利用率自动扩缩容,需要集群提供 CPU 指标,并为容器设置 CPU requests。以下创建命令使用 kubectl 1.34 起支持的 --cpu 参数。

代码块 Shell
1
2
3
4
5
kubectl get hpa -n 【命名空间】                # HPA 列表、指标和副本数
kubectl describe hpa 【HPA名】 -n 【命名空间】 # 状态与失败原因

# 为 Deployment 创建 HPA,副本范围和 CPU 利用率目标按需填写
kubectl autoscale deploy 【Deployment名】 -n 【命名空间】 --min=【最小副本数】 --max=【最大副本数】 --cpu=【目标百分比】%

最小副本数为 2、最大为 5、CPU 利用率目标为 80% 时,get hpa 输出示例:

运行结果 Text
1
2
# NAME   REFERENCE        TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
# web    Deployment/web   cpu: 45%/80%   2         5         2          5m

45%/80% 分别是当前平均利用率和目标利用率,都以 CPU requests 为基准,不是节点总 CPU。HPA 受容差和稳定窗口等影响,并非达到目标就立即扩容;手工 scale 和清单中的 replicas 也可能与 HPA 相互覆盖。

11. 标签与注解

代码块 Shell
1
2
3
4
5
6
7
kubectl get pods -n 【命名空间】 -L 【标签键】  # 显示指定标签列
kubectl label pod 【Pod名】 -n 【命名空间】 【标签键】-  # 删除标签

# 添加标签;修改已有值时加 --overwrite
kubectl label pod 【Pod名】 -n 【命名空间】 【标签键】=【标签值】
# 设置注解
kubectl annotate deploy 【名称】 -n 【命名空间】 【注解键】='【注解内容】' --overwrite

添加标签的输出示例:

运行结果 Text
1
# pod/web-6d8b9f7c5d-k2p4x labeled

标签用于筛选,注解保存附加信息。直接修改 Pod 标签不会修改 Deployment 模板;要让后续 Pod 也带上标签,修改 spec.template.metadata.labels。改标签前注意 Service、网络策略等选择器的关联。

12. 删除资源

代码块 Shell
1
2
3
4
5
6
7
8
9
kubectl delete pod 【Pod名】 -n 【命名空间】    # 删除一个 Pod
kubectl delete deploy 【名称】 -n 【命名空间】  # 删除 Deployment,默认级联删除副本
kubectl delete svc 【服务名】 -n 【命名空间】   # 删除 Service
kubectl delete hpa 【名称】 -n 【命名空间】     # 删除 HPA
kubectl delete -f 【文件.yaml】                # 删除清单对应的资源
kubectl delete pods --all -n 【命名空间】       # 删除该命名空间全部 Pod

# 按标签批量删除
kubectl delete pods -n 【命名空间】 -l '【标签键】=【标签值】'

删除 Pod 的输出示例:

运行结果 Text
1
# pod "web-6d8b9f7c5d-k2p4x" deleted
  • 受 Deployment 等控制器管理的 Pod 通常会被重新创建;独立 Pod 不会因此自动重建。
  • 删除静态 Pod 的 API 镜像对象,不能停止节点上的静态 Pod,需处理节点配置。
  • --force --grace-period=0 强制移除 API 对象,不保证节点进程已停止,可能造成新旧实例同时运行。

13. 节点维护

代码块 Shell
1
2
3
kubectl cordon 【节点名】                       # 禁止普通新 Pod 调度,不迁出已有 Pod
kubectl drain 【节点名】 --ignore-daemonsets     # 驱逐符合条件的 Pod,准备维护
kubectl uncordon 【节点名】                     # 维护后恢复调度,不主动迁回 Pod

维护 worker-1 节点时,drain 成功输出节选:

运行结果 Text
1
2
3
# evicting pod default/web-6d8b9f7c5d-k2p4x
# pod/web-6d8b9f7c5d-k2p4x evicted
# node/worker-1 drained

先确认其他节点容量和应用中断条件,等 drain 成功结束后再维护。PDB(中断预算)、独立 Pod、emptyDir 都可能阻止完成;DaemonSet Pod 和静态 Pod 的镜像对象不会被它删除。

--delete-emptydir-data 表示接受丢弃临时卷数据;drain --force 允许处理没有控制器等情况,并不绕过 PDB,不能当作通用修复选项。

节点标签与污点:

代码块 Shell
1
2
3
4
kubectl label node 【节点名】 【标签键】=【标签值】  # 添加标签
kubectl label node 【节点名】 【标签键】-            # 删除标签
kubectl taint node 【节点名】 【污点键】=【污点值】:NoSchedule  # 添加污点
kubectl taint node 【节点名】 【污点键】:NoSchedule-             # 删除污点

给节点添加 NoSchedule 污点后,新 Pod 必须配置匹配的容忍规则(toleration),才能被调度到该节点;已经运行的 Pod 不会因此被驱逐。

标签需配合节点选择规则;污点与 cordon 独立,移除一个不会清除另一个。

评论

使用 GitHub 登录后参与讨论,评论将公开保存在 GitHub。

阅读到这里时加载评论。