我是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
这样的东西,因为这只是一个例子。很多豆荚有很多不同的名字,这只是一个例子。
谢谢!
答案 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