kubectl实操篇

Posted by 白行简 on Tuesday, March 8, 2022

kubectl简介

  • 从用户角度来说,kubectl 就是控制 Kubernetes 的驾驶舱,它允许你执行所有可能的 Kubernetes 操作
  • 从技术角度来看,kubectl 就是 Kubernetes API 的一个客户端而已
  • [kubectl官方地址](https://kubernetes.io/zh-cn/docs/reference/kubectl/introduction/)

日常排障命令

常用

1.查看prod环境重启的pod
kubectl get pods  -n prod --sort-by=.status.containerStatuses[0].restartCount
2.筛选OOM的pod并删除
kubectl get pods -n prod| grep OOMKilled| awk '{print $1}' | xargs kubectl delete pod -n prod
3.按CPU使用率排序
kubectl top pods --all-namespaces --sort-by=cpu
4.按内存使用率排序
kubectl top pods --all-namespaces --sort-by=memory

显示事件–>kubectl get events

kubectl get events 是 Kubernetes 中的一个命令,用于获取集群内部发生的事件 (Events)。
这些事件可以包括 Pod 的启动和停止、配置更改、资源不足、错误状况等。
通过这些事件,用户可以更容易地理解和诊断集群中的问题和状态。

使用场景

  • 诊断 Pod、Service、Node 或其他 Kubernetes 资源的问题。
  • 跟踪资源的生命周期,例如 Pod 的创建、删除、启动和停止。
  • 监控集群的健康状况和警告。

使用技巧

  • 使用 -w 或 –watch 参数实时查看新事件
  • 结合命名空间使用,例如 kubectl get events -n 来查看指定命名空间的事件。
  • 使用 –sort-by 对事件进行排序,例如按时间排序:kubectl get events –sort-by=’.metadata.creationTimestamp’。
  • 使用 –field-selector 进行过滤,例如只查看 Pod 事件:kubectl get events –field-selector involvedObject.kind=Pod
1.实时监控事件
kubectl get events -w
2.查看指定命名空间的事件
kubectl get events -n my-namespace
3.按时间排序查看最近的事件
kubectl get events --sort-by='.metadata.creationTimestamp'
4.只查看 Pod 相关的事件
kubectl get events --field-selector involvedObject.kind=Pod
5.查看特定的pod事件
kubectl get events --field-selector involvedObject.name=my-pod

基础命令(基础)

命令 说明
kubectl create 通过 yaml/json 文件或者标准输入创建一个资源对象,支持很多子命令 例如 namespace pod deployment service 等
kubectl expose 将 yaml/json 文件中定义的资源对象的端口暴露给新的 service 资源对象
kubectl run 创建并运行一个或多个容器镜像
kubectl set 配置资源对象设置特定功能

基础命令(中级)

命令 说明
kubectl explain 查看资源对象的详细信息(一般用一编写 yaml 的时候做一个提示 kubectl explain deployment 会出现 deployment 下面可以写的字段以及字段属性还有 可以逐级使用)
kubectl get 获取一个或多个资源对象的信息
kubectl edit 使用默认编辑器编辑服务器上定义的资源对象
kubectl delete 通过 yaml/json 文件、标准舒服、资源名称或标签选择器来删除资源

部署命令 DeployCommands

命令 说明
kubectl rollout 资源管理对象的部署
kubectl rollout-update 使用 rc(replication controller)来做滚动更新
kubectl scale 扩容或者缩容 deployment replicaset replication contrller 等
kubectl autoscale 自动设置在 k8s 系统中运行的 pod 数量(水平自动伸缩)

集群管理命令 Cluster Manager Commands

命令 说明
kubectl cetificate 修改证书资源对象
kubectl cluster-info 查看集群信息
kubectl top 显示资源 cpu 内存 存储使用情况
kubectl cordon 标记节点为不可调度
kubectl uncordon 指定节点为可调度
kubectl drain 安全的驱逐节点的所有 pod
kubectl taint 将一个或多个节点设置为污点

故障排查和调试命令

命令 说明
kubectl describe 显示一个或多个资源对象的详细信息
kubectl logs 输出 pod 资源对象中一个容器的日志
kubectl attach 连接到一个运行的容器
kubectl exec 在指定容器内执行命令
kubectl port-forward 将本机指定端口映射到 pod 资源对象的端口
kubectl proxy 将本机指定端口映射到 kube-apiserver
kubectl cp 用于 pod 与主机交换文件
kubectl auth 检查验证

高级命令 Advanced Commands

命令 说明
kubectl diff 对比本地 yaml/json 文件与 kube-apiserver 中运行的配置文件是否有差异
kubectl apply 通过 yaml/json 文件 标准输入对资源进行配置更新或者创建
kubectl patch 通过 patch 方式修改资源对象字段(补丁式)
kubectl replace 通过 yaml/json 文件或者标准输入来替换资源对象
kubectl wait 在一个或者多个资源上等待条件达成
kubectl convert 转换 yaml/json 文件为不同的资源版本
kubectl kustomize 定制 kubernetes 配置

设置命令 Settings Commands

命令 说明
kubectl label 增删改资源的标签
kubectl annotate 更新一个或者多个资源对象的注释(annotaion)信息
kubectl completion 命令自动补全

其他命令 Other Commands

命令 说明
kubectl config 管理 kubeconfig 配置文件
kubectl plugin 运行命令行插件功能
kubectl version 查看客户端服务端的系统版本信息
kubectl api-versions 列出当前 kubernetes 系统支持的资源组和资源版本表现形式为/
kubectl api-resources 列出当前 kubernetes 系统支持的 resource 资源列表
kubectl options 查看支持的参数列表

常见的 RESOURCE_NAME

名称 缩写
all
certificatesigningrequests (缩写 csr)
clusterrolebindings
clusterrol
componentstatuses (缩写 cs)
configmaps (缩写 cm)
controllerrevisions
cronjobs
customresourcedefinition (缩写 crd)
daemonsets (缩写 ds)
deployments (缩写 deploy)
endpoints (缩写 ep)
events (缩写 ev)
horizontalpodautoscalers (缩写 hpa)
ingresses (缩写 ing)
jobs
limitranges (缩写 limits)
namespaces (缩写 ns)
networkpolicies (缩写 netpol)
nodes (缩写 no)
persistentvolumeclaims (缩写 pvc)
persistentvolumes (缩写 pv)
poddisruptionbudgets (缩写 pdb)
podpreset
pods (缩写 po)
podsecuritypolicies (缩写 psp)
podtemplates
replicasets (缩写 rs)
replicationcontrollers (缩写 rc)
resourcequotas (缩写 quota)
rolebindings
roles
secrets
serviceaccounts (缩写 sa)
services (缩写 svc)
statefulsets (缩写 sts)
storageclasses (缩写 sc)

kubectl 重要命令详解

kubectl create

通过配置文件名或 stdin 创建一个集群资源对象。支持 JSON 和 YAML 格式的文件。

语法:

kubectl create -f FILENAME
示例:

# 通过 pod.yml 文件创建一个 pod
kubectl create -f ./pod.yml

# 通过 stdin 的 yml 创建一个 pod
cat pod.yml | kubectl create -f -

# 为 gitlab-runner 在 namespace 下授权管理员角色
kubectl create rolebinding deploy-runner --clusterrole=cluster-admin --serviceaccount=deploy:default --namespace=hsh-pre-service

kubectl expose

将资源暴露为新的 Kubernetes Service。指定 deployment、service、replica set、replication controller 或 pod,并使用该资源的选择器作为指定端口上新服务的选择器。deployment 或 replica set 只有当其选择器可转换为 service 支持的选择器时,即当选择器仅包含 matchLabels 组件时才会作为暴露新的 Service。

语法:

kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]
示例:

