По умолчанию ваш кластер 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.

расписание работы стручков на узле плоскости управления k8s

Теперь мы можем очистить демонстрационные объекты.

$ 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.