По умолчанию ваш кластер Kubernetes не будет планировать поды на узле control-plane из соображений безопасности. Рекомендуется оставить все как есть, но для тестовых сред вы можете захотеть запланировать поды на узле control-plane для максимального использования ресурсов.
Если вы хотите иметь возможность планировать стручки на узле Kubernetes control-plane, вам нужно удалить taint на главных узлах.
kubectl taint nodes --all node-role.kubernetes.io/master-
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
Результат будет выглядеть примерно так:
node/k8smaster01.unixs.ru untainted
taint "node-role.kubernetes.io/master" not found
taint "node-role.kubernetes.io/master" not found
taint "node-role.kubernetes.io/master" not found
Это позволит удалить node-role.kubernetes.io/master taint от всех узлов, у которых он есть, включая узел плоскости управления, что означает, что планировщик сможет планировать стручки везде.
Для одиночного узла следует использовать следующую команду:
kubectl taint nodes <node-name> node-role.kubernetes.io/master-
Тестирование планирования бодов на мастер-узлах Kubernetes
У меня есть кластер с тремя рабочими узлами и одним узлом плоскости управления.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster01.unixs.ru Ready master 12h v1.30.3
k8snode01.unixs.ru Ready <none> 12h v1.30.3
k8snode02.unixs.ru Ready <none> 12h v1.30.3
k8snode03.unixs.ru Ready <none> 9h v1.30.3
Создайте демонстрационное пространство имен:
kubectl create namespace demo
Будет создано развертывание с 5 реплики.
vim nginx-deployment.yaml
Ниже приведены данные:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: demo
labels:
app: nginx
color: green
spec:
replicas: 5
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
color: green
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: http
protocol: TCP
containerPort: 80
resources:
limits:
cpu: "200m"
memory: "256Mi"
requests:
cpu: 100m
memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
annotations:
name: nginx-demo-service
namespace: demo
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: nginx
sessionAffinity: None
type: NodePort
Применить манифест:
kubectl apply -f nginx-deployment.yaml
Проверьте, запланирован ли стручок в плоскости узла управления.
$ kubectl get pods -n demo -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-675bf5bc87-666jg 1/1 Running 0 17m 192.168.213.131 k8snode01.unixs.ru
nginx-675bf5bc87-mc6px 1/1 Running 0 17m 192.168.94.13 k8smaster01.unixs.ru
nginx-675bf5bc87-v5q87 1/1 Running 0 17m 192.168.144.129 k8snode03.unixs.ru
nginx-675bf5bc87-vctqm 1/1 Running 0 17m 192.168.101.195 k8snode02.unixs.ru
nginx-675bf5bc87-w5pmh 1/1 Running 0 17m 192.168.213.130 k8snode01.unixs.ru
Мы видим, что в главном узле есть стручок. Подтвердите, что служба работает.
$ kubectl get svc -n demo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service NodePort 10.96.184.67 <none> 80:31098/TCP 21m
Поскольку мы используем NodePort, мы должны иметь возможность получить доступ к сервису на любом IP-адресе узла кластера через порт 31098.
Теперь мы можем очистить демонстрационные объекты.
$ kubectl delete -f nginx-deployment.yaml
deployment.apps "nginx" deleted
service "nginx-service" deleted
$ kubectl get pods,svc -n demo
No resources found in demo namespace.
Вот и все о том, как планировать поды на Kubernetes Control plane Node.