# 为 rc 的 nginx 创建 service,并通过 service 的 80 端口转发至容器的 8000 端口上
kubectl expose rc nginx --port=80 --target-port=8000

# 由 “nginx-controller.yml” 中指定的 type 和 name 标识的 rc 创建 service,并通过 service 的 80 端口转发至容器的 8000 端口上
kubectl expose -f nginx-controller.yml --port=80 --target-port=8000

kubectl get

获取一个或多个资源对象的信息。

语法:

kubectl get RESOURCE_NAME
示例:

# 查看 master 状态
kubectl get componentstatuses

# 查看所有命名空间
kubectl get namespaces

# 列出所有的 pods
kubectl get pods

# 显示更多的 pods 列表信息(例如 pod 的 ip 和所处的 node)
kubectl get pods -o wide

# 列出名字为 web 的 rc
kubectl get replicationcontroller web

# 获取名字为 web-pod-13cd8 的 pod 的信息,并以 json 格式输出
kubectl get -o json pod web-pod-13cd8

# 根据 pod 文件查找 pod,并以 json 格式输出
kubectl get -f pod.yaml -o json

# 获取 pod 容器的状态
kubectl get -o template pod/kube-dns-795f5f6f9c-ldxxs --template {{.status.phase}}

# 同时获取所有的 rc 和 service
kubectl get rc,services

