博客
关于我
kubernetes调度pod运行于master节点上
阅读量:793 次
发布时间:2023-01-29

本文共 2620 字,大约阅读时间需要 8 分钟。

Kubernetes 集群:Master 节点默认拒绝调度 Pod

在操作 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 调度。这一点在运行我们的应用时就有所体现。


操作步骤

1. 查看当前环境

第一次运行时,执行以下命令查看 pod 状态:

kubectl get pod -o wide

因为污点的存在,当前环境下节点 kube-node-01 上始终没有 pod 运行:

No resources found.

2. 准备一个 YAML 文件创建 Pod(2 副本)

为了测试,我们需要创建一个 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-02kube-node-03 上,尚未调度到 Master 节点 kube-node-01


3. 扩容 Pod 副本观察

扩容到 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


4. 查看 Master 节点的容忍参数

查看 Master 节点的污点设置:

kubectl describe node kube-node-01

输出结果中可以看到:

Taints: node-role.kubernetes.io/master:NoScheduleUnschedulable:      false

这意味着目前所有的节点都没有污点相关的容忍策略阻止 pod 调度到 Master 节点。


5. 添加污点容忍

为了让 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/

你可能感兴趣的文章
java.io.tmpdir
查看>>
java.lang.IllegalStateException: Optional int parameter 'id' is not present but cannot be translated
查看>>
java农副产品购物app的设计与开发(ssm)
查看>>
JAVA分布式系统
查看>>
java分布式链路追踪;jvm应用监控-skywalking
查看>>
Java创建elasticsearch的model时,如何配置使用ik分词器?
查看>>
java加密解密
查看>>
java勤工助学管理系统
查看>>
JAVA反射
查看>>
Java反射
查看>>
java反射介绍
查看>>
Java反射代码编写
查看>>
JAVA反射机制
查看>>
JAVA反射机制
查看>>
java反射机制完成List map 与List javabean ,List 对象 之间的互相转换
查看>>
Java反射获取private属性和方法(子类,父类,祖先....)
查看>>
java反射(1):Class代表类
查看>>
Java反序列化-CC2分析,从零基础到精通,收藏这篇就够了!
查看>>
Java反序列化和JNDI注入漏洞案例实战
查看>>
Java反序列化测试
查看>>