Планирование с использованием сходства с узлами (Node Affinity)

KubernetesBeginner
Практиковаться сейчас

Введение

В Kubernetes сходство с узлами (node affinity) используется для планирования подов на узлах, соответствующих определенным условиям. Это позволяет гарантировать, что поды будут запущены на узлах конкретного типа, или распределять рабочую нагрузку между узлами. В этой лабораторной работе мы научимся использовать node affinity для размещения подов на определенных узлах.

Запуск кластера Minikube

Перед созданием ресурсов необходимо иметь запущенный кластер Kubernetes. Minikube — это легковесная среда Kubernetes, которая работает на вашей локальной машине.

  1. Перейдите в рабочую директорию:

    Откройте терминал и перейдите в папку проекта по умолчанию:

    cd /home/labex/project
    
  2. Запустите Minikube:

    Запустите Minikube для инициализации кластера Kubernetes:

    minikube start
    
    • Эта команда развернет одноузловой кластер Kubernetes на вашей локальной машине.
    • Запуск Minikube может занять несколько минут в зависимости от производительности вашей системы.
  3. Проверьте работу Minikube:

    Проверьте статус кластера Minikube:

    minikube status
    
    • Убедитесь, что компоненты, такие как kubelet и apiserver, имеют статус Running.
    • Если кластер не запущен, выполните minikube start повторно.

Если при запуске Minikube возникли проблемы, используйте minikube delete для сброса среды, если это необходимо.

Выполняйте остальные шаги этой лабораторной работы из директории /home/labex/project, чтобы файлы YAML оставались в одной рабочей папке.

Создание узла с метками

На этом этапе мы создадим узел с меткой, которая будет использоваться для планирования подов.

  1. Создайте файл с именем node-with-label.yaml со следующим содержимым в директории /home/labex/project:
apiVersion: v1
kind: Node
metadata:
  name: minikube
  labels:
    type: web
  1. Примените изменения:
kubectl apply -f node-with-label.yaml
  1. Убедитесь, что узел был создан и получил метку:
kubectl get nodes --show-labels

Создание пода с использованием Node Affinity

На этом этапе мы создадим под с правилом сходства с узлом, которое гарантирует его размещение на узле с определенной меткой.

  1. Создайте файл с именем pod-with-node-affinity.yaml со следующим содержимым в директории /home/labex/project:
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-node-affinity
spec:
  containers:
    - name: nginx
      image: nginx:latest
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: type
                operator: In
                values:
                  - web
  1. Примените изменения:
kubectl apply -f pod-with-node-affinity.yaml
  1. Убедитесь, что под запланирован на узле с меткой type=web:
kubectl get pod pod-with-node-affinity -o wide

Создание пода с использованием Node Anti-Affinity

На этом этапе мы создадим под с правилом анти-сходства с узлом, которое гарантирует, что он не будет запланирован на узле с определенной меткой.

  1. Создайте файл с именем pod-with-node-anti-affinity.yaml со следующим содержимым в директории /home/labex/project:
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-node-anti-affinity
spec:
  containers:
    - name: nginx
      image: nginx:latest
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: type
                operator: NotIn
                values:
                  - web
  1. Примените изменения:
kubectl apply -f pod-with-node-anti-affinity.yaml
  1. Убедитесь, что под не запланирован на узле с меткой type=db (в данном случае он будет искать узел, где метка type не равна web):
kubectl get pod pod-with-node-anti-affinity -o wide

Создание пода с использованием Node Affinity и Node Selector

На этом этапе мы создадим под, использующий одновременно правило node affinity и nodeSelector, чтобы гарантировать его размещение на узле с конкретной меткой.

  1. Создайте файл с именем pod-with-node-affinity-and-selector.yaml со следующим содержимым в директории /home/labex/project:
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-node-affinity-and-selector
spec:
  containers:
    - name: nginx
      image: nginx:latest
  nodeSelector:
    type: web
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: type
                operator: In
                values:
                  - db
  1. Примените изменения:
kubectl apply -f pod-with-node-affinity-and-selector.yaml
  1. Убедитесь, что под не запланирован (так как правила nodeSelector и nodeAffinity противоречат друг другу):
kubectl get pod pod-with-node-affinity-and-selector -o wide

Создание пода с несколькими правилами Node Affinity

На этом этапе мы создадим под с несколькими правилами сходства с узлами, которые гарантируют его размещение на узле, соответствующем всем указанным правилам.

  1. Создайте файл с именем pod-with-multiple-node-affinity.yaml со следующим содержимым в директории /home/labex/project:
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-multiple-node-affinity
spec:
  containers:
    - name: nginx
      image: nginx:latest
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: type
                operator: In
                values:
                  - web
          - matchExpressions:
              - key: disktype
                operator: In
                values:
                  - ssd
  1. Примените изменения:
kubectl apply -f pod-with-multiple-node-affinity.yaml
  1. Убедитесь, что под запланирован на узле, имеющем метки type=web и disktype=ssd:
kubectl get pod pod-with-multiple-node-affinity -o wide

Резюме

В этой лабораторной работе мы изучили, как использовать сходство с узлами (node affinity) для планирования подов на определенных узлах. Мы создали узел с меткой, а затем создали поды с правилами node affinity, которые гарантировали их размещение на узлах с нужными метками. Мы также создали под с правилом анти-сходства (node anti-affinity), чтобы исключить размещение на определенных узлах. Наконец, мы создали под с несколькими правилами сходства, требующими соответствия сразу нескольким меткам узла.