# 获取符合条件的所有 rc,svc,pod
kubectl get rc/web service/frontend pods/web-pod-13cd8

# 获取所有 resource
kubectl get all

kubectl edit

使用默认编辑器 编辑服务器上定义的资源。使用命令行工具获取的任何资源都可以使用 edit 命令编辑。edit 命令会打开使用 KUBE_EDITOR,GIT_EDITOR 或者 EDITOR 环境变量定义的编辑器,可以同时编辑多个资源,但所编辑过的资源只会一次性提交。edit 除命令参数外还接受文件名形式。文件默认输出格式为 YAML。要以 JSON 格式编辑,请指定 “-o json” 选项。

语法:

kubectl edit (RESOURCE/NAME | -f FILENAME)
示例:

# 编辑名为 “docker-registry” 的 service
kubectl edit svc/docker-registry

# 使用替代的编辑器
KUBE_EDITOR="nano" kubectl edit svc/docker-registry

# 以 YAML 格式输出编辑 deployment “mydeployment”,并将修改的配置保存在 annotation 中
kubectl edit deployment/mydeployment -o yaml --save-config

kubectl delete

通过配置文件名、stdin、资源名称或label选择器来删除资源。支持 JSON 和 YAML 格式文件。可以只指定一种类型的参数:文件名、资源名称或 label 选择器。

注意:执行 delete 命令时不会检查资源版本,如果在执行 delete 操作时有人进行了更新操作,那么更新操作将连同资源一起被删除。

语法:

kubectl delete ([-f FILENAME] | TYPE [(NAME | -l label | --all)])
示例:

# 使用 pod.yml 中指定的资源类型和名称删除 pod
kubectl delete -f ./pod.yml

# 根据传入 stdin 的 yml 所指定的类型和名称删除 pod
cat pod.json | kubectl delete -f -

# 删除名为“foo”和“bar”的 pod 和 service
kubectl delete pod,service foo bar

# 删除 Label 标签名为 name = myLabel 的 pod 和 service
kubectl delete pods,services -l name=myLabel

# 强制删除 dead node上 的 pod
kubectl delete pod foo --grace-period=0 --force

# 删除所有 pod
kubectl delete pods --all

kubectl rollout

对资源进行管理,可用资源包括:deployments daemonsets

包含下列子命令:

history(查看历史版本)

pause(暂停资源)

resume(恢复暂停资源)

status(查看资源状态)

undo(回滚版本)

语法:

kubectl rollout SUBCOMMAND
示例:

# 查看 deployment 的历史记录
kubectl rollout history deployment/abc

# 查看 daemonset 修订版 revision=3 的详细信息
kubectl rollout history daemonset/abc --revision=3

# 将 deployment 标记为暂停。只要 deployment 在暂停中,使用 deployment 更新将不会生效。
kubectl rollout pause deployment/nginx

