本文共 2620 字,大约阅读时间需要 8 分钟。
在操作 Kubernetes 集群时,Master 节点默认设置了污点(taints),这意味着 Master 节点不会将 pod 调度到其上。这种默认设置有时会带来不便,例如当我们需要让 Master 节点也作为工作节点运行 pod 时。那么,如何解决这个问题呢?下面我们将分步骤说明。
在本次实验中,我们使用了以下节点配置:
节点名称 | 节点类型 | 版本号 | 装置方式 |
---|---|---|---|
kube-node-01 | Master | v1.11.2 | kubeadm init |
kube-node-02 | Node | v1.11.2 | kubeadm join |
kube-node-03 | Node | v1.11.2 | kubeadm join |
Master 节点这一环境下自带了污点,导致其不接受任何 pod 调度。这一点在运行我们的应用时就有所体现。
第一次运行时,执行以下命令查看 pod 状态:
kubectl get pod -o wide
因为污点的存在,当前环境下节点 kube-node-01
上始终没有 pod 运行:
No resources found.
为了测试,我们需要创建一个 replicationcontroller 来运行有两个 pod 的应用。以下是所需的 YAML 文件示例:
apiVersion: apps.kubmodelName/v1beta1kind: ReplicationControllermetadata: name: test-springboot labels: app: test-springbootspec: replicas: 2 selector: app: test-springboot strategy: 1 template: spec: Containers: - name: test-springboot image: test.springboot:latest ports: - containerPort: 8080
应用文件到集群中:
kubectl apply -f test-springboot-rc.yaml
应用创建成功:
replicationcontroller/test-springboot created
查看 pod 状态:
kubectl get pods -o wide
此时,两个 pod 被分别调度到节点 kube-node-02
和 kube-node-03
上,尚未调度到 Master 节点 kube-node-01
。
扩容到 3 副本:
kubectl scale rc test-springboot --replicas=3
查看 pod 状态:
kubectl get pods -o wide
可以看到,除了两个已经存在的 pod 之外,还添加了一个 pod (test-springboot-6495q
) 到节点 kube-node-03
上。由于污点的存在,这个 pod 未被调度到 Master 节点。
通过扩容到更多副本(如 6 副本)进一步验证:
kubectl scale rc test-springboot --replicas=6
查看 pod 调度情况,仍然发现没有 pod 被调度到 kube-node-01
。
查看 Master 节点的污点设置:
kubectl describe node kube-node-01
输出结果中可以看到:
Taints: node-role.kubernetes.io/master:NoScheduleUnschedulable: false
这意味着目前所有的节点都没有污点相关的容忍策略阻止 pod 调度到 Master 节点。
为了让 pod 能够容忍 Master 节点上的污点,我们需要在 pod 的 YAML 文件中添加容忍策略。
更新后的 YAML 文件如下:
apiVersion: apps.kubmodelName/v1beta1kind: ReplicationControllermetadata: name: test-springboot labels: app: test-springbootspec: replicas: 6 selector: app: test-springboot strategy: 1 template: spec: Containers: - name: test-springboot image: test.springboot:latest ports: - containerPort: 8080 spec: tolerations: # 新增容忍参数 - key: node-role.kubernetes.io/master operator: Exists effect: NoSchedule
应用更新内容:
kubectl apply -f test-springboot-rc.yaml
现在,新的 pod 被允许容忍 Master 节点上的污点,继续扩容到 6 副本:
kubectl scale rc test-springboot --replicas=6
查看 pod 状态:
kubectl get pods -o wide
此时,第 6 个 pod 已经被调度到 Master 节点,并在运行状态中等待一段时间后正常运行。
通过以上步骤,我们成功解决了 Master 节点默认拒绝调度 pod 的问题。关键在于两种解决方案:移除污点 或 配置 pod 容忍污点。虽然在生产环境中移除污点并不推荐,但在测试或其他特殊场景下,可以根据具体需求选择最合适的方案。
转载地址:http://jhryk.baihongyu.com/