Kubectl命令列出kubernetes中部署的pod

Baj*_*jal 9 kubernetes kubectl

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

kubectl get pods| grep hello

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

我也尝试过kc get -o wide deployments hellodeployment,但它没有打印Pod名称.

Ric*_*ico 19

pod中有一个标签用于部署中的选择器.这就是部署管理其pod的方式.例如,对于标签或选择器,app=http-svc您可以执行类似这样的操作,并避免使用grep和列出所有窗格(当您的窗格数变得非常大时,这会变得很有用):

$ kubectl get pods -l=app=http-svc
Run Code Online (Sandbox Code Playgroud)

要么

$ kubectl get pods --selector=app=http-svc
Run Code Online (Sandbox Code Playgroud)


小智 15

K8s 组件通过标签和选择器相互链接。部署没有 My-List-of-ReplicaSets 或 My-List-Of-Pods 的内置属性。您无法从kubectl describekubectl 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 %
Run Code Online (Sandbox Code Playgroud)

源文件是

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)


Eli*_*ley 5

这是一个更简洁的 shell 别名(基于@kekaoyunfuwu 的代码),它仅列出部署的 pod(不显示临时结果):

k_list_pods_in_deployment() (
  test $# -eq 0 && {
    echo "Missing deployment name" && kubectl get deployments
    return 1
  }
  deployment="$1"; shift
  replicaSet="$(kubectl describe deployment $deployment \
    | grep '^NewReplicaSet' \
    | awk '{print $2}'
  )"

  podHashLabel="$(kubectl get rs $replicaSet \
    -o jsonpath='{.metadata.labels.pod-template-hash}'
  )"

  kubectl get pods -l pod-template-hash=$podHashLabel --show-labels \
    | tail -n +2 | awk '{print $1}'

)
alias k.list-pods-in-deployment=k_list_pods_in_deployment
Run Code Online (Sandbox Code Playgroud)