# 恢复已暂停的 deployment
kubectl rollout resume deployment/nginx

# 查看 deployment 的状态
kubectl rollout status deployment/nginx

# 回滚到之前的 deployment 版本
kubectl rollout undo deployment/abc
kubectl rollout undo --dry-run=true deployment/abc

# 回滚到 daemonset 修订 revision=3 版本
kubectl rollout undo daemonset/abc --to-revision=3

# 将名为 foo 中的 pod 副本数设置为 3
kubectl scale --replicas=3 rs/foo

# 将由“foo.yaml”配置文件中指定的资源对象和名称标识的 Pod 资源副本设为 3
kubectl scale --replicas=3 -f foo.yaml

# 如果 mysql 当前副本数为 2,则将其扩展至 3
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql

# 设置多个 RC 中 Pod 副本数量
kubectl scale --replicas=5 rc/foo rc/bar

kubectl describe

输出指定的一个/多个资源的详细信息,此命令组合调用多条 API,输出指定的一个或者一组资源的详细描述。

语法:

kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | -l label] | TYPE/NAME)
示例:

# 描述一个 node
kubectl describe nodes kubernetes-minion-emt8.c.myproject.internal

# 描述一个 pod
kubectl describe pods/nginx

# 描述 pod.yml 中的资源类型和名称指定的 pod
kubectl describe -f pod.yml

# 描述所有的 pod
kubectl describe pods

# 描述所有包含 label 标签名为 name=myLabel 的 pod
kubectl describe po -l name=myLabel

# 描述所有被 replication controller “frontend” 管理的 pod(rc 创建的 pod 都以 rc 的名字作为前缀)
kubectl describe pods frontend

kubectl logs

输出 pod 中一个容器的日志,如果 pod 只包含一个容器则可以省略容器名。

语法:

kubectl logs [-f] [-p] POD [-c CONTAINER]
示例:

# 返回仅包含一个容器的 pod nginx 的日志快照
kubectl logs nginx

# 返回 pod ruby 中已经停止的容器 web-1 的日志快照
kubectl logs -p -c ruby web-1

# 持续输出 pod ruby 中的容器 web-1 的日志
kubectl logs -f -c ruby web-1

# 仅输出 pod nginx 中最近的 20 条日志
kubectl logs --tail=20 nginx

# 输出 pod nginx 中最近一小时内产生的所有日志
kubectl logs --since=1h nginx

kubectl exec

在容器内部执行命令。

语法:

kubectl exec POD [-c CONTAINER] -- COMMAND [args...]
示例:

# 默认在 pod 123456-abcd 的第一个容器中运行“date”并获取输出
kubectl exec 123456-abcd date

# 在 pod 123456-abcd 的容器 ruby-container 中运行“date”并获取输出
kubectl exec 123456-abcd -c ruby-container date

# 切换到终端模式,将控制台输入发送到 pod 123456-abcd 的 ruby-container 的“bash”命令,并将其输出到控制台/错误控制台的信息发送回客户端
kubectl exec 123456-abcd -c ruby-container -i -t -- bash -il

kubectl apply

通过配置文件名或 stdin 创建一个集群资源对象。支持 JSON 和 YAML 格式的文件。

语法:

kubectl apply -f FILENAME
示例:

# 通过 pod.yml 文件创建一个 pod
kubectl apply -f ./pod.yml

# 通过 stdin 的 yml 创建一个 pod
cat pod.yml | kubectl apply -f -
使用 kubectl create 和 kubectl apply 创建资源对象的区别:

kubectl apply kubectl create
根据 yaml 文件中包含的字段(yaml 文件可以只写需要改动的字段),直接升级集群中的现有资源对象 首先删除集群中现有的所有资源,然后重新根据 yaml 文件(必须是完整的配置信息)生成新的资源对象
yaml 文件可以不完整,只写需要的字段 yaml 文件必须是完整的配置字段内容
kubectl apply 只工作在 yaml 文件中的某些改动过的字段 kubectl create 工作在 yaml 文件中的所有字段
在只改动了 yaml 文件中的某些声明时,而不是全部改动,你可以使用 kubectl apply 在没有改动 yaml 文件时,使用同一个 yaml 文件执行命令 kubectl replace,将不会成功(fail 掉),因为缺少相关改动信息

