使用kubectl查找新pod的名称

Blu*_*luz 22 kubectl

我是k8s的新手,我在这里遇到了一个小问题.

这是上下文:我需要kubectl delete [podname]每天通过crontask 调用一次,并等到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
Run Code Online (Sandbox Code Playgroud)

然后我写了一个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因为那只是一个例子而得到了一些东西.很多豆荚有很多不同的名字,这只是一个例子.

谢谢!

Nic*_*lay 42

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

apiVersion: extensions/v1beta1                                                                                                                                                                          
kind: Deployment                                                                                                                                                                                        
metadata:                                                                                                                                                                                               
  name: nginx                                                                                                                                                                                     
spec:                                                                                                                                                                                                   
  template:                                                                                                                                                                                             
    metadata:                                                                                                                                                                                           
      labels:                                                                                                                                                                                           
        app: my-app                                                                                                                                                                                
    spec:                                                                                                                                                                                               
      containers:                                                                                                                                                                                       
      - image: nginx                                                                                                                                                    
        name: nginx  
Run Code Online (Sandbox Code Playgroud)

之后,您可以非常轻松地获得部署的pod名称:

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

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

kubectl exec -ti $POD -- uname -a
Run Code Online (Sandbox Code Playgroud)

  • 使用 `-o name` 而不是 `-o jsonpath=...` (7认同)
  • @Adam不幸的是,这会在结果前加上类型-例如。`pod / mypodname`。太可惜了,因为这很容易记住。 (4认同)
  • 如果您的 pod 位于其中,请不要忘记添加您的命名空间 (2认同)

小智 8

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

kubectl get pods -l app=my-app -o custom-columns=:metadata.name
Run Code Online (Sandbox Code Playgroud)

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

  • 我附加 `--no-headers` 来删除标题(如果不使用它,它将变成空行) (3认同)