本文分享自华为云社区《使用 Keepalived 和 HAproxy 创建高可用 Kubernetes 集群》,作者:江晚正愁余。
高可用 Kubernetes 集群能够确保应用程序在运行时不会出现服务停止,这也是生产的需求之一。为此,有许多方法可供选择以实现高可用。
本教程演示了怎样配置 Keepalived 和 HAproxy 使负载均衡、实现高可用。步骤如下:
- 准备主机。
- 配置 Keepalived 和 HAproxy。
- 使用 KubeKey 创建 Kubernetes 集群,并安装 KubeSphere。
集群架构
示例集群有三个主节点,三个工作节点,两个用于负载均衡的节点,以及一个假造 IP 所在。本示例中的假造 IP 所在也可称为“浮动 IP 所在”。这意味着在节点故障的环境下,该 IP 所在可在节点之间漂移,从而实现高可用。
请留意,在本示例中,Keepalived 和 HAproxy 没有安装在任何主节点上。但您也可以这样做,并同时实现高可用。然而,配置两个用于负载均衡的特定节点(您可以按需增加更多此类节点)会更加安全。这两个节点上只安装 Keepalived 和 HAproxy,以避免与任何 Kubernetes 组件和服务的潜在冲突。
准备主机
IP 所在
主机名
角色
172.16.0.2
lb1
Keepalived & HAproxy
172.16.0.3
lb2
Keepalived & HAproxy
172.16.0.4
master1
master, etcd
172.16.0.5
master2
master, etcd
172.16.0.6
master3
master, etcd
172.16.0.7
worker1
worker
172.16.0.8
worker2
worker
172.16.0.9
worker3
worker
172.16.0.10
假造 IP 所在
有关更多节点、网络、依靠项等要求的信息,请拜见多节点安装。
配置负载均衡
Keepalived 提供 VRRP 实现,并允许您配置 Linux 机器使负载均衡,预防单点故障。HAProxy 提供可靠、高性能的负载均衡,能与 Keepalived 完美共同。
由于 lb1 和 lb2 上安装了 Keepalived 和 HAproxy,如果其中一个节点故障,假造 IP 所在(即浮动 IP 所在)将主动与另一个节点关联,使集群仍然可以正常运行,从而实现高可用。若有必要,也可以此为目的,添加更多安装 Keepalived 和 HAproxy 的节点。
先运行以下下令安装 Keepalived 和 HAproxy。- yum install keepalived haproxy psmisc -y
复制代码 HAproxy
1.在两台用于负载均衡的机器上运行以下下令以配置 Proxy(两台机器的 Proxy 配置相同):- vi /etc/haproxy/haproxy.cfg
复制代码 2.以下是示例配置,供您参考(请留意 server 字段。请记着 6443 是 apiserver 端口):- global
- log /dev/log local0 warning
- chroot /var/lib/haproxy
- pidfile /var/run/haproxy.pid
- maxconn 4000
- user haproxy
- group haproxy
- daemon
- stats socket /var/lib/haproxy/stats
- defaults
- log global
- option httplog
- option dontlognull
- timeout connect 5000
- timeout client 50000
- timeout server 50000
- frontend kube-apiserver
- bind *:6443
- mode tcp
- option tcplog
- default_backend kube-apiserver
- backend kube-apiserver
- mode tcp
- option tcplog
- option tcp-check
- balance roundrobin
- default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
- server kube-apiserver-1 172.16.0.4:6443 check # Replace the IP address with your own.
- server kube-apiserver-2 172.16.0.5:6443 check # Replace the IP address with your own.
- server kube-apiserver-3 172.16.0.6:6443 check # Replace the IP address with your own.
复制代码 3.保存文件并运行以下下令以重启 HAproxy。- systemctl restart haproxy
复制代码 4.使 HAproxy 在开机后主动运行:5.确保您在另一台机器 (lb2) 上也配置了 HAproxy。
Keepalived
两台机器上必须都安装 Keepalived,但在配置上略有不同。
1.运行以下下令以配置 Keepalived。- vi /etc/keepalived/keepalived.conf
复制代码 2.以下是示例配置 (lb1),供您参考:- global_defs {
- notification_email {
- }
- router_id LVS_DEVEL
- vrrp_skip_check_adv_addr
- vrrp_garp_interval 0
- vrrp_gna_interval 0
- }
- vrrp_script chk_haproxy {
- script "killall -0 haproxy"
- interval 2
- weight 2
- }
- vrrp_instance haproxy-vip {
- state BACKUP
- priority 100
- interface eth0 # Network card
- virtual_router_id 60
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- unicast_src_ip 172.16.0.2 # The IP address of this machine
- unicast_peer {
- 172.16.0.3 # The IP address of peer machines
- }
- virtual_ipaddress {
- 172.16.0.10/24 # The VIP address
- }
- track_script {
- chk_haproxy
- }
- }
复制代码 备注
- 对于 interface 字段,您必须提供自己的网卡信息。您可以在机器上运行 ifconfig 以获取该值。
- 为 unicast_src_ip 提供的 IP 所在是您当前机器的 IP 所在。对于也安装了 HAproxy 和 Keepalived 举行负载均衡的其他机器,必须在字段 unicast_peer 中输入其 IP 所在。
3.保存文件并运行以下下令以重启 Keepalived。- systemctl restart keepalived
复制代码 4.使 Keepalived 在开机后主动运行:- systemctl enable keepalived
复制代码 5.确保您在另一台机器 (lb2) 上也配置了 Keepalived。
验证高可用
在开始创建 Kubernetes 集群之前,请确保已经测试了高可用。
1.在机器 lb1 上,运行以下下令:- [[email protected] ~]# ip a s
- 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- inet 127.0.0.1/8 scope host lo
- valid_lft forever preferred_lft forever
- inet6 ::1/128 scope host
- valid_lft forever preferred_lft forever
- 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
- link/ether 52:54:9e:27:38:c8 brd ff:ff:ff:ff:ff:ff
- inet 172.16.0.2/24 brd 172.16.0.255 scope global noprefixroute dynamic eth0
- valid_lft 73334sec preferred_lft 73334sec
- inet 172.16.0.10/24 scope global secondary eth0 # The VIP address
- valid_lft forever preferred_lft forever
- inet6 fe80::510e:f96:98b2:af40/64 scope link noprefixroute
- valid_lft forever preferred_lft forever
复制代码 2.如上图所示,假造 IP 所在已经成功添加。模仿此节点上的故障:3.再次检查浮动 IP 所在,您可以看到该所在在 lb1 上消失了。- [[email protected] ~]# ip a s
- 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- inet 127.0.0.1/8 scope host lo
- valid_lft forever preferred_lft forever
- inet6 ::1/128 scope host
- valid_lft forever preferred_lft forever
- 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
- link/ether 52:54:9e:27:38:c8 brd ff:ff:ff:ff:ff:ff
- inet 172.16.0.2/24 brd 172.16.0.255 scope global noprefixroute dynamic eth0
- valid_lft 72802sec preferred_lft 72802sec
- inet6 fe80::510e:f96:98b2:af40/64 scope link noprefixroute
- valid_lft forever preferred_lft forever
复制代码 4.理论上讲,若配置成功,该假造 IP 会漂移到另一台机器 (lb2) 上。在 lb2 上运行以下下令,这是预期的输出:- [[email protected] ~]# ip a s
- 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- inet 127.0.0.1/8 scope host lo
- valid_lft forever preferred_lft forever
- inet6 ::1/128 scope host
- valid_lft forever preferred_lft forever
- 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
- link/ether 52:54:9e:3f:51:ba brd ff:ff:ff:ff:ff:ff
- inet 172.16.0.3/24 brd 172.16.0.255 scope global noprefixroute dynamic eth0
- valid_lft 72690sec preferred_lft 72690sec
- inet 172.16.0.10/24 scope global secondary eth0 # The VIP address
- valid_lft forever preferred_lft forever
- inet6 fe80::f67c:bd4f:d6d5:1d9b/64 scope link noprefixroute
- valid_lft forever preferred_lft forever
复制代码 5.如上所示,高可用已经配置成功。
使用 KubeKey 创建 Kubernetes 集群
KubeKey 是一款用来创建 Kubernetes 集群的工具,高效而便捷。请按照以下步骤下载 KubeKey。
从 GitHub Release Page 下载 KubeKey 或者直接使用以下下令。- curl -sfL https://get-kk.kubesphere.io | VERSION=v2.0.0 sh -
复制代码 首先运行以下下令,以确保您从精确的区域下载 KubeKey。运行以下下令来下载 KubeKey:- curl -sfL https://get-kk.kubesphere.io | VERSION=v2.0.0 sh -
复制代码 备注
下载 KubeKey 之后,如果您将其转移到访问 Googleapis 受限的新机器上,请务必再次运行 export KKZONE=cn,然后继续执行以下步骤。
备注
通过以上下令,可以下载 KubeKey 的最新版本 (v2.0.0)。您可以更改下令中的版本号来下载特定的版本。
使 kk 成为可执行文件:使用默认配置创建一个示例配置文件。此处以 Kubernetes v1.21.5 作为示例。- ./kk create config --with-kubesphere v3.2.1 --with-kubernetes v1.21.5
复制代码 备注
- 安装 KubeSphere 3.2.1 的建议 Kubernetes 版本:v1.19.x、v1.20.x、v1.21.x 或 v1.22.x(实验性支持)。如果不指定 Kubernetes 版本,KubeKey 将默认安装 Kubernetes v1.21.5。有关受支持的 Kubernetes 版本的更多信息,请拜见支持矩阵。
- 如果您没有在本步骤的下令中添加标记 --with-kubesphere,那么除非您使用配置文件中的 addons 字段举行安装,或者稍后使用 ./kk create cluster 时再添加该标记,否则 KubeSphere 将不会被摆设。
- 如果您添加标记 --with-kubesphere 时未指定 KubeSphere 版本,则会安装最新版本的 KubeSphere。
摆设 KubeSphere 和 Kubernetes
运行上述下令后,将创建配置文件 config-sample.yaml。编辑文件以添加机器信息、配置负载均衡器等。
备注
如果自定义文件名,那么文件名可能会有所不同。
config-sample.yaml 示例
- ...
- spec:
- hosts:
- - {name: master1, address: 172.16.0.4, internalAddress: 172.16.0.4, user: root, password: Testing123}
- - {name: master2, address: 172.16.0.5, internalAddress: 172.16.0.5, user: root, password: Testing123}
- - {name: master3, address: 172.16.0.6, internalAddress: 172.16.0.6, user: root, password: Testing123}
- - {name: worker1, address: 172.16.0.7, internalAddress: 172.16.0.7, user: root, password: Testing123}
- - {name: worker2, address: 172.16.0.8, internalAddress: 172.16.0.8, user: root, password: Testing123}
- - {name: worker3, address: 172.16.0.9, internalAddress: 172.16.0.9, user: root, password: Testing123}
- roleGroups:
- etcd:
- - master1
- - master2
- - master3
- master:
- - master1
- - master2
- - master3
- worker:
- - worker1
- - worker2
- - worker3
- controlPlaneEndpoint:
- domain: lb.kubesphere.local
- address: 172.16.0.10 # The VIP address
- port: 6443
- ...
复制代码 备注
- 请使用您自己的 VIP 所在来更换 controlPlaneEndpoint.address 的值。
- 有关更多本配置文件中不同参数的信息,请拜见多节点安装。
开始安装
完成配置之后,可以执行以下下令开始安装:- ./kk create cluster -f config-sample.yaml
复制代码 验证安装
1.运行以下下令以检查安装日记。- kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
复制代码 2.看到以下信息时,表明高可用集群已成功创建。- #####################################################
- ### Welcome to KubeSphere! ###
- #####################################################
- Console: http://172.16.0.4:30880
- Account: admin
- Password: [email protected]
- NOTES:
- 1. After you log into the console, please check the
- monitoring status of service components in
- the "Cluster Management". If any service is not
- ready, please wait patiently until all components
- are up and running.
- 2. Please change the default password after login.
- #####################################################
- https://kubesphere.io 2020-xx-xx xx:xx:xx
- #####################################################
复制代码
点击关注,第一时间相识华为云奇怪技术~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |