作为一名贫苦学生,想要搭建线上的K8S集群就只能通过白嫖各大厂商的学生机。。。而每个厂商的学生机又是每个账号限购一份,所以想要搭建多节点的K8S集群就要跨云供应商。
对于Centos多节点K8S集群的搭建,参考下面这篇博文,按照上面的步骤搭建也是非常顺利。
kubeadm部署kubernetes v1.16.3集群blog.csdn.net现在最大的问题就是跨供应商的问题。对于厂商的ECS来说,从本机获取的IP都是默认的内网IP,这样就导致按照上面博文中的步骤,两个供应商之间的节点是不通的,因为这样搭建的K8S使用的是内网IP。所以,在搭建的时候需要更改一些配置。
init时外网IP替换内网IP
使用ifconfig获取本机IP时,我们就可以发现,其实在ECS上能获取到的只有内网IP,个人猜测这也是K8S使用内网IP的原因。
所以在 Master 节点 init 的时候,产生的join命令的IP是内网IP。如果在node节点直接将join命令里的IP换成外网IP,此时会验证的错误。因为虽然访问的目标地址是一样的,但是外网IP的apiserver是没有被认证的,所以使用 --apiserver-cert-extra-sans=extern IP
,把外网IP加进去。
但是之后还会因为这个问题报错。之后Node节点会发送HTTP请求到Master节点获取ConfigMap,而此时外网IP仅仅是被当做额外认证的IP加了进去,但HTTP请求的地址仍是内网IP。这里就需要在Master初始化时指定参数 --control-plane-endpoint="extern IP: port"
。这样,之后的HTTP请求都会发向外网IP的地址。
这里还有一种解法,使用iptables对发现内网IP的请求进行转发,直接转向外网IP。
iptables -t nat -I OUTPUT -d 内网IP -j DNAT --to 外网IP
IP forward
上面的博文配置的时候,需要开启IP forward,但有时仍会在 kubeadm init
的时候,报如下的错:
[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
参考GitHub上的issue,重启docker即可
https://github.com/kubernetes/kubeadm/issues/1062github.comsystemctl restart docker
CPU数量限制
目前各大厂商的学生机的配置都是1核2G,而K8S的默认配置要求是至少2核,而这个检查是在pre-flight里做的,所以只需要添加参数忽略对应的报错就可以了。
最终Master节点初始化的命令为
kubeadm init
--apiserver-cert-extra-sans=47.103.21.70
--image-repository=registry.aliyuncs.com/google_containers
--pod-network-cidr=192.168.0.0/16
--ignore-preflight-errors=NumCPU
--control-plane-endpoint="47.103.21.70:6443"
--image-repository
指定拉取镜像的仓库
--pod-network-cidr
是使用 calico 网络插件所固定的参数
总结
虽然说用学生机搭建的K8S集群性能上肯定有问题,但作为学习K8S和实操的工具也算足够了。