K8s学习笔记(三) kubectl 常用命令
1 kubectl get service 获取服务
kubectl get service
是 Kubernetes 命令行工具 kubectl
中用于查看集群中 Service 资源 的常用命令。
功能说明:
该命令会列出当前命名空间(默认是 default
命名空间)中所有的 Service 资源,展示服务的基本信息,帮助了解服务的状态、访问方式等。
输出内容解读(默认格式):
执行后通常会显示以下列信息:
NAME
:Service 的名称(用户定义的服务标识)。- TYPE:Service 的类型,常见类型有:
ClusterIP
:默认类型,仅在集群内部可访问,分配一个集群内部 IP。NodePort
:在每个节点上开放一个静态端口,可通过节点IP:NodePort
访问。LoadBalancer
:结合云服务商的负载均衡器,提供外部可访问的 IP。ExternalName
:通过 DNS 别名映射到外部服务(无集群 IP)。
CLUSTER-IP
:Service 的集群内部 IP(ExternalName
类型无此值)。EXTERNAL-IP
:外部可访问的 IP(仅LoadBalancer
等类型可能有值)。PORT(S)
:服务暴露的端口信息,格式为内部端口:外部端口/协议
(如80:30080/TCP
)。AGE
:Service 创建至今的时间。
示例输出:
root@master1:~# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 42h
常用扩展选项:
-
查看所有命名空间的 Service:
kubectl get service --all-namespaces #(或简写-A)root@master1:~# kubectl get service --all-namespaces NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 42h kube-system kube-dns ClusterIP 10.100.0.2 <none> 53/UDP,53/TCP,9153/TCP 15h kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.100.34.202 <none> 8000/TCP 13h kubernetes-dashboard kubernetes-dashboard NodePort 10.100.18.123 <none> 443:30004/TCP 13h
-
查看指定命名空间的 Service:
kubectl get service -n <命名空间名称>root@master1:~# kubectl get service -n kubernetes-dashboard NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dashboard-metrics-scraper ClusterIP 10.100.34.202 <none> 8000/TCP 13h kubernetes-dashboard NodePort 10.100.18.123 <none> 443:30004/TCP 13h
-
显示更详细信息(如标签、选择器等):
kubectl get service -o wideroot@master1:~# kubectl get service -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 42h <none>
-
查看单个 Service 的详细配置(YAML 格式):
kubectl get service <服务名称> -o yamlroot@master1:~# kubectl get service kubernetes-dashboard -n kubernetes-dashboard -o yaml apiVersion: v1 kind: Service metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"k8s-app":"kubernetes-dashboard"},"name":"kubernetes-dashboard","namespace":"kubernetes-dashboard"},"spec":{"ports":[{"nodePort":30004,"port":443,"targetPort":8443}],"selector":{"k8s-app":"kubernetes-dashboard"},"type":"NodePort"}}creationTimestamp: "2025-09-22T13:25:20Z"labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboardresourceVersion: "101500"uid: 37b1ca44-ea19-4344-b4cf-053436886163 spec:clusterIP: 10.100.18.123clusterIPs:- 10.100.18.123externalTrafficPolicy: ClusterinternalTrafficPolicy: ClusteripFamilies:- IPv4ipFamilyPolicy: SingleStackports:- nodePort: 30004port: 443protocol: TCPtargetPort: 8443selector:k8s-app: kubernetes-dashboardsessionAffinity: Nonetype: NodePort status:loadBalancer: {}
关键用途:
- 验证服务与 Pod 的关联:通过
SELECTOR
确认服务的标签选择器是否正确,避免因选择器错误导致服务找不到 Pod。 - 检查后端端点状态:通过
ENDPOINTS
确认是否有健康的 Pod 被服务关联。若ENDPOINTS
为空,需检查 Pod 标签是否与服务选择器匹配、Pod 是否处于Running
状态且就绪(Ready
为True
)。 - 定位具体 Pod 地址:直接查看流量实际转发到哪些 Pod 的 IP,方便针对性排查 Pod 问题。
2 kubectl get pods 获取pod
kubectl get pods
是 Kubernetes 中最常用的命令之一,用于查看集群中 Pod 资源 的状态和基本信息。Pod 是 Kubernetes 中最小的部署单元,通常包含一个或多个紧密关联的容器。
功能说明:
该命令会列出当前命名空间(默认是 default
命名空间)中所有的 Pod,展示 Pod 的名称、运行状态、容器就绪情况等核心信息,帮助快速了解应用的部署状态。
输出内容解读(默认格式):
执行后通常会显示以下列信息:
NAME
:Pod 的名称(由用户定义或自动生成,通常包含部署名称和随机字符串)。READY
:Pod 中 就绪的容器数 / 总容器数(例如1/1
表示 1 个容器全部就绪,0/2
表示 2 个容器都未就绪)。容器就绪意味着它可以接收请求。- STATUS:Pod 的当前状态,常见状态包括:
Running
:Pod 正在运行,所有容器都已启动且至少一个容器在运行中。Pending
:Pod 正在等待调度(如资源不足)或镜像拉取中。Succeeded
:Pod 中所有容器正常结束(如一次性任务完成)。Failed
:Pod 中至少一个容器异常退出且不会重启。CrashLoopBackOff
:容器启动后反复崩溃(Kubernetes 会尝试重启,但持续失败)。Unknown
:Kubernetes 无法获取 Pod 状态(通常是节点通信问题)。
RESTARTS
:Pod 中容器的 累计重启次数(若频繁重启,可能是容器存在 bug 或配置问题)。AGE
:Pod 创建至今的时间。
示例输出:
root@master1:~# kubectl get pods
NAME READY STATUS RESTARTS AGE
net-test1 1/1 Running 3 (11h ago) 39h
net-test2 1/1 Running 3 (11h ago) 39h
net-test3 1/1 Running 2 (11h ago) 39h
常用扩展选项:
-
查看所有命名空间的 Pod:
kubectl get pods --all-namespaces #(或简写-A)root@master1:~# kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE default net-test1 1/1 Running 3 (11h ago) 39h default net-test2 1/1 Running 3 (11h ago) 39h default net-test3 1/1 Running 2 (11h ago) 39h kube-system calico-kube-controllers-754966f84c-nb8mt 1/1 Running 3 (11h ago) 42h kube-system calico-node-29mld 1/1 Running 3 (11h ago) 42h kube-system calico-node-4rnzt 1/1 Running 4 (11h ago) 42h kube-system calico-node-p4ddl 1/1 Running 3 (11h ago) 42h kube-system calico-node-rn7fk 1/1 Running 9 (11h ago) 42h kube-system coredns-7db6b45f67-ht47r 1/1 Running 1 (11h ago) 15h kube-system coredns-7db6b45f67-xpzmr 1/1 Running 1 (11h ago) 15h kubernetes-dashboard dashboard-metrics-scraper-69d947947b-94c4p 1/1 Running 1 (11h ago) 13h kubernetes-dashboard kubernetes-dashboard-744bdb9f9b-f2zns 1/1 Running 1 (11h ago) 13h
-
查看指定命名空间的 Pod:
kubectl get pods -n <命名空间名称>root@master1:~# kubectl get pods -n kubernetes-dashboard NAME READY STATUS RESTARTS AGE dashboard-metrics-scraper-69d947947b-94c4p 1/1 Running 1 (11h ago) 13h kubernetes-dashboard-744bdb9f9b-f2zns 1/1 Running 1 (11h ago) 13h
-
显示更详细信息(如所在节点、Pod IP 等):
kubectl get pods -o wideroot@master1:~# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES net-test1 1/1 Running 3 (11h ago) 39h 10.200.166.141 192.168.121.111 <none> <none> net-test2 1/1 Running 3 (11h ago) 39h 10.200.166.140 192.168.121.111 <none> <none> net-test3 1/1 Running 2 (11h ago) 39h 10.200.104.7 192.168.121.112 <none> <none>
-
查看单个 Pod 的详细配置(YAML 格式):
kubectl get pod <pod名称> -o yamlroot@master1:~# kubectl get pods net-test1 -o yaml apiVersion: v1 kind: Pod metadata:creationTimestamp: "2025-09-21T11:26:13Z"labels:run: net-test1name: net-test1namespace: defaultresourceVersion: "114577"uid: 2570abce-ebf0-49bc-a151-ad2042752743 ...
-
只显示运行中的 Pod:
kubectl get pods --field-selector=status.phase=Runningroot@master1:~# kubectl get pods --field-selector=status.phase=Running NAME READY STATUS RESTARTS AGE net-test1 1/1 Running 3 (11h ago) 39h net-test2 1/1 Running 3 (11h ago) 39h net-test3 1/1 Running 2 (11h ago) 39h
-
监控 Pod 状态变化(实时刷新):
kubectl get pods -w #(-w表示 watch,持续监听)root@master1:~# kubectl get pods -w NAME READY STATUS RESTARTS AGE net-test1 1/1 Running 3 (11h ago) 39h net-test2 1/1 Running 3 (11h ago) 39h net-test3 1/1 Running 2 (11h ago) 39h
关键用途:
- 快速检查应用是否正常运行(
STATUS
为Running
且READY
状态正常)。 - 定位异常 Pod(如
CrashLoopBackOff
状态需检查容器日志:kubectl logs <pod名称>
)。 - 确认 Pod 调度情况(结合
-o wide
查看所在节点)。
如果 Pod 状态异常,需要结合 kubectl describe pod <pod名称>
查看详细事件(如调度失败原因、镜像拉取错误等)进一步排查。
3 kubectl get deployment
kubectl get deployment
是用于查看 Kubernetes 集群中 Deployment 资源 的命令。Deployment 是 Kubernetes 中用于管理 Pod 和 ReplicaSet 的核心资源,负责确保指定数量的 Pod 副本始终运行,并且支持滚动更新、回滚等高级功能。
功能说明:
该命令会列出当前命名空间(默认是 default
命名空间)中所有的 Deployment,展示部署的基本状态、副本数量等信息,帮助了解应用的部署进度、副本状态和更新情况。
输出内容解读(默认格式):
执行后通常会显示以下列信息:
NAME
:Deployment 的名称(用户定义的部署标识)。READY
:就绪的 Pod 副本数 / 期望的总副本数(例如3/3
表示 3 个副本全部就绪,2/3
表示还有 1 个未就绪)。就绪意味着 Pod 可以正常接收请求。UP-TO-DATE
:已更新到 最新版本 的 Pod 副本数(符合当前 Deployment 配置的副本数量)。在滚动更新时,这个数值会逐渐增加到期望副本数。AVAILABLE
:当前 可用的 Pod 副本数(处于 Running 状态且就绪的副本),反映实际可提供服务的数量。AGE
:Deployment 创建至今的时间。
示例输出:
root@master1:~# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
calico-kube-controllers 1/1 1 1 42h
coredns 2/2 2 2 16h
dashboard-metrics-scraper 1/1 1 1 13h
kubernetes-dashboard 1/1 1 1 13
常用扩展选项:
-
查看所有命名空间的 Deployment:
kubectl get deployment --all-namespaces #(或简写-A)root@master1:~# kubectl get deployment -A NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE kube-system calico-kube-controllers 1/1 1 1 42h kube-system coredns 2/2 2 2 16h kubernetes-dashboard dashboard-metrics-scraper 1/1 1 1 13h kubernetes-dashboard kubernetes-dashboard 1/1 1 1 13h
-
查看指定命名空间的 Deployment:
kubectl get deployment -n <命名空间名称>root@master1:~# kubectl get deployment -n kubernetes-dashboard NAME READY UP-TO-DATE AVAILABLE AGE dashboard-metrics-scraper 1/1 1 1 14h kubernetes-dashboard 1/1 1 1 14h
-
显示更详细信息(如标签、镜像版本等):
kubectl get deployment -o wide root@master1:~# kubectl get deployment -o wide -A NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR kube-system calico-kube-controllers 1/1 1 1 42h calico-kube-controllers docker.io/calico/k
(额外增加CONTAINERS(容器名)、IMAGES(镜像地址)、SELECTOR(关联的 Pod 选择器)等字段)
-
查看单个 Deployment 的详细配置(YAML 格式):
kubectl get deployment <部署名称> -o yamlroot@master1:~# kubectl get deployment coredns -n kube-system -o yaml apiVersion: apps/v1 kind: Deployment metadata:annotations:deployment.kubernetes.io/revision: "1"kubectl.kubernetes.io/last-applied-configuration: |
-
监控 Deployment 状态变化(实时刷新):
kubectl get deployment -w # (适合观察滚动更新过程)
关键用途:
- 确认部署状态:通过
READY
和AVAILABLE
检查应用是否按预期运行(是否达到期望副本数)。 - 跟踪更新进度:在滚动更新时,
UP-TO-DATE
会逐步增长,直到与READY
一致,表明更新完成。 - 检查镜像版本:结合
-o wide
可快速查看 Deployment 使用的容器镜像,确认是否部署了正确的版本。 - 排查异常:若
READY
长期小于期望副本数(如0/3
),可能是镜像拉取失败、资源不足等问题,需结合kubectl describe deployment <名称>
查看事件详情。
例如,当执行滚动更新(kubectl set image deployment/<名称> <容器名>=<新镜像>
)时,通过 kubectl get deployment -w
可以实时看到 UP-TO-DATE
逐渐增加,旧版本副本被替换,直到更新完成。
4 kubectl describe 查看资源信息
kubectl describe
是 Kubernetes 命令行工具 kubectl
中用于查看资源详细信息的核心命令,它能展示比 kubectl get
更全面的资源状态、配置及相关事件,是排查问题的重要工具。
基本语法
kubectl describe <资源类型> <资源名称> [选项]
<资源类型>
:可以是 Kubernetes 中的各类资源(如 pod、service、deployment、node、configmap 等,支持缩写,如po
代表 pod)。<资源名称>
:具体资源的名称(需与资源类型对应)。- 常用选项:
--namespace <命名空间>
(指定资源所在的命名空间,默认是default
)。
常用示例
-
查看 Pod 详细信息
查看名为
my-pod
的 Pod 详细状态(包括容器状态、重启次数、事件等):kubectl describe pod <pod名称>root@master1:~# kubectl describe pods net-test1 Name: net-test1 Namespace: default Priority: 0 Node: 192.168.121.111/192.168.121.111 Start Time: Sun, 21 Sep 2025 19:26:13 +0800 Labels: run=net-test1 Annotations: <none> Status: Running IP: 10.200.166.144 IPs:IP: 10.200.166.144
-
查看节点信息
查看ip为
192.168.121.111
的节点详情(包括资源分配、标签、污点、运行的 Pod 等):kubectl describe node <节点ip>root@master1:~# kubectl describe node 192.168.121.111 Name: 192.168.121.111 Roles: node Labels: beta.kubernetes.io/arch=amd64beta.kubernetes.io/os=linuxkubernetes.io/arch=amd64kubernetes.io/hostname=192.168.121.111kubernetes.io/os=linuxkubernetes.io/role=node Annotations: node.alpha.kubernetes.io/ttl: 0volumes.kubernetes.io/controller-managed-attach-detach: true CreationTimestamp: Sun, 21 Sep 2025 16:42:22 +0800 Taints: <none> Unschedulable: false Lease:HolderIdentity: 192.168.121.111 ...
-
查看 Deployment 信息
查看名为
coredns
的 Deployment 详情(包括副本数、更新策略、关联的 ReplicaSet 等):kubectl describe deployment <deployment名称>root@master1:~# kubectl describe deployment coredns -n kube-system Name: coredns Namespace: kube-system CreationTimestamp: Mon, 22 Sep 2025 19:17:38 +0800 Labels: addonmanager.kubernetes.io/mode=Reconcilek8s-app=kube-dnskubernetes.io/cluster-service=truekubernetes.io/name=CoreDNS Annotations: deployment.kubernetes.io/revision: 1 Selector: k8s-app=kube-dns Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 1 max unavailable, 25% max surge ...
-
指定命名空间
查看
kubernetes-dashboard
命名空间中名为kubernetes-dashboard-744bdb9f9b-f2zns
的 Pod 信息:kubectl describe pod <pod名称> --namespace <命名空间>root@master1:~# kubectl describe pod kubernetes-dashboard-744bdb9f9b-f2zns -n kubernetes-dashboard Name: kubernetes-dashboard-744bdb9f9b-f2zns Namespace: kubernetes-dashboard Priority: 0 Node: 192.168.121.112/192.168.121.112 Start Time: Mon, 22 Sep 2025 21:25:21 +0800 Labels: k8s-app=kubernetes-dashboardpod-template-hash=744bdb9f9b Annotations: seccomp.security.alpha.kubernetes.io/pod: runtime/default Status: Running IP: 10.200.104.6 IPs:IP: 10.200.104.6
输出信息解读
kubectl describe
的输出通常包含以下关键部分(因资源类型不同略有差异):
- Metadata:资源的元数据(名称、命名空间、标签、创建时间等)。
- Spec:资源的期望状态配置(如 Pod 的容器镜像、端口、资源限制等)。
- Status:资源的当前状态(如 Pod 的就绪状态、IP 地址、容器运行状态等)。
- Events:与该资源相关的事件日志(如调度成功、启动失败、资源不足等,是排查问题的核心依据)。
与 kubectl get
的区别
-
kubectl get:快速查看资源的列表或基本信息(如名称、状态、IP 等),适合快速概览。
示例:
kubectl get pods
查看所有 Pod 列表。
-
kubectl describe
:深入展示单个资源的详细状态和关联事件,适合排查故障(如 Pod 启动失败、服务无法访问等)。
5 kubectl apply 创建或更新资源
kubectl apply -f <文件路径>
是 Kubernetes 中声明式创建或更新资源的核心命令,用于通过配置文件(通常是 YAML 或 JSON 格式)定义 Kubernetes 资源(如 Pod、Deployment、Service 等),并让集群根据配置文件的 “期望状态” 自动创建或更新资源。
核心功能:
- 创建资源:如果配置文件中定义的资源在集群中不存在,
apply
会根据配置创建该资源。 - 更新资源:如果资源已存在,
apply
会对比当前配置与集群中资源的实际状态,仅更新差异部分(不会删除后重建,除非配置有根本性变更)。 - 支持批量操作:可同时处理多个配置文件或目录,批量创建 / 更新资源。
基本用法:
-f
选项用于指定配置文件的路径,支持以下几种形式:
-
单个文件
应用单个 YAML/JSON 配置文件:
kubectl apply -f deployment.yaml # 部署名为 deployment.yaml 的配置文件
-
多个文件
同时应用多个配置文件(用空格分隔):
kubectl apply -f pod.yaml -f service.yaml # 同时部署 Pod 和 Service 配置
-
目录下所有文件
应用指定目录中所有 YAML/JSON 文件(按文件名顺序执行):
kubectl apply -f ./k8s-configs/ # 应用 k8s-configs 目录下的所有配置文件
-
URL 路径
从远程 URL 加载配置文件并应用(适用于公开的配置模板):
kubectl apply -f https://example.com/k8s/nginx-deploy.yaml
与 kubectl create
的区别:
kubectl create -f <文件>
:命令式创建,仅用于创建新资源。如果资源已存在,会直接报错(Error from server (AlreadyExists)
)。kubectl apply -f <文件>
:声明式管理,无论资源是否存在,都会确保集群状态与配置文件一致(存在则更新,不存在则创建)。
推荐使用 apply
,因为它更适合持续部署和配置更新,尤其在资源需要频繁调整的场景(如滚动更新镜像、修改资源限制等)。
配置文件示例(YAML):
以下是一个简单的 Deployment 配置文件(nginx-deploy.yaml
),用于部署 Nginx:
apiVersion: apps/v1 # 资源的 API 版本(需与 Kubernetes 版本匹配)
kind: Deployment # 资源类型(此处为 Deployment)
metadata:name: nginx-deploy # 资源名称
spec:replicas: 3 # 期望的 Pod 副本数selector:matchLabels:app: nginx # 关联的 Pod 标签template: # Pod 模板metadata:labels:app: nginx # Pod 标签(需与 selector 匹配)spec:containers:- name: nginx # 容器名称image: nginx:1.23 # 容器镜像ports:- containerPort: 80 # 容器暴露的端口
执行 kubectl apply -f nginx-deploy.yaml
后,集群会创建一个名为 nginx-deploy
的 Deployment,并启动 3 个 Nginx Pod。
常用扩展:
-
查看应用后的资源状态:
kubectl get deployment nginx-deploy # 检查 Deployment 状态 kubectl get pods -l app=nginx # 检查关联的 Pod
-
查看资源的详细配置(验证更新是否生效):
kubectl describe deployment nginx-deploy
-
若配置文件修改后,再次执行
kubectl apply -f <文件>
即可更新资源(例如修改镜像版本或副本数)。
注意事项:
- 配置文件的
apiVersion
必须与集群版本兼容(如apps/v1
是 Deployment 的稳定版本,旧版本可能用extensions/v1beta1
已废弃)。 - 资源的
kind
需正确(如Pod
、Deployment
、Service
等),否则会创建失败。 - 若需删除通过
apply
创建的资源,使用kubectl delete -f <文件>
(而非手动指定资源名称,避免遗漏关联资源)。
kubectl apply -f
是 Kubernetes 中 “基础设施即代码(IaC)” 理念的核心工具,通过配置文件可清晰管理资源,便于版本控制和团队协作。
6 kubectl exec 进入容器
kubectl exec
是 Kubernetes 中用于在运行的 Pod 内的容器中执行命令的工具,常用于调试、检查容器内部状态或临时操作(如查看日志、修改配置文件等)。
核心功能:
通过该命令可以直接在指定 Pod 的容器中运行命令,就像 “远程登录” 到容器内部执行操作一样。支持交互式操作(如进入终端)或非交互式执行单条命令。
基本用法:
kubectl exec <pod名称> -- <要执行的命令>
<pod名称>
:目标 Pod 的名称(可通过kubectl get pods
获取)。--
:分隔符,用于区分kubectl
的选项和要在容器中执行的命令(避免命令中的选项被kubectl
误解析)。<要执行的命令>
:在容器内运行的具体命令(如ls
、cat
、bash
等)。
常用场景与示例:
1. 非交互式执行单条命令
在 Pod 内执行简单命令(如查看文件、检查进程等):
# 查看 Pod 内的目录结构
kubectl exec nginx-pod -- ls /usr/share/nginx/html# 查看容器内的环境变量
kubectl exec nginx-pod -- env# 检查容器内的进程
kubectl exec nginx-pod -- ps aux
2. 交互式进入容器终端(最常用)
通过 -it
选项(-i
保持标准输入打开,-t
分配伪终端)进入容器的交互式终端,类似 ssh
登录:
# 进入容器的 bash 终端(若容器内有 bash)
kubectl exec -it nginx-pod -- /bin/bash# 若容器内没有 bash,可用 sh(大多数容器支持)
kubectl exec -it nginx-pod -- /bin/sh
进入终端后,即可像在本地机器上一样执行命令(如 cd
、vi
、curl
等),退出终端用 exit
命令。
3. 当 Pod 包含多个容器时
一个 Pod 可能运行多个容器(如应用容器 + 日志收集容器),需用 -c <容器名称>
指定目标容器:
# 查看 Pod 中名为 "app-container" 的容器内的日志文件
kubectl exec my-pod -c app-container -- cat /var/log/app.log# 进入 Pod 中名为 "sidecar" 的容器终端
kubectl exec -it my-pod -c sidecar -- /bin/bash
(容器名称可通过 kubectl describe pod <pod名称>
在 Containers
部分查看)
注意事项:
- Pod 状态要求:目标 Pod 必须处于
Running
状态,且容器必须处于运行中(State: Running
),否则会报错(如Error from server (BadRequest): container not running
)。 - 命令存在性:容器内必须包含要执行的命令(如
bash
、ls
等),否则会提示 “命令不存在”(例如:OCI runtime exec failed: exec failed: ...: no such file or directory
)。 - 权限限制:
- 执行的命令受容器内用户权限限制(如非 root 容器可能无法修改某些文件)。
- Kubernetes 集群可能通过 SecurityContext 限制
exec
操作(较少见)。
- 退出终端:若用
-it
进入终端后断开连接,需用exit
正常退出,避免残留进程。
典型用途:
- 调试应用:进入容器检查配置文件、依赖库是否正确。
- 排查网络:在容器内执行
ping
、curl
测试网络连通性。 - 查看实时日志:若日志未输出到标准输出(
kubectl logs
无法获取),可直接进入容器查看日志文件。 - 临时修改配置:紧急情况下在容器内临时调整配置(注意:容器重启后修改会丢失,需同步更新镜像或配置文件)。
kubectl exec
是 Kubernetes 调试的 “利器”,配合 kubectl logs
(查看日志)和 kubectl describe pod
(查看事件),可快速定位容器内的问题。
7 kubectl logs 查看日志
kubectl logs
是 Kubernetes 中用于查看 Pod 内容器日志的核心命令,主要获取容器的标准输出(stdout)和标准错误(stderr)信息,是排查应用运行异常的重要工具。
核心功能:
通过该命令可以直接获取 Pod 中容器的日志输出,无需进入容器内部。日志内容通常包括应用的运行信息、错误堆栈、业务日志等,帮助定位应用代码或配置问题。
基本用法:
kubectl logs <pod名称>
<pod名称>
:目标 Pod 的名称(可通过kubectl get pods
获取)。- 默认情况下,若 Pod 中只有一个容器,会直接输出该容器的日志;若有多个容器,需用
-c <容器名称>
指定目标容器。
常用场景与示例:
1. 查看单个容器的日志
当 Pod 中只有一个容器时,直接指定 Pod 名称即可:
# 查看 dashboard 的日志
root@master1:~# kubectl logs kubernetes-dashboard-744bdb9f9b-f2zns
2025/09/23 02:28:23 Starting overwatch
2025/09/23 02:28:23 Using namespace: kubernetes-dashboard
2. 查看 Pod 中指定容器的日志
若 Pod 包含多个容器(如应用容器 + 辅助容器),必须用 -c <容器名称>
明确指定:
# 查看 my-app-pod 中名为 "app-container" 的容器日志
kubectl logs my-app-pod -c app-container
(容器名称可通过 kubectl describe pod <pod名称>
在 Containers
部分查看)
3. 实时跟踪日志(类似 tail -f
)
用 -f
选项实时输出新产生的日志,适合监控应用动态:
# 实时跟踪 nginx-pod 的日志
kubectl logs nginx-pod -f
4. 查看最近的日志(过滤行数或时间)
-
--tail <数字>
:只显示最后 N 行日志(默认显示全部):# 只显示 nginx-pod 最后 100 行日志 kubectl logs nginx-pod --tail 100
-
--since <时间>
:只显示最近一段时间的日志(支持s
秒、m
分、h
时、d
天):# 显示 nginx-pod 最近 10 分钟的日志 kubectl logs nginx-pod --since 10m
-
结合使用:
# 显示最近 1 小时内的最后 50 行日志 kubectl logs nginx-pod --since 1h --tail 50
5. 查看已终止容器的日志
如果容器已崩溃或终止(如 CrashLoopBackOff
状态),用 --previous
(或 -p
)查看上一次运行的日志:
# 查看 error-pod 上一次崩溃的日志
kubectl logs error-pod -p
注意事项:
- Pod 状态要求:
- 日志只能从处于
Running
或已终止(Terminated
)但未被删除的 Pod 中获取。 - 若 Pod 已被删除(如 Deployment 滚动更新后旧 Pod 被清理),无法通过此命令查看日志(需依赖集群日志收集系统,如 ELK、Promtail 等)。
- 日志只能从处于
- 日志存储限制:
- 容器日志默认存储在节点的
/var/log/pods
目录(由容器运行时管理),通常有大小或时间限制(避免占满磁盘)。 - 若应用将日志写入容器内的文件(而非标准输出),
kubectl logs
无法直接获取,需用kubectl exec
进入容器查看文件(如kubectl exec <pod> -- cat /var/log/app.log
)。
- 容器日志默认存储在节点的
- 权限限制:
- 用户需有访问该 Pod 的权限(通过 RBAC 控制),否则会提示 “权限不足”。
典型用途:
- 快速定位应用错误:查看日志中的错误信息(如
ERROR
级别日志、堆栈跟踪)。 - 验证应用启动状态:检查应用是否正常初始化(如 “服务启动成功” 等关键日志)。
- 监控实时业务日志:用
-f
跟踪用户请求、数据处理等实时输出。 - 分析容器崩溃原因:结合
-p
查看崩溃前的日志,定位退出原因。
kubectl logs
与 kubectl exec
(进入容器)、kubectl describe pod
(查看事件)共同构成了 Kubernetes 应用调试的 “三板斧”,是日常运维的必备工具。
8 kubectl explain 查询资源字段
kubectl explain
是Kubernetes 中用于查询资源字段说明的工具,能帮助理解各种 Kubernetes 资源(如 Pod、Deployment、Service 等)的配置字段含义、类型、是否必需等,是编写 YAML 配置文件时的重要参考。
核心功能:
kubectl explain
可以解析 Kubernetes API 定义,输出指定资源的字段结构和详细说明,包括:
- 字段的名称和类型(如
string
、integer
、object
等)。 - 字段的描述(说明该字段的用途)。
- 字段是否为必需(
required
或optional
)。 - 嵌套字段的层级结构(如
spec.template.spec.containers
等)。
基本用法:
kubectl explain <资源类型> [.嵌套字段]
<资源类型>
:如pod
、deployment
、service
、configmap
等(区分大小写,通常用小写)。[.嵌套字段]
:可选,用于查看资源的嵌套字段(如pod.spec
、deployment.spec.replicas
等)。
常用示例:
1. 查看资源的顶层字段
了解某个资源的基本结构和顶层字段:
# 查看 Pod 的顶层字段(如 apiVersion、kind、metadata、spec、status 等)
kubectl explain pod# 查看 Deployment 的顶层字段
kubectl explain deployment
2. 查看嵌套字段的详细说明
当需要配置资源的具体子字段时(如 Pod 中的容器配置),可通过嵌套路径查询:
# 查看 Pod 的 spec 字段(包含 Pod 的核心配置)
kubectl explain pod.spec# 查看 Pod 中容器的配置字段(如 image、ports、resources 等)
kubectl explain pod.spec.containers# 查看 Deployment 中副本数(replicas)的说明
kubectl explain deployment.spec.replicas
3. 查看更深层级的字段
对于多层嵌套的字段(如容器的资源限制),可继续追加路径:
# 查看容器的资源限制字段(requests 和 limits)
kubectl explain pod.spec.containers.resources# 查看容器的存活探针(livenessProbe)配置
kubectl explain pod.spec.containers.livenessProbe
4. 指定 API 版本(可选)
某些资源可能有多个 API 版本(如 Deployment 常用 apps/v1
),可通过 --api-version
指定:
kubectl explain deployment --api-version=apps/v1
输出内容解读:
以 kubectl explain pod.spec.containers.image
为例,输出大致如下:
KIND: Pod
VERSION: v1FIELD: image <string>DESCRIPTION:Container image name. More info:https://kubernetes.io/docs/concepts/containers/images This field isoptional to allow higher level config management to default or overridecontainer images in workload controllers like Deployments and StatefulSets.
FIELD: image <string>
:字段名为image
,类型为字符串。DESCRIPTION
:说明该字段用于指定容器镜像的名称,并提供了官方文档链接。
关键用途:
- 编写配置文件时查缺补漏:不清楚某个字段的含义或格式时,快速查询(无需翻阅官方文档)。
- 验证配置正确性:确认字段是否存在、类型是否正确(如避免将数字类型写成字符串)。
- 学习资源结构:帮助理解 Kubernetes 资源的层级关系(如
spec.template
是 Pod 模板的固定路径)。
注意事项:
- 资源类型需使用正确的名称(如
pod
而非pods
,deployment
而非deployments
)。 - 嵌套字段的路径需正确(可通过逐层查询确认,如先查
pod.spec
再查pod.spec.containers
)。 - 输出中的
required: true
表示该字段为必需项(如metadata.name
是所有资源的必需字段),缺失会导致配置无效。
kubectl explain
是 Kubernetes 配置的 “实时字典”,尤其对新手编写 YAML 配置非常有帮助,建议在不确定字段含义时优先使用。