[k8s] Я пытаюсь назначить один модуль обычному модулю, а остальные - точечному узлу с помощью podAntiAffinity. - PullRequest
0 голосов
/ 28 апреля 2020

У меня 6 узлов, оба имеют метки «группа: emp», 4 из них имеют метки «iKind: spot», 2 из них имеют метки «ikind: normal».

Я использую развертывание yaml, чтобы назначить один модуль обычному модулю, а другие на узле пятна, но это не сработало.

Я начинаю увеличивать количество модуля с 1 до 6, но когда дело доходит до 2 все модули назначаются на узле пятна

kind: Deployment
apiVersion: apps/v1
metadata:
  name: pod-test
  namespace: emp
  labels:
    app: pod-test
spec:
  replicas: 2 
  selector:
    matchLabels:
      app: pod-test
  strategy:
    type: RollingUpdate 
    rollingUpdate:
      maxSurge: 1 
      maxUnavailable: 0 
  template:
    metadata:
      labels:
        app: pod-test
    spec:
      containers:
        - name: pod-test
          image: k8s.gcr.io/busybox
          args: ["sh","-c","sleep 60000"]
          imagePullPolicy: Always
          resources:
            requests:
              cpu: 10m
              memory: 100Mi
            limits:
              cpu: 100m
              memory: 200Mi
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: group
                    operator: In
                    values:
                      - emp
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 70
            preference:
              matchExpressions:
              - key: ikind
                operator: In
                values:
                - spot
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - pod-test
              topologyKey: ikind
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - pod-test
            topologyKey: "kubernetes.io/hostname"
      restartPolicy: Always
      terminationGracePeriodSeconds: 10
      dnsPolicy: ClusterFirst
      schedulerName: default-scheduler
      ```

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020

Если вы хотите развернуть модули на всех узлах, вам нужно изменить предпочитаемый параметр DuringSchedulingIgnoredDuringExecution.

Изменить

preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 70
            preference:
              matchExpressions:
              - key: ikind
                operator: In
                values:
                - spot

на

preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 70
                preference:
                  matchExpressions:
                  - key: ikind
                    operator: In
                    values:
                    - spot
                    - normal

Теперь это будет развернут на обоих узлах, с ikind:spot и ikind:normal, до того, как это было только спот.

Я проверил его на 3 узлах gke, и все, кажется, работает нормально.

pod-test-54dc97fbcb-9hvvm   1/1     Running       gke-cluster-1-default-pool-1ffaf1b8-gmhb   <none>           <none>
pod-test-54dc97fbcb-k2hv2   1/1     Running       gke-cluster-1-default-pool-1ffaf1b8-gmhb   <none>           <none>
pod-test-54dc97fbcb-nqd97   1/1     Running       gke-cluster-1-default-pool-1ffaf1b8-7c25   <none>           <none>
pod-test-54dc97fbcb-zq9df   1/1     Running       gke-cluster-1-default-pool-1ffaf1b8-jk6t   <none>           <none>
pod-test-54dc97fbcb-zvwhk   1/1     Running        gke-cluster-1-default-pool-1ffaf1b8-7c25   <none>           <none>

Это хорошо описано здесь

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

Это правило соответствия узлов говорит, что модуль может быть размещен только на узле с меткой, ключом которой является kubernetes.io/e2e -az-name и значением которого является e2e-az1 или e2e-az2. Кроме того, среди узлов, удовлетворяющих этому критерию, следует отдавать предпочтение узлам с меткой, ключом которой является ключ-другого-узла-метки, а значением которого является значение-другого-узла-метки.

0 голосов
/ 28 апреля 2020

Я добавляю узел, предпочитаю matchExpressions нормальному и даю вес 30, и это работает. Чтобы избежать влияния номеров узлов, я изменяю вес нормали и пятна.

Когда реплики равны 1, в нормальном узле есть 1 модуль

Когда реплик равно 2, есть 1 модуль в нормальном узле и 1 модуль в точечном узле

Когда количество реплик равно 3, есть 2 модуля в нормальном узле и 1 модуль в точечном узле

preferredDuringSchedulingIgnoredDuringExecution: - weight: 70 preference: matchExpressions: - key: ikind operator: In values: - normal - weight: 30 preference: matchExpressions: - key: ikind operator: In values: - spot

0 голосов
/ 28 апреля 2020

Поскольку точечные узлы и нормальные узлы имеют метку group=emp, планировщик kubernetes может выбрать узел-кандидат с меткой group=emp, который может быть точечным узлом или нормальным узлом, и после этого он будет применять preferredDuringSchedulingIgnoredDuringExecution для предпочтения точечный узел для планирования стручка. В зависимости от пропускной способности точечного узла планировщик может не иметь возможности планировать его на точечном узле. Следовательно, поскольку планировщик альтернативного выбора планирует расписание модуля на нормальном узле. Таким образом, вы можете либо иметь разные метки для нормального узла и точечного узла и выбирать на основе метки точечного узла, либо вы можете использовать requiredDuringSchedulingIgnoredDuringExecution. Это наложит жесткое ограничение на планировщик для планирования модуля только на узле спот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...