如何在Openshift中让Router-Pod独占Router节点
概念
什么是Router Pod?
Router Pod是Openshift中管理外部流量访问集群服务的重要的入口,它是通过一个haproxy的Pod实现的。由于Router Pod的独特性,几乎所有的流量都过Router中的Pod代理到真正的服务,所以它是一个非常非常重要的服务。
什么是Router节点
因为集群中的Router Pod数量是有限的,外部流量通过负载均衡器到达Router的Pod,所以对于Router Pod必须固定在负载均衡器下的节点上。这些运行Router Pod的节点,我们叫做Router节点。
它有两个特点:
- 运行default/router的pod;
- 被外部负载均衡器监听
为什么需要让Router Pod独占Router节点上
几乎所有的外部访问集群服务的流量都通过Router Pod代理,所以它是非常重要。在正式使用时,需要对它进行保护。让它独占节点,防止其它Pod抢占Router Pod的资源,以确保集群下服务的可用性。
具体实施Router Pod独占绑定Router节点
- Router节点上添加label
1
oc label node router1.it.example.com router=true
- Route节点上添加taint
1
oc adm taint node router2.it.example.com router=true:NoSchedule
- Router的DC上添加节点亲和配置
1
2
3
4
5
6
7
8
9
10spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: router
operator: In
values:
- "true" - Router的DC上使用污点容忍
1
2
3
4
5spec:
tolerations:
- effect: NoSchedule
key: router
operator: Exists
遇到的问题
- 最开始的时候并没有使用Node Affinity,而是使用nodeSelector来绑定Pod与Node。但是使用nodeSelector后,部署pod时集群部署pod(pod_deploy)会带上nodeSelector的属性,而并不会带上容忍污点tolerations的属性,这就导致了pod_deploy无法被调度。
- 解决办法 :用nodeAffinity替换nodeSelector。pod_deploy也不会带上nodeAffinity的属性,成功被调度
参考文章
Pod的调度规则请参考: 玩转Openshift中Pod调度
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Michael Blog!
评论