kubectl label

更新(增加、修改或删除)资源上的 label(标签)。label 必须以字母或数字开头,可以使用字母、数字、连字符、点和下划线,最长63个字符。如果 --overwrite 为 true,则可以覆盖已有的 label,否则尝试覆盖 label 将会报错。如果指定了 --resource-version,则更新将使用此资源版本,否则将使用现有的资源版本。

语法:

kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]
示例:

# 给名为 foo 的 Pod 添加 label unhealthy=true
kubectl label pods foo unhealthy=true

# 给名为 foo 的 Pod 修改 label 为 ‘status’ 的 value 值 ‘unhealthy’,且覆盖现有的 value
kubectl label --overwrite pods foo status=unhealthy

# 给 namespace 中的所有 pod 添加 label
kubectl label pods --all status=unhealthy

# 仅当 resource-version=1 时才更新名为 foo 的 Pod 上的 label
kubectl label pods foo status=unhealthy --resource-version=1

# 删除名为 “bar” 的 label(使用“ - ”减号相连)
kubectl label pods foo bar-

kubectl高级用法jsonpath

kubectl -o=jsonpath= 是 Kubernetes 命令行工具 kubectl 中的一个输出选项,用于以 JSONPath 格式提取并展示 API 对象的部分内容。JSONPath 是一种查询语言,它允许用户在 JSON 结构中导航和提取数据。这对于自动化脚本和快速查询 Kubernetes 资源的特定部分非常有用。
当你执行 kubectl 命令并使用 -o 或 --output 标志时,可以指定输出格式。
如果后面跟的是 jsonpath= ,那么你就可以提供一个 JSONPath 表达式来精确地选择你想要从资源描述中提取的信息。

基本语法结构如下:

kubectl [command] [resource] [-o=jsonpath='{expression}']
这里的 expression 是一个遵循 JSONPath 语法的字符串,用于指定要提取的数据路径。例如:

{.metadata.name} 会提取对象的名称。
{.spec.containers[*].name} 会提取所有容器的名称,如果有多个容器的话。
{range .spec.containers[*]}{.name}{"\n"}{end} 使用 range 来迭代每个容器,并打印它们的名称,每个名称后跟一个换行符。
JSONPath 表达式中常用的符号包括:

. 访问对象的属性。
[] 访问数组元素或作为筛选条件。
{} 定义表达式或者用于创建输出模板。
* 通配符,匹配数组中的所有元素。
@ 引用当前对象。
通过这种方式,kubectl -o=jsonpath= 提供了一种灵活且强大的方法来查看 Kubernetes 资源的定制化视图。

示例如下:

kubectl get pod csi-attacher-lxcfsplugin-0 -o yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2024-04-17T06:33:35Z"
  generateName: csi-attacher-lxcfsplugin-
  labels:
    app: csi-attacher-lxcfsplugin
    controller-revision-hash: csi-attacher-lxcfsplugin-75c7658464
    statefulset.kubernetes.io/pod-name: csi-attacher-lxcfsplugin-0
  name: csi-attacher-lxcfsplugin-0
  namespace: lxcfs-csi
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: StatefulSet
    name: csi-attacher-lxcfsplugin
    uid: c520c298-7c0f-40c5-9878-8ea47be81e4a
  resourceVersion: "34427971"
  uid: b64b595e-c2a5-49c8-8ef2-a9b9987b2fe3
