繁体   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