Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes 在所有POD中运行特定命令_Kubernetes_Kubernetes Pod - Fatal编程技术网

Kubernetes 在所有POD中运行特定命令

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(包括不在默认名称空间中的pod)中的特定时间运行特定命令(例如:echo“foo”)。它类似于cronJob,但唯一的区别是我只想在一个地方指定/部署它。这是可能的吗?

这是可能的,但有点复杂,您需要自己编写所有内容,因为据我所知,没有自动工具来完成这项工作

您可以使用Kubernetes API收集所有
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

我已经创建了一个ns
foo
,并将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

我已经创建了一个ns
foo
,并将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脚本的方法似乎非常简单,因此我将尝试一下。