【发布时间】:2019-03-16 17:58:55
【问题描述】:
我想知道是否有可能在 Kubernetes 中有一个每小时运行一次的作业,并且会删除某些 pod。我需要这个作为临时的 解决问题的止损。
【问题讨论】:
-
为什么不在 k8s 之外运行一个 cron 到
delete certain pods每小时。容易多了?
标签: kubernetes kubernetes-helm
我想知道是否有可能在 Kubernetes 中有一个每小时运行一次的作业,并且会删除某些 pod。我需要这个作为临时的 解决问题的止损。
【问题讨论】:
delete certain pods 每小时。容易多了?
标签: kubernetes kubernetes-helm
可以从具有适当权限的 Pod (3) 访问 K8S API。创建 Pod 时,默认情况下会为其分配一个 default ServiceAccount (4)。 default ServiceAccount 没有 RoleBinding,因此 default ServiceAccount 和 Pod 也没有调用 API 的权限。
如果一个角色(有权限)被创建并映射到default ServiceAccount,那么默认情况下所有的 Pod 都会获得这些权限。所以,最好新建一个ServiceAccount,而不是修改default ServiceAccount。
所以,这里是 RBAC (5) 的步骤
我知道这有点令人困惑,但这就是 K8S 的工作方式。
【讨论】:
是的,这是可能的。
我认为最简单的方法是直接从作业中调用 Kubernernes API。考虑到已配置 RBAC,如下所示:
apiVersion: batch/v1
kind: Job
metadata:
name: cleanup
spec:
serviceAccountName: service-account-that-has-access-to-api
template:
spec:
containers:
- name: cleanup
image: image-that-has-curl
command:
- curl
- -ik
- -X
- DELETE
- -H
- "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
- https://kubernetes.default.svc.cluster.local/api/v1/namespaces/{namespace}/pods/{name}
restartPolicy: Never
backoffLimit: 4
您还可以运行 kubectl 代理 sidecar 以使用 localhost 连接到集群。更多信息here
或者甚至在 pod 中运行普通的 kubectl 也是一种选择:Kubernetes - How to run kubectl commands inside a container?
【讨论】:
可能还有另一种解决方法。
您可以创建一个 liveness probe(如果您还没有的话,超级简单),直到一小时后才运行并且总是失败。
livenessProbe:
tcpSocket:
port: 1234
initialDelaySeconds: 3600
这将等待 3600 秒(1 小时),然后尝试连接到端口 1234,如果失败,它将杀死容器(而不是 pod!)。
【讨论】: