【问题标题】:Kubectl command to list pods of a deployment in KubernetesKubectl 命令列出 Kubernetes 中部署的 pod
【发布时间】:2018-10-23 20:16:32
【问题描述】:

有没有办法使用kubectl 仅列出属于部署的 pod? 目前,我这样做是为了获取 pod:

kubectl get pods| grep hello

但是当我有兴趣只知道给定部署的 pod 时,获取所有 pod 似乎有点过头了。我使用此命令的输出来查看所有 Pod 的状态,然后可能执行到其中一个。

我也试过kc get -o wide deployments hellodeployment,但它不打印 Pod 名称。

【问题讨论】:

    标签: kubernetes kubectl


    【解决方案1】:

    pod 中有一个 label,用于部署中的 selector。这就是deployment 管理其 pod 的方式。例如,对于标签或选择器app=http-svc,您可以这样做并避免使用grep 并列出所有 pod(当您的 pod 数量变得非常大时,这会变得很有用):

    $ kubectl get pods -l=app=http-svc
    

    或

    $ kubectl get pods --selector=app=http-svc
    

    【讨论】:

    • 但是 pod 有 2 个标签:run=http-svc 和 pod-template-hash=736954933。如果您只指定一个标签,则可能会包含其他一些不受部署管理的 pod。
    【解决方案2】:

    K8s 组件通过标签和选择器相互链接。部署中没有 My-List-of-ReplicaSets 或 My-List-Of-Pods 的内置属性。您无法从 kubectl describe 或 kubectl get

    获取它们

    正如上面@Rico 建议的那样,您必须使用标签过滤器。但是您不能简单地使用您在部署元文件中指定的标签,因为部署会生成一个随机哈希并将其用作附加标签。

    例如,我有一个部署和一个独立的 pod,它们共享相同的标签 app=http-svc。虽然前两个由部署管理,但第三个不是也不应该出现在结果中。

    
    ma.chi@~/k8s/deployments % kubectl get pods --show-labels
    NAME                   READY   STATUS    RESTARTS   AGE   LABELS
    http-9c89b5578-6cqbp   1/1     Running   0          7s    app=http-svc,pod-template-hash=574561134
    http-9c89b5578-vwqbx   1/1     Running   0          7s    app=http-svc,pod-template-hash=574561134
    nginx-standalone       1/1     Running   0          7s    app=http-svc
    ma.chi@~/k8s/deployments %
    

    源文件是

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: http-svc
      name: http
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: http-svc
      strategy: {}
      template:
        metadata:
          labels:
            app: http-svc
        spec:
          containers:
          - image: nginx:1.9.1
            name: nginx1
    
    ---
    
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        app: http-svc
      name: nginx-standalone
    spec:
      containers:
      - image: nginx:1.9.1
        name: nginx1-standalone
    

    要准确定位由您的部署创建和管理的容器,您可以使用下面的脚本(这很丑,但这是我能做的最好的)

    DEPLOY_NAME=http
    RS_NAME=`kubectl describe deployment $DEPLOY_NAME|grep "^NewReplicaSet"|awk '{print $2}'`; echo $RS_NAME
    
    POD_HASH_LABEL=`kubectl get rs $RS_NAME -o jsonpath="{.metadata.labels.pod-template-hash}"` ; echo $POD_HASH_LABEL
    
    POD_NAMES=`kubectl get pods -l pod-template-hash=$POD_HASH_LABEL --show-labels | tail -n +2 | awk '{print $1}'`; echo $POD_NAMES
    

    【讨论】:

      猜你喜欢
      • 2019-01-09
      • 2021-06-18
      • 2021-09-30
      • 1970-01-01
      • 2022-12-17
      • 2020-07-20
      • 2020-09-15
      • 1970-01-01
      • 2017-07-05
      相关资源
      最近更新 更多