簡體   English   中英

如何在 kubernetes 的每個節點而不是 daemonset 中運行作業

[英]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。

閱讀更多: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#an-example-of-a-pod-that-uses-pod-affinity

額外

您還可以編寫和使用您的自定義 CRD: https://github.com/darkowlzz/daemonset-job ,它將充當守護程序集作業

另外,我嘗試使用 daemonset 來解決問題,但事實證明它只能刪除部分節點而不是所有節點的圖像

您需要在什么時間點清理圖像? DaemonSet pod 是在節點創建時創建的。 是否有可能在您創建 DaemonSet 時,它會清理已經運行的節點中的圖像。 但是在新節點中,創建 DaemonSet pod 時鏡像不存在?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM