DaemonSet+label+taint方式部署高可用的ingress controller

在安装ingress controller的时候,官方有两种安装方式,一种是以deployment方式安装,一种是以daemonset方式安装,默认的deployment 方式replicas为1,也就是只有一个pod,不过ingress controller作为基础设施最好是独享机器且能保证高可用最好了。这个时候推荐使用daemonset安装,默认的官方配置文件会在每个机器都跑一个ingress controller,可是我们希望ingress controller只跑在部分专门做为ingress controller的机器上,这些机器上每个节点跑一个,另外又不希望其他业务的pod被调度到这些ingress controller节点上。这个时候就可以使用DaemonSet+label+taint方式部署高可用的ingress controller

首先给用于部署ingress controller的节点打上标签,以便选择这些节点来调度pod

这里有两个节点分别是:172.16.8.93,172.16.8.94

kubectl label nodes 172.16.8.93 nodeUse=nginx-ingress-controller

kubectl label nodes 172.16.8.94 nodeUse=nginx-ingress-controller

打好标签之后,再给节点打上taint,以便后续的pod不会调度到这两个节点上(如果没有特殊需求,不要添加这个Toleration就好了)。注意这里不能使用NoExecute,不然之前部署在这些节点上的daemonset pod会被删掉,例如网络插件的pod,会导致这些节点网络故障,除非在一开始规划的时候就加上这个Toleration。至于原先调度到这两个节点上的其他pod,会随着deployment更新逐渐被调度到其他节点上,也就没必要驱逐了。

kubectl taint node 172.16.8.93 nodeUse=nginx-ingress-controller:NoSchedule

kubectl taint node 172.16.8.94 nodeUse=nginx-ingress-controller:NoSchedule

这个时候修改官方的daemonset 的yaml文件,加上nodeSelector,以及toleration

这个时候,我们的需求就达到了,在指定的两个节点上各自运行一个nginx ingress controller pod,然后其他的pod不会调度到这个节点上,这两个节点专门用于做七层转发。

最后,如果是阿里云环境的话,SLB四层监听80和443端口,后端服务器组指向这两个节点的ingress controller service暴露的NodePort即可,记得打开健康检查即可。

留下评论