使用 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 在云中,您可以添加 namespace 和 kubeconfig 来获取 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
我是 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 在云中,您可以添加 namespace 和 kubeconfig 来获取 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