spec:
  containers:
  - args:
    - --csi-address=$(ADDRESS)
    - --v=5
    env:
    - name: ADDRESS
      value: /var/lib/csi/sockets/pluginproxy/csi.sock
    image: docker.io/lxcfs:v1
    imagePullPolicy: Never
    name: csi-provisioner
    resources:
      limits:
        cpu: 150m
        memory: 100Mi
      requests:
        cpu: 150m
        memory: 100Mi
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/lib/csi/sockets/pluginproxy
      name: socket-dir
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-xsjrp
      readOnly: true
  - args:
    - --v=5
    - --csi-address=$(ADDRESS)
    env:
    - name: ADDRESS
      value: /var/lib/csi/sockets/pluginproxy/csi.sock
    image: docker.io/lxcfs:v1
    imagePullPolicy: Never
    name: csi-attacher
    resources:
      limits:
        cpu: 150m
        memory: 100Mi
      requests:
        cpu: 150m
        memory: 100Mi
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/lib/csi/sockets/pluginproxy/
      name: socket-dir
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-xsjrp
      readOnly: true
  - args:
    - --nodeid=$(NODE_ID)
    - --endpoint=$(CSI_ENDPOINT)
    - --log-retain-date=5
    - --log-compress
    - --log-file-path=/var/log/controller.log
    - --log-max-size=200
    - --log-max-backups=10
    command:
    - /csi-server
    env:
    - name: NODE_ID
      valueFrom:
        fieldRef:
          apiVersion: v1
          fieldPath: spec.nodeName
    - name: CSI_ENDPOINT
      value: unix://plugin/csi.sock
    image: docker.io/lxcfs:v1
    imagePullPolicy: Never
    name: csi-server
    resources:
      limits:
        cpu: 150m
        memory: 100Mi
      requests:
        cpu: 150m
        memory: 100Mi
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /plugin
      name: socket-dir
    - mountPath: /var/log
      name: log-volume
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-xsjrp
      readOnly: true
  - args:
    - /liveness/csi-livenessprobe --csiAddress=/var/lib/kubelet/plugins/csi-lxcfsplugin/csi.sock
      --httpEndpoint=127.0.0.1:10926
    command:
    - /bin/sh
    - -c
    image: docker.io/lxcfs:v1
    imagePullPolicy: Never
    name: health-check
    resources:
      limits:
        cpu: 10m
        memory: 100M
      requests:
        cpu: 10m
        memory: 100M
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /plugin/
      name: socket-dir
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-xsjrp
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  hostname: csi-attacher-lxcfsplugin-0
  nodeName: docker123
  nodeSelector:
    node-role.kubernetes.io/master: ""
  preemptionPolicy: PreemptLowerPriority
  priority: 1000000000
  priorityClassName: lxcfs-csi-priority-class
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: csi-attacher
  serviceAccountName: csi-attacher
  subdomain: csi-attacher
  terminationGracePeriodSeconds: 30
  tolerations:
  - operator: Exists
  volumes:
  - emptyDir: {}
    name: socket-dir
  - hostPath:
      path: /var/lib/docker/logs/lxcfs-csi-server
      type: DirectoryOrCreate
    name: log-volume
  - name: kube-api-access-xsjrp
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2024-04-17T06:33:35Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2024-04-22T02:26:11Z"
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2024-04-22T02:26:11Z"
    status: "True"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2024-04-17T06:33:35Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: containerd://3c0eeb141059a8dc099c1d3c4c98a6a6f25b855335b319a240f167983b5c00f4
    image: docker.io/lxcfs:v1
    imageID: sha256:19ec336305e47bfd0f64a7d1eb17dc01cb67cbbb856dbf18307999208c70c80b
    lastState: {}
    name: csi-attacher
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2024-04-22T02:25:41Z"
  - containerID: containerd://aa0dd18c42e1e6ecade723a358856e8705cf20ebc418290e74ec0c76325fd78a
    image: docker.io/lxcfs:v1
    imageID: sha256:1011f81cb57bccc5591e54874ca3a16e0b20a8f80765ee2bab2eb55d3782e84e
    lastState: {}
    name: csi-provisioner
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2024-04-22T02:25:41Z"
  - containerID: containerd://23465fdf825016cefb4982c3367d9e34839f60707e2ecb57b4b6e617d3b341e0
    image: docker.io/lxcfs:v1
    imageID: sha256:e28f1150ab6c9bcf294be21403faf6862ad460891408a628ac23102d5f29b61d
    lastState: {}
    name: csi-server
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2024-04-22T02:25:56Z"
  - containerID: containerd://116a11be9a0b548bd04589c59228702043f0d3b1dad39a11f25f1aa1d68378be
    image: docker.io/lxcfs:v1
    imageID: sha256:f9cf76b861fe4ba215a07ac5851d43aea7247996490992e38176e51ada755dd3
    lastState: {}
    name: health-check
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2024-04-22T02:26:11Z"
  hostIP: 11.166.91.187
  phase: Running
  podIP: 10.244.0.54
  podIPs:
  - ip: 10.244.0.54
  qosClass: Guaranteed
  startTime: "2024-04-17T06:33:35Z"
  • 获取kind
