使用 kubectl 查找新 pod 的名称

Finding the name of a new pod with kubectl

我是 k8s 的新手,我运行遇到了一个小问题。

上下文如下: 我需要每天通过 crontask 调用 kubectl delete [podname] 一次,等到 k8s 重新创建 pod,然后登录到该 pod 中的容器并 运行 一个 shell 命令。

所以我查询部署并得到如下信息:

user@host:~$ kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
firstpod-123456789-something           1/1       Running   570        2d
secondpod-http-backend-something       1/1       Running   597        2d

然后我写了一个 bash 脚本,它会在 5 分钟的间隔内删除 pods。这是最简单的部分。

假设我调用 kubectl delete firstpod-123456789-something 并等待 k8s 重新创建一个新的 pod。那个新的 pod 会有一个新的名字,比如 firstpod-[some random hash here]-something

问题是我需要在我的 bash 脚本中捕获那个 pod 的名称,这样我就可以在那个 pod 中执行一个命令,比如 uname -a 或其他任何东西来验证新的pod 已经启动,运行ning 就好了。

我用谷歌搜索并阅读了 kubectl 文档,但我认为没有通过 bash 脚本执行此操作的简单方法?我假设在这里获取 pod 名称的唯一方法是通过 k8s API?

此时我很乐意使用任何解决方案。我想知道当 k8s 产生一个新的 pod 时,是否有任何方法可以重命名新的 pod?所以我可以 grep 查找特定关键字?

请注意,我不想像 firstpod-[0-9]-something 这样的 egrep,因为那只是一个例子。很多pods有很多不同的名字,这只是一个例子。

谢谢!

您需要以某种方式标记您的 deployment,例如我们在下面设置标签 app: myapp

apiVersion: extensions/v1beta1                                                                                                                                                                          
kind: Deployment                                                                                                                                                                                        
metadata:                                                                                                                                                                                               
  name: nginx                                                                                                                                                                                     
spec:                                                                                                                                                                                                   
  template:                                                                                                                                                                                             
    metadata:                                                                                                                                                                                           
      labels:                                                                                                                                                                                           
        app: my-app                                                                                                                                                                                
    spec:                                                                                                                                                                                               
      containers:                                                                                                                                                                                       
      - image: nginx                                                                                                                                                    
        name: nginx  

之后你可以很容易地得到部署的 pod 名称:

POD=$(kubectl get pod -l app=my-app -o jsonpath="{.items[0].metadata.name}")

并在那里执行一些命令,例如:

kubectl exec -ti $POD -- uname -a

就像 Nickolay 写的那样,使用标签来帮助选择。 然后你可以使用

kubectl get pods -l app=my-app -o custom-columns=:metadata.name

这将为您提供具有标签 "app=my-app"

的 pod 的名称

补充@nickgryg 所说的,如果 kubernetes 在云中,您可以添加 namespacekubeconfig 来获取 pod 名称:

kubectl get pods -l app=my-app -o jsonpath="{.items[0].metadata.name}" -n my-namespace --kubeconfig=/home/$USER/.kube/kubeconfig

要用一条命令删除它,您可以使用以下命令:

NAMESPACE=my-namespace APP_NAME=my-app && kubectl delete -n $NAMESPACE pod $(kubectl get pods -l app=$APP_NAME -o jsonpath="{.items[0].metadata.name}" -n $NAMESPACE --kubeconfig=/home/$USER/.kube/kubeconfig) --kubeconfig=/home/$USER/.kube/kubeconfig

所有其他答案都不适合我

无效选项

kubectl -n $NAMESPACE get pods  -l app.kubernetes.io/name=nats  -o name

工作选项

kubectl -n $NAMESPACE get pods  --selector=app.kubernetes.io/name=nats  -o name