Введение
В Kubernetes сходство с узлами (node affinity) используется для планирования подов на узлах, соответствующих определенным условиям. Это позволяет гарантировать, что поды будут запущены на узлах конкретного типа, или распределять рабочую нагрузку между узлами. В этой лабораторной работе мы научимся использовать node affinity для размещения подов на определенных узлах.
Запуск кластера Minikube
Перед созданием ресурсов необходимо иметь запущенный кластер Kubernetes. Minikube — это легковесная среда Kubernetes, которая работает на вашей локальной машине.
Перейдите в рабочую директорию:
Откройте терминал и перейдите в папку проекта по умолчанию:
cd /home/labex/projectЗапустите Minikube:
Запустите Minikube для инициализации кластера Kubernetes:
minikube start- Эта команда развернет одноузловой кластер Kubernetes на вашей локальной машине.
- Запуск Minikube может занять несколько минут в зависимости от производительности вашей системы.
Проверьте работу Minikube:
Проверьте статус кластера Minikube:
minikube status- Убедитесь, что компоненты, такие как
kubeletиapiserver, имеют статусRunning. - Если кластер не запущен, выполните
minikube startповторно.
- Убедитесь, что компоненты, такие как
Если при запуске Minikube возникли проблемы, используйте minikube delete для сброса среды, если это необходимо.
Выполняйте остальные шаги этой лабораторной работы из директории /home/labex/project, чтобы файлы YAML оставались в одной рабочей папке.
Создание узла с метками
На этом этапе мы создадим узел с меткой, которая будет использоваться для планирования подов.
- Создайте файл с именем
node-with-label.yamlсо следующим содержимым в директории/home/labex/project:
apiVersion: v1
kind: Node
metadata:
name: minikube
labels:
type: web
- Примените изменения:
kubectl apply -f node-with-label.yaml
- Убедитесь, что узел был создан и получил метку:
kubectl get nodes --show-labels
Создание пода с использованием Node Affinity
На этом этапе мы создадим под с правилом сходства с узлом, которое гарантирует его размещение на узле с определенной меткой.
- Создайте файл с именем
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
- Примените изменения:
kubectl apply -f pod-with-node-affinity.yaml
- Убедитесь, что под запланирован на узле с меткой
type=web:
kubectl get pod pod-with-node-affinity -o wide
Создание пода с использованием Node Anti-Affinity
На этом этапе мы создадим под с правилом анти-сходства с узлом, которое гарантирует, что он не будет запланирован на узле с определенной меткой.
- Создайте файл с именем
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
- Примените изменения:
kubectl apply -f pod-with-node-anti-affinity.yaml
- Убедитесь, что под не запланирован на узле с меткой
type=db(в данном случае он будет искать узел, где меткаtypeне равнаweb):
kubectl get pod pod-with-node-anti-affinity -o wide
Создание пода с использованием Node Affinity и Node Selector
На этом этапе мы создадим под, использующий одновременно правило node affinity и nodeSelector, чтобы гарантировать его размещение на узле с конкретной меткой.
- Создайте файл с именем
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
- Примените изменения:
kubectl apply -f pod-with-node-affinity-and-selector.yaml
- Убедитесь, что под не запланирован (так как правила
nodeSelectorиnodeAffinityпротиворечат друг другу):
kubectl get pod pod-with-node-affinity-and-selector -o wide
Создание пода с несколькими правилами Node Affinity
На этом этапе мы создадим под с несколькими правилами сходства с узлами, которые гарантируют его размещение на узле, соответствующем всем указанным правилам.
- Создайте файл с именем
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
- Примените изменения:
kubectl apply -f pod-with-multiple-node-affinity.yaml
- Убедитесь, что под запланирован на узле, имеющем метки
type=webиdisktype=ssd:
kubectl get pod pod-with-multiple-node-affinity -o wide
Резюме
В этой лабораторной работе мы изучили, как использовать сходство с узлами (node affinity) для планирования подов на определенных узлах. Мы создали узел с меткой, а затем создали поды с правилами node affinity, которые гарантировали их размещение на узлах с нужными метками. Мы также создали под с правилом анти-сходства (node anti-affinity), чтобы исключить размещение на определенных узлах. Наконец, мы создали под с несколькими правилами сходства, требующими соответствия сразу нескольким меткам узла.


