目录

一、背景

1、公有云自建高可用K8S集群存在的问题

1.1 自己配置虚拟IP不可用

1.2 公有云上的负载均衡器禁止流量打回自身

二、集群搭建思路及步骤

1、机器配置

2、Nginx配置

3、集群初始化

4、其他节点加入集群

Master节点加入集群:

Master节点配置权限

Node节点加入集群

5、初始化集群网络

三、注意事项

四、其它方案


一、背景

目前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-01192.168.1.100Master
k8s-master-02192.168.1.101Master
k8s-master-03192.168.1.102Master
k8s-node-01192.168.1.103Node

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。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