如何在Kubernetes控制平面(主节点)上调度Pod

默认情况下,出于安全原因,Kubernetes集群不会在控制平面节点上调度Pod。我们建议以这种方式存储,但是在测试环境中,您可以在控制平面节点上调度Pod以最大程度地利用资源。

为了能够在Kubernetes控制平面节点上调度Pod,您需要消除主节点上的污染。

kubectl taint nodes --all node-role.kubernetes.io/master-

输出看起来像这样:

node/k8smaster01.computingforgeeks.com 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污点。这意味着调度程序可以在任何地方调度Pod。

在Kubernetes控制平面节点上测试Pod调度

我有一个包含三个工作程序节点和一个控制平面节点的群集。

$ kubectl get nodes
NAME                                STATUS   ROLES    AGE   VERSION
k8smaster01.computingforgeeks.com   Ready    master   12h   v1.17.0
k8snode01.computingforgeeks.com     Ready       12h   v1.17.0
k8snode02.computingforgeeks.com     Ready       12h   v1.17.0
k8snode03.computingforgeeks.com     Ready       9h    v1.17.0

创建一个演示名称空间。

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

检查是否将Pod安排在控制节点平面上。

$ 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.computingforgeeks.com     
nginx-675bf5bc87-mc6px   1/1     Running   0          17m   192.168.94.13     k8smaster01.computingforgeeks.com   
nginx-675bf5bc87-v5q87   1/1     Running   0          17m   192.168.144.129   k8snode03.computingforgeeks.com     
nginx-675bf5bc87-vctqm   1/1     Running   0          17m   192.168.101.195   k8snode02.computingforgeeks.com     
nginx-675bf5bc87-w5pmh   1/1     Running   0          17m   192.168.213.130   k8snode01.computingforgeeks.com     

您可以看到主节点上有一个容器。验证服务正在运行。

$ kubectl get svc -n demo
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
nginx-service   NodePort   10.96.184.67           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控制平面节点上调度Pod的方式。

其他指南:

如何将新的Kubernetes工作者节点加入现有集群

使用Ansible和Calico CNI在CentOS 7 / CentOS 8上部署Kubernetes集群

如何将指标服务器部署到Kubernetes集群

在Kubernetes集群上安装和使用Helm 3

Sidebar