1

有一个 100 个节点的 kubernetes 集群,我必须手动清理特定的图像,我知道 kubelet 垃圾收集可能会有所帮助,但它不适用于我的案例。上网浏览后,我找到了一个解决方案——docker in 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
4

1 回答 1

3

如果您想在单个特定节点上运行您的作业,您可以使用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 操作创建的精确匹配之外,该语言还提供更多匹配规则;

您可以在 Job YAML中使用Affinity ,例如

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

于 2021-12-14T03:57:27.467 回答