当前位置: 首页 > news >正文

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: {}

关键用途:

  1. 验证服务与 Pod 的关联:通过 SELECTOR 确认服务的标签选择器是否正确,避免因选择器错误导致服务找不到 Pod。
  2. 检查后端端点状态:通过 ENDPOINTS 确认是否有健康的 Pod 被服务关联。若 ENDPOINTS 为空,需检查 Pod 标签是否与服务选择器匹配、Pod 是否处于 Running 状态且就绪(ReadyTrue)。
  3. 定位具体 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
    

关键用途:

  • 快速检查应用是否正常运行(STATUSRunningREADY 状态正常)。
  • 定位异常 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    # (适合观察滚动更新过程)
    

关键用途:

  1. 确认部署状态:通过 READYAVAILABLE 检查应用是否按预期运行(是否达到期望副本数)。
  2. 跟踪更新进度:在滚动更新时,UP-TO-DATE 会逐步增长,直到与 READY 一致,表明更新完成。
  3. 检查镜像版本:结合 -o wide 可快速查看 Deployment 使用的容器镜像,确认是否部署了正确的版本。
  4. 排查异常:若 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)。

常用示例

  1. 查看 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
  2. 查看节点信息

    查看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
    ...
    
  3. 查看 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
    ...
    
  4. 指定命名空间

    查看 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 选项用于指定配置文件的路径,支持以下几种形式:

  1. 单个文件

    应用单个 YAML/JSON 配置文件:

    kubectl apply -f deployment.yaml  # 部署名为 deployment.yaml 的配置文件
    
  2. 多个文件

    同时应用多个配置文件(用空格分隔):

    kubectl apply -f pod.yaml -f service.yaml  # 同时部署 Pod 和 Service 配置
    
  3. 目录下所有文件

    应用指定目录中所有 YAML/JSON 文件(按文件名顺序执行):

    kubectl apply -f ./k8s-configs/  # 应用 k8s-configs 目录下的所有配置文件
    
  4. 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 <文件> 即可更新资源(例如修改镜像版本或副本数)。

注意事项:

  1. 配置文件的 apiVersion 必须与集群版本兼容(如 apps/v1 是 Deployment 的稳定版本,旧版本可能用 extensions/v1beta1 已废弃)。
  2. 资源的 kind 需正确(如 PodDeploymentService 等),否则会创建失败。
  3. 若需删除通过 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 误解析)。
  • <要执行的命令>:在容器内运行的具体命令(如 lscatbash 等)。

常用场景与示例:

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

进入终端后,即可像在本地机器上一样执行命令(如 cdvicurl 等),退出终端用 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 部分查看)

注意事项:

  1. Pod 状态要求:目标 Pod 必须处于 Running 状态,且容器必须处于运行中(State: Running),否则会报错(如 Error from server (BadRequest): container not running)。
  2. 命令存在性:容器内必须包含要执行的命令(如 bashls 等),否则会提示 “命令不存在”(例如:OCI runtime exec failed: exec failed: ...: no such file or directory)。
  3. 权限限制
    • 执行的命令受容器内用户权限限制(如非 root 容器可能无法修改某些文件)。
    • Kubernetes 集群可能通过 SecurityContext 限制 exec 操作(较少见)。
  4. 退出终端:若用 -it 进入终端后断开连接,需用 exit 正常退出,避免残留进程。

