公有云上自建高可用K8S集群
目前K8S已经成为公有云上的标配PASS服务了,使用起来比较方便,但我们因为一些特殊的原因,需要在公有云上自建K8S集群,网上找到的相关资料也都比较少。凭借找到为数不多的文章,经过了一些实际测试,终于找到了一种使用Nginx在公有云上自建高可用K8S集群的方法。
目录
一、背景
目前K8S已经成为公有云上的标配PASS服务了,使用起来比较方便,但我们因为一些特殊的原因,需要在公有云上自建K8S集群,网上找到的相关资料也都比较少。凭借找到为数不多的文章,经过了一些实际测试,终于找到了一种在公有云上自建高可用K8S集群的方法。
1、公有云自建高可用K8S集群存在的问题
若在公有云上搭建单Master的K8s集群比较简单,按照正常的步骤操作即可,但是为了保证服务的高可用,一般都采用至少3Master的配置。
1.1 自己配置虚拟IP不可用
使用本地的虚拟机进行搭建K8S集群时,可以使用 Keepalived + Haproxy 的方式,将K8s的Master绑定一个虚拟IP(VIP)从而实现集群的高可用,但是在公有云上一般禁止使用keepalived自己配置VIP。
1.2 公有云上的负载均衡器禁止流量打回自身
阿里云的SLB和Azure的ILB等云商的负载均衡器,默认都不支持后端服务器通过LB将流量转发到自己。跟云商交流,是因为该流的源IP和目标IP都是该服务器本身,是一个环回数据包,因此不会向外回复。若想实现此功能,需要一些较为复杂的配置。
二、集群搭建思路及步骤
Master初始化时指定 localhost:Port,这个Port使用除6443外的任意端口即可(以下使用16443端口),然后通过nginx、haproxy等软件(以下使用Nginx为例)负载均衡,将流量转发到所有Master的6443端口。
1、机器配置
机器名称 | 机器IP | 角色 | 备注 |
---|---|---|---|
k8s-master-01 | 192.168.1.100 | Master | |
k8s-master-02 | 192.168.1.101 | Master | |
k8s-master-03 | 192.168.1.102 | Master | |
k8s-node-01 | 192.168.1.103 | Node |
2、Nginx配置
Master和Node节点都需要配置Nginx,负责将打到本机16443端口的流量负载均衡到Master的6443端口的地址。
需要注意,要配置4层的TCP负载均衡,而不是7层的http负载均衡。
Nginx配置如下:
stream {
upstream k8smaster {
#weigth参数表示权值,权值越高被分配到的几率越大:
server 192.168.1.100:6443 weight=1;
server 192.168.1.101:6443 weight=1;
server 192.168.1.102:6443 weight=1;
}
server {
listen 16443;
### 反向代理upstream
proxy_pass k8smaster;
}
}
3、集群初始化
kubeadm init --control-plane-endpoint 127.0.0.1:16443 \
--upload-certs --kubernetes-version v1.20.9 \
--pod-network-cidr 10.244.0.0/16
初始化后的信息如下:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of the control-plane node running the following command on each as root:
kubeadm join 127.0.0.1:16443 --token a14jww.45n5riczh7eaobp0 \
--discovery-token-ca-cert-hash sha256:6a7342b811e349d31ebfcf04e0cece8b58bcf592ba0f4052e17c16581db4818a \
--control-plane --certificate-key 38c46ead41bebc3bd8edr02df7ce05fddc9bfccabfc99egc8dd66befdbj4e3765
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 127.0.0.1:16443 --token a14jww.45n5riczh7eaobp0 \
--discovery-token-ca-cert-hash sha256:6a7342b811e349d31ebfcf04e0cece8b58bcf592ba0f4052e17c16581db4818a
4、其他节点加入集群
Master节点加入集群:
kubeadm join 127.0.0.1:16443 --token a14jww.45n5riczh7eaobp0 \
--discovery-token-ca-cert-hash sha256:6a7342b811e349d31ebfcf04e0cece8b58bcf592ba0f4052e17c16581db4818a \
--control-plane --certificate-key 38c46ead41bebc3bd8edr02df7ce05fddc9bfccabfc99egc8dd66befdbj4e3765
Master节点配置权限
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Node节点加入集群
kubeadm join 127.0.0.1:16443 --token a14jww.45n5riczh7eaobp0 \
--discovery-token-ca-cert-hash sha256:6a7342b811e349d31ebfcf04e0cece8b58bcf592ba0f4052e17c16581db4818a
5、初始化集群网络
这里使用flannel网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
到这一步集群应该就初始化完成了,查看集群状态:
$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-01 Ready control-plane,master 1d v1.20.9
k8s-master-02 Ready control-plane,master 1d v1.20.9
k8s-master-03 Ready control-plane,master 1d v1.20.9
k8s-node-01 Ready <none> 1d v1.20.9
三、注意事项
1、Nginx的1.16.1版本默认带有四层负载均衡stream模块。1.20.1版本的steam模块需要自己编译,yum安装的默认版本不带,要使用最新版本的话,可以去官网下载编译。
四、其它方案
下边这篇博客通过修改host的方式实现了高可用集群的搭建,也是一种思路。
2搭建 Kubernetes 高可用集群 - dudu - 博0客园
集群初始化时指定control-plane-endpoint为k8s-api,在host文件里配置k8s-api指向Master01的IP,等Master02、03加入集群后,再将Master02、03的host文件k8s-api修改为指向自己的IP。Node节点则将host的k8s-api配置到云服务器厂商提供的SLB、ILB等负载均衡器的虚拟IP上,负载均衡器的后端再指向集群Master。
更多推荐
所有评论(0)