使用kubectl查找新pod的名称

时间:2017-11-20 10:06:45

标签: 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分钟的时间间隔内删除pod。这很容易。

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

问题是我需要在我的bash脚本中捕获该pod的名称,然后我可以在该pod中执行命令,如uname -a或其他任何操作,以确认新pod已启动并正在运行细

我用谷歌搜索并阅读了kubectl文档,但我认为通过bash脚本有一种简单的方法可以做到这一点?我假设在这里获取pod名称的唯一方法是通过k8s API吗?

我很高兴在这一点上使用任何解决方案。我想知道当k8s产生新的pod时,我是否有任何重命名新pod的方法?所以我可以grep一个特定的关键字?

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

谢谢!

4 个答案:

答案 0 :(得分:29)

您需要以某种方式标记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

答案 1 :(得分:1)

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

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

这将为您提供标签为“ app = my-app”的广告连播的名称

答案 2 :(得分:0)

我只使用这样的东西: kubectl exec -it -c container $(kubectl get po | grep -e '^deployment' | head -n 1 | awk '{print $1}') uname

答案 3 :(得分:0)

补充@nickgryg所说的内容,如果kubernetes在云中,则可以添加命名空间 kubeconfig 以获取吊舱名称:

    set query = "@SQL=(""http://schemas.microsoft.com/mapi/proptag/0x10810003"" = 102) or (""http://schemas.microsoft.com/mapi/proptag/0x10810003"" = 104)"    
    set olItems = olLookUpFolder.Items.Restrict(query)
    for i = olItems.Count to 1 step -1
       set olObj = olItems.Item(i) 
...

要使用单个命令将其删除,可以使用以下命令:

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