kubectl get pod  csi-attacher-lxcfsplugin-0 -o=jsonpath='{.kind}'
Pod
  • 获取metadata 中的 generateName
kubectl get pod  csi-attacher-lxcfsplugin-0 -o=jsonpath='{.metadata.generateName}'
csi-attacher-lxcfsplugin-
  • 3、获取metadata 中的labels中的app
$ kubectl get pod  csi-attacher-lxcfsplugin-0 -o=jsonpath='{.metadata.labels.app}'
csi-attacher-lxcfsplugin
  • 4、获取metadata 中的ownerReferences中的uid
$ kubectl get pod  csi-attacher-lxcfsplugin-0 -o=jsonpath='{.metadata.ownerReferences}'
[{"apiVersion":"apps/v1","blockOwnerDeletion":true,"controller":true,"kind":"StatefulSet","name":"csi-attacher-lxcfsplugin","uid":"c520c298-7c0f-40c5-9878-8ea47be81e4a"}]
# 得到一个列表,且列表中只有一个值
$ kubectl get pod  csi-attacher-lxcfsplugin-0 -o=jsonpath='{.metadata.ownerReferences[0].uid}'
c520c298-7c0f-40c5-9878-8ea47be81e4a
  • 5、获取spec 第四个containers中的resources中的requests中的cpu
$ kubectl get pod  csi-attacher-lxcfsplugin-0 -o=jsonpath='{.spec.containers[3]}' 
{"args":["/liveness/csi-livenessprobe --csiAddress=/var/lib/kubelet/plugins/csi-lxcfsplugin/csi.sock --httpEndpoint=127.0.0.1:10926"],"command":["/bin/sh","-c"],"image":"reg.docker.alibaba-inc.com/alibaba_apsara_paas/lxcfs_csi_livenessprobe:unionbase-v1","imagePullPolicy":"Never","name":"health-check","resources":{"limits":{"cpu":"10m","memory":"100M"},"requests":{"cpu":"10m","memory":"100M"}},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","volumeMounts":[{"mountPath":"/plugin/","name":"socket-dir"},{"mountPath":"/var/run/secrets/kubernetes.io/serviceaccount","name":"kube-api-access-xsjrp","readOnly":true}]}

$ kubectl get pod  csi-attacher-lxcfsplugin-0 -o=jsonpath='{.spec.containers[3].resources}' 
{"limits":{"cpu":"10m","memory":"100M"},"requests":{"cpu":"10m","memory":"100M"}}

$ kubectl get pod  csi-attacher-lxcfsplugin-0 -o=jsonpath='{.spec.containers[3].resources.requests}' 
{"cpu":"10m","memory":"100M"}

$ kubectl get pod  csi-attacher-lxcfsplugin-0 -o=jsonpath='{.spec.containers[3].resources.requests.cpu}' 
10m
  • 6、获取每一个容器的name
$ kubectl get pod  csi-attacher-lxcfsplugin-0 -o=jsonpath='{range .spec.containers[*]}{.name}{"\n"}{end}' 
csi-provisioner
csi-attacher
csi-server
health-check

「真诚赞赏,手留余香」

观测猿

真诚赞赏,感谢认可

使用微信扫描二维码完成支付