[英]how to run a job in each node of kubernetes instead of daemonset
有一個具有 100 個節點的 kubernetes 集群,我必須手動清理特定圖像,我知道 kubelet 垃圾收集可能會有所幫助,但它不適用於我的案例。 瀏覽互聯網后,我在docker中找到了一個解決方案——docker,解決了我的問題。
我只想刪除每個節點中的圖像一次,有沒有辦法在每個節點中運行一次作業?
我檢查了 kubernetes 標簽和 podaffinity,但仍然沒有任何想法,任何人都可以幫忙嗎?
另外,我嘗試使用 daemonset 來解決問題,但事實證明它只能刪除部分節點而不是所有節點的圖像,我不知道可能是什么問題......
這是守護程序集示例:
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: test-ds
labels:
k8s-app: test
spec:
selector:
matchLabels:
k8s-app: test
template:
metadata:
labels:
k8s-app: test
spec:
containers:
- name: test
env:
- name: DELETE_IMAGE_NAME
value: "nginx"
image: busybox
command: ['sh', '-c', 'curl --unix-socket /var/run/docker.sock -X DELETE http://localhost/v1.39/images/$(DELETE_IMAGE_NAME)']
securityContext:
privileged: true
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-sock-volume
ports:
- containerPort: 80
volumes:
- name: docker-sock-volume
hostPath:
# location on host
path: /var/run/docker.sock
如果您想在單個特定節點上運行您的作業,您可以使用POD規范中的節點選擇器
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: test
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: test
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
nodeSelector:
name: node3
理想情況下,daemon set 應該可以解決您的問題,因為它會在集群中的每個可用節點上創建 POD。
您可以在此處閱讀有關親和力的更多信息: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
nodeSelector提供了一種非常簡單的方法來將 pod 約束到具有特定標簽的節點。 親和/反親和功能,極大地擴展了您可以表達的約束類型。 主要增強功能是
親和/反親和語言更具表現力。 除了使用邏輯 AND 操作創建的精確匹配之外,該語言還提供更多匹配規則;
您可以在作業 YAML 中使用親和力,例如
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In
values:
- e2e-az1
- e2e-az2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
containers:
- name: with-node-affinity
image: k8s.gcr.io/pause:2.0
更新
現在,如果您對與 Job 的 Deamon 親和性有問題,那也是無用的,因為 Job 將創建 Single POD,它將根據親和性將計划安排到單個節點。 要么創建 100 個具有不同關聯規則的作業,要么使用Deployment + Affinity 在不同節點上調度副本。
我們將創建一個具有POD 親和性的部署,並確保單個部署的多個POD 不會被安排在一個節點上。
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
labels:
app: test
spec:
replicas: 100
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- name: test
image: <Image>
ports:
- containerPort: 80
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- test
topologyKey: "kubernetes.io/hostname"
嘗試使用此部署模板並在此處替換您的圖像。 您可以先將副本減少到10 個而不是100 個,以檢查它是否正在傳播 POD。
額外:
您還可以編寫和使用您的自定義 CRD: https://github.com/darkowlzz/daemonset-job ,它將充當守護程序集和作業
另外,我嘗試使用 daemonset 來解決問題,但事實證明它只能刪除部分節點而不是所有節點的圖像
您需要在什么時間點清理圖像? DaemonSet pod 是在節點創建時創建的。 是否有可能在您創建 DaemonSet 時,它會清理已經運行的節點中的圖像。 但是在新節點中,創建 DaemonSet pod 時鏡像不存在?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.