典型用途:

  • 调试应用:进入容器检查配置文件、依赖库是否正确。
  • 排查网络:在容器内执行 pingcurl 测试网络连通性。
  • 查看实时日志:若日志未输出到标准输出(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

注意事项:

  1. Pod 状态要求
    • 日志只能从处于 Running 或已终止(Terminated)但未被删除的 Pod 中获取。
    • 若 Pod 已被删除(如 Deployment 滚动更新后旧 Pod 被清理),无法通过此命令查看日志(需依赖集群日志收集系统,如 ELK、Promtail 等)。
  2. 日志存储限制
    • 容器日志默认存储在节点的 /var/log/pods 目录(由容器运行时管理),通常有大小或时间限制(避免占满磁盘)。
    • 若应用将日志写入容器内的文件(而非标准输出),kubectl logs 无法直接获取,需用 kubectl exec 进入容器查看文件(如 kubectl exec <pod> -- cat /var/log/app.log)。
  3. 权限限制
    • 用户需有访问该 Pod 的权限(通过 RBAC 控制),否则会提示 “权限不足”。

典型用途:

  • 快速定位应用错误:查看日志中的错误信息(如 ERROR 级别日志、堆栈跟踪)。
  • 验证应用启动状态:检查应用是否正常初始化(如 “服务启动成功” 等关键日志)。
  • 监控实时业务日志:用 -f 跟踪用户请求、数据处理等实时输出。
  • 分析容器崩溃原因:结合 -p 查看崩溃前的日志,定位退出原因。

kubectl logskubectl exec(进入容器)、kubectl describe pod(查看事件)共同构成了 Kubernetes 应用调试的 “三板斧”,是日常运维的必备工具。

8 kubectl explain 查询资源字段

kubectl explain 是Kubernetes 中用于查询资源字段说明的工具,能帮助理解各种 Kubernetes 资源(如 Pod、Deployment、Service 等)的配置字段含义、类型、是否必需等,是编写 YAML 配置文件时的重要参考。

核心功能:

kubectl explain 可以解析 Kubernetes API 定义,输出指定资源的字段结构和详细说明,包括:

  • 字段的名称和类型(如 stringintegerobject 等)。
  • 字段的描述(说明该字段的用途)。
  • 字段是否为必需(requiredoptional)。
  • 嵌套字段的层级结构(如 spec.template.spec.containers 等)。

基本用法:

kubectl explain <资源类型> [.嵌套字段]
  • <资源类型>:如 poddeploymentserviceconfigmap 等(区分大小写,通常用小写)。
  • [.嵌套字段]:可选,用于查看资源的嵌套字段(如 pod.specdeployment.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:说明该字段用于指定容器镜像的名称,并提供了官方文档链接。

关键用途:

  1. 编写配置文件时查缺补漏:不清楚某个字段的含义或格式时,快速查询(无需翻阅官方文档)。
  2. 验证配置正确性:确认字段是否存在、类型是否正确(如避免将数字类型写成字符串)。
  3. 学习资源结构:帮助理解 Kubernetes 资源的层级关系(如 spec.template 是 Pod 模板的固定路径)。

注意事项:

  • 资源类型需使用正确的名称(如 pod 而非 podsdeployment 而非 deployments)。
  • 嵌套字段的路径需正确(可通过逐层查询确认,如先查 pod.spec 再查 pod.spec.containers)。
  • 输出中的 required: true 表示该字段为必需项(如 metadata.name 是所有资源的必需字段),缺失会导致配置无效。

kubectl explain 是 Kubernetes 配置的 “实时字典”,尤其对新手编写 YAML 配置非常有帮助,建议在不确定字段含义时优先使用。

http://www.dtcms.com/a/398455.html

相关文章:

  • 第二章:Java到Go的思维转变
  • EFR32MG21模组(Zigbee)与STM32单片机通信
  • 部署的git仓库地址变更后更改新地址
  • 加强部门网站建设wordpress验证码失效
  • 昆山做网站的jofuns商务网站开发课程体会
  • PyTorch 神经网络模型构建与训练笔记(2)
  • 某旅游学院网络安全项目:构建高效监控集中管理与巡检系统
  • 【开题答辩全过程】以 J2EE应用于母婴健康管理系统的开发与实施为例,包含答辩的问题和答案
  • 网站设计与制作公司中铁中基建设集团网站
  • 怎么样自己做百度网站做网站什么主题好做
  • es的java调用
  • Jenkins运维之路(初次调试共享库)
  • 离线下载npm包
  • 【UE5.6.1】UE5初学者教程学习笔记:编辑器操作 (1-7集)
  • 伊春seo公司seo网站页面诊断
  • Spring依赖注入:@Resource与@Autowired详解及避免空指针的最佳实践
  • 52Hz——FreeRTOS学习笔记——延时函数
  • 阿里巴巴做网站教程免费网站模板下载大全下载
  • 贪心算法之分数背包问题
  • LLMs之AgentDevP:FastGPT的简介、安装和使用方法、案例应用之详细攻略
  • 贪心算法之船舶装载问题
  • 面试_常见大厂面试题
  • 网站地图怎么建设wordpress文章页样式修改
  • 网站如何做交互热门seo推广排名稳定
  • 【第29话:路径规划】自动驾驶启发式搜索算法(A星搜索算法( A* 搜索算法))详解及代码举例说明
  • React学习教程,从入门到精通,React Router 语法知识点及使用方法详解(28)
  • Docker Compose 从入门到实践
  • D3.js 与数据可视化
  • RNA-seq分析之最佳cutoff(TCGA版)
  • 浏览器直接进入网站的注意事项钢筋网片价格