Kubernetes 在所有POD中运行特定命令
我想知道是否可以在所有现有的pod(包括不在默认名称空间中的pod)中的特定时间运行特定命令(例如:echo“foo”)。它类似于cronJob,但唯一的区别是我只想在一个地方指定/部署它。这是可能的吗?这是可能的,但有点复杂,您需要自己编写所有内容,因为据我所知,没有自动工具来完成这项工作 您可以使用Kubernetes API收集所有Kubernetes 在所有POD中运行特定命令,kubernetes,kubernetes-pod,Kubernetes,Kubernetes Pod,我想知道是否可以在所有现有的pod(包括不在默认名称空间中的pod)中的特定时间运行特定命令(例如:echo“foo”)。它类似于cronJob,但唯一的区别是我只想在一个地方指定/部署它。这是可能的吗?这是可能的,但有点复杂,您需要自己编写所有内容,因为据我所知,没有自动工具来完成这项工作 您可以使用Kubernetes API收集所有pod名称,使用循环中的名称将kubectl exec pod\u name命令推送到所有这些pod 要列出集群中的所有pod,还将列出系统中的所有GET/ap
pod
名称,使用循环中的名称将kubectl exec pod\u name命令推送到所有这些pod
要列出集群中的所有pod
,还将列出系统中的所有GET/api/v1/pod
这个脚本可以在您指定的时间使用Kubernetes运行。这是可能的,但有点复杂,您需要自己编写所有内容,因为据我所知,没有自动工具来完成
您可以使用Kubernetes API收集所有pod
名称,使用循环中的名称将kubectl exec pod\u name命令推送到所有这些pod
要列出集群中的所有pod
,还将列出系统中的所有GET/api/v1/pod
此脚本可以在指定时间使用Kubernetes运行。这是可能的。请找出我所遵循的步骤,希望对您有所帮助
首先,创建一个简单的脚本来读取pod的名称,exec
并执行命令
import os, sys
import logging
from datetime import datetime
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
dt = datetime.now()
ts = dt.strftime("%d-%m-%Y-%H-%M-%S-%f")
pods = os.popen("kubectl get po --all-namespaces").readlines()
for pod in pods:
ns = pod.split()[0]
po = pod.split()[1]
try:
h = os.popen("kubectl -n %s exec -i %s sh -- hostname" %(ns, po)).read()
os.popen("kubectl -n %s exec -i %s sh -- touch /tmp/foo-%s.txt" %(ns, po, ts))
logging.debug("Executed on %s" %h)
except Exception as e:
logging.error(e)
接下来,对上述脚本进行Dockerize、build和push
FROM python:3.8-alpine
ENV KUBECTL_VERSION=v1.18.0
WORKDIR /foo
ADD https://storage.googleapis.com/kubernetes-release/release/${KUBECTL_VERSION}/bin/linux/amd64/kubectl .
RUN chmod +x kubectl &&\
mv kubectl /usr/local/bin
COPY foo.py .
CMD ["python", "foo.py"]
稍后我们将在CronJob中使用此图像。您可以看到我在Dockerfile中安装了kubectl以触发kubectl命令。但这是不够的,我们应该向运行CronJob的服务帐户添加clusterole
和clusterolebinding
我已经创建了一个nsfoo
,并将foo的默认服务帐户绑定到我创建的集群角色,如下所示
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: foo
rules:
- apiGroups: [""]
resources: ["pods", "pods/exec"]
verbs: ["get", "list", "create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: foo
subjects:
- kind: ServiceAccount
name: default
namespace: foo
roleRef:
kind: ClusterRole
name: foo
apiGroup: rbac.authorization.k8s.io
现在,foo的默认服务帐户拥有集群中所有pod的get、list、exec
权限
最后创建一个cronjob来运行任务
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: foo
spec:
schedule: "15 9 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: foo
image: harik8/sof:62177831
imagePullPolicy: Always
restartPolicy: OnFailure
登录到pod并检查,它应该已经在每个pod的/tmp
目录中创建了带有时间戳的文件
$ kubectl exec -it app-59666bb5bc-v6p2h sh
# ls -lah /tmp
-rw-r--r-- 1 root root 0 Jun 4 09:15 foo-04-06-2020-09-15-06-792614.txt
日志
这是可能的。请找出我所遵循的步骤,希望对您有所帮助
首先,创建一个简单的脚本来读取pod的名称,exec
并执行命令
import os, sys
import logging
from datetime import datetime
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
dt = datetime.now()
ts = dt.strftime("%d-%m-%Y-%H-%M-%S-%f")
pods = os.popen("kubectl get po --all-namespaces").readlines()
for pod in pods:
ns = pod.split()[0]
po = pod.split()[1]
try:
h = os.popen("kubectl -n %s exec -i %s sh -- hostname" %(ns, po)).read()
os.popen("kubectl -n %s exec -i %s sh -- touch /tmp/foo-%s.txt" %(ns, po, ts))
logging.debug("Executed on %s" %h)
except Exception as e:
logging.error(e)
接下来,对上述脚本进行Dockerize、build和push
FROM python:3.8-alpine
ENV KUBECTL_VERSION=v1.18.0
WORKDIR /foo
ADD https://storage.googleapis.com/kubernetes-release/release/${KUBECTL_VERSION}/bin/linux/amd64/kubectl .
RUN chmod +x kubectl &&\
mv kubectl /usr/local/bin
COPY foo.py .
CMD ["python", "foo.py"]
稍后我们将在CronJob中使用此图像。您可以看到我在Dockerfile中安装了kubectl以触发kubectl命令。但这是不够的,我们应该向运行CronJob的服务帐户添加clusterole
和clusterolebinding
我已经创建了一个nsfoo
,并将foo的默认服务帐户绑定到我创建的集群角色,如下所示
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: foo
rules:
- apiGroups: [""]
resources: ["pods", "pods/exec"]
verbs: ["get", "list", "create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: foo
subjects:
- kind: ServiceAccount
name: default
namespace: foo
roleRef:
kind: ClusterRole
name: foo
apiGroup: rbac.authorization.k8s.io
现在,foo的默认服务帐户拥有集群中所有pod的get、list、exec
权限
最后创建一个cronjob来运行任务
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: foo
spec:
schedule: "15 9 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: foo
image: harik8/sof:62177831
imagePullPolicy: Always
restartPolicy: OnFailure
登录到pod并检查,它应该已经在每个pod的/tmp
目录中创建了带有时间戳的文件
$ kubectl exec -it app-59666bb5bc-v6p2h sh
# ls -lah /tmp
-rw-r--r-- 1 root root 0 Jun 4 09:15 foo-04-06-2020-09-15-06-792614.txt
日志
好了:
for ns in $(kubectl get ns -oname | awk -F "/" '{print $2}'); do for pod in $(kubectl get po -n $ns -oname | awk -F "/" '{print $2}'); do kubectl exec $pod -n $ns echo foo; done; done
如果容器中没有echo
(或命令),它将返回en error。除此之外,它应该可以工作。好了:
for ns in $(kubectl get ns -oname | awk -F "/" '{print $2}'); do for pod in $(kubectl get po -n $ns -oname | awk -F "/" '{print $2}'); do kubectl exec $pod -n $ns echo foo; done; done
如果容器中没有echo
(或命令),它将返回en error。除此之外,这也行。谢谢您的回答!我在StackOverflow中问这个问题的原因是,我想看看是否有一种kubernetes-only
的方法可以做到这一点。但这似乎并不存在。您使用python脚本的方法似乎非常简单,因此我将尝试一下。谢谢您的回答!我在StackOverflow中问这个问题的原因是,我想看看是否有一种kubernetes-only
的方法可以做到这一点。但这似乎并不存在。您使用python脚本的方法似乎非常简单,因此我将尝试一下。