Kubectl применяет развертывание к указанной группе узлов - AWS EKS

Я создал несколько стеков (групп узлов) в моем кластере EKS, и каждая группа работает на другом типе экземпляра (например, одна группа работает на экземплярах GPU). Я добавил запись в mapRoles файла aws-auth-cm.yaml для каждой из групп узлов. Теперь я хотел бы развернуть несколько развертываний на другом. Файлы развертывания выглядят примерно так:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-1
spec:
  replicas: 1
  selector:
    matchLabels:
      component: component-1
  template:
    metadata:
      labels:
        component: component-1
    spec:
      containers:
        - name: d1
          image: docker-container
          ports:
            - containerPort: 83

В документации показано, что я могу запустить стандартную команду kubectl apply. Есть ли способ указать группу? Может что-то вроде

kubectl apply -f server-deployment.yaml -group node-group-1


person Alessandro    schedule 14.08.2019    source источник


Ответы (3)


К сожалению, то, что вы упомянули, не существует, но вы можете прочитать о Affinity и это должно решить вашу проблему.

TL; DR вам нужно добавить метки или использовать существующие метки на узлах и использовать эти метки для назначения подов для правильных узлов.

Предполагая, что у вас есть ярлык beta.kubernetes.io/instance-type=highmem

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-1
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: beta.kubernetes.io/instance-typ
            operator: In
            values:
            - highmem
  replicas: 1
  selector:
    matchLabels:
      component: component-1
  template:
    metadata:
      labels:
        component: component-1
    spec:
      containers:
        - name: d1
          image: docker-container
          ports:
            - containerPort: 83
person FL3SH    schedule 14.08.2019

Вы можете использовать порчи и допуски, чтобы гарантировать, что ваши поды останутся на правых узлах. Это хорошая практика, когда у вас есть разнородные узлы.

Например, в моем развертывании у нас есть 2 класса узлов: к одним из них подключен твердотельный накопитель NVMe, а к другим - нет. Они оба заражены по-разному, и развертывания, которые выполняются поверх, указывают допуски, которые гарантируют, что они останутся только на узлах, которые имеют этот конкретный недостаток.

Например, узел будет иметь:

spec:
    ...
    taints:
    - effect: NoSchedule
      key: role
      value: gpu-instance

и модуль, который должен планироваться на одном из этих узлов, должен иметь:

spec:
    tolerations:
    - effect: NoSchedule
      key: role
      operator: Equal
      value: gpu-instance

После того, как у вас есть эта настройка, вы можете просто сделать обычный kubectl apply, и поды будут правильно нацеливаться на узлы. Обратите внимание, что это более гибкий подход, чем селекторы узлов и метки, поскольку он может дать вам более детальный контроль и настраиваемое поведение вытеснения.

person Anirudh Ramanathan    schedule 14.08.2019
comment
если используется такой подход, то в yaml-файле развертывания ничего указывать не нужно? - person Alessandro; 14.08.2019
comment
Вы должны указать допуск в шаблоне модуля внутри YAML развертывания. - person Anirudh Ramanathan; 14.08.2019

nodeSelector также должен работать для этого, если вы пометили свои узлы

Примеры и дополнительная информация здесь: https://eksworkshop.com/beginner/140_assigning_pods/node_selector/ и здесь https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector

person Vladimir    schedule 25.12.2019