用阿里云ecs部署kubernetes/K8S的坑(VIP、slb、flannel、gw模式)

1 阿里云ecs不支持keepalived vip

1.1 场景描述

本来计划用keepalived配合nginx做VIP漂移,用以反代多台master的apiserver的6443端口,结果部署了vip后,该VIP在其他ecs上访问不到,以为是自己的问题搞了好久搞不定,经工单咨询阿里云工程师,明确告知ecs不支持vip

截图如下:
mark

所以只能只用SLB来实现了,但是slb也有坑,详见解决办法

1.2 解决办法和结论

  1. 阿里云不能使用vip,要用vip只能走slb
  2. slb已经没有免费的了,都要收费,包括内网slb
  3. 不支持手动指定slb的IP地址,所以之前生成的api证书之类的重新弄吧
  4. 要反代https(apiserver),只能用slb的四层反代
  5. slb四层TCP反代(7443),不能直接反代到服务提供者上(即apiserver:6443)
  6. 只能将 tcp反代,先代理到另一个ecs上,ecs再用nginx之类代理到apiserver
  7. 即slb(tcp:7443)-->nginx(tcp:7443)-->apiserver(https:6443)
    (nginx和apiserver不能是同一个机器)

2 阿里云ecs不支持flannel的gw模式

2.1 场景描述

后端node节点不多,且都在同一个vpc下面,计划直接用flannel的host-gw模式来实现容器跨节点通信

选择原因如下:

  1. flannel简单好用,node节点又不多
  2. gw模式只是增加了路由转发条目,性能极高
  3. node节点都在同一个vpc下面,想着二层互通,正好满足gw模式的要求

兴冲冲的开始拿两台ecs部署验证,部署过程很简单,路由条目也自动添加了,但是就是不能互相ping通,又是一顿自我检查没找出原因,工单求助阿里

主要截图如下

mark

2.2 结论和解决办法

2.2.1 结论:

阿里云同一vpc下的ecs,二层不互通

2.2.2 办法1:添加路由

按工程师的要求,在阿里云的路由表中添加了到各容器网段的路由指向后,pod间通信成功,但是问题在于

  1. 添加一个node节点就得来改一次路由表
  2. 路由表是全局生效的,路由器下所有ecs都能访问pod
  3. 要想不全局访问,就得在用安全组来控制

基于上诉问题,最终放弃了改方案

2.2.3 办法2:vxlan模式

gw模式走不通后,只好用flannel的vxlan模式,虽说有性能损耗,但通过压测工具实测,也没有网传的30%-40%的损耗,大概在5%-10%区间,能接受

3 阿里云自建bind9 dns的问题

3.1 问题描述

在阿里云服务器上二进制安装k8s时,需要自建dns,自建的dns需要设置上级dns地址,
常规我们知道的阿里云dns地址是:223.5.5.5和223.6.6.6
如果将这个地址设置为自建dns的上级dns地址,你会发现整个使用自建dns的服务器,都不能解析外网的,如表现为yum不能安装软件

3.2 问题解决

可能的原因是223.5.5.5属于对外网地址,所以需要使用ecs提供的内网dns地址
找到内网dns的方法是:用一个自动获取IP地址的服务器,看该服务器上获取的dns是啥,然后配置该dns地址为bind9的上级dns,该地址大概率是:

nameserver 100.100.2.136
nameserver 100.100.2.138

至此在阿里云ecs部署k8s的几大坑就踩完了
有用请点个推荐,谢了您呢

posted @ 2020-07-01 13:43  noah-罗  阅读(6650)  评论(8编辑  收藏  举报