使用HAProxy构建基于多集群的Kubernetes集群配置
目的
为了确保 Kubernetes 的主节点冗余性,我们将使用多集群配置创建 Kubernetes 集群。
在访问多个主节点时,我们将使用代理服务器。
安装代理服务器并总结从另一台机器连接到 Kubernetes 集群的步骤。
构成
使用三个主节点和两个工作节点。
-
- Proxy Server: 192.168.90.1, 192.168.122.1
-
- master01: 192.168.122.232
-
- master02: 192.168.122.116
-
- master03: 192.168.122.18
-
- worker01: 192.168.122.114
- worker02: 192.168.122.79
各个机器的规格如下所示。
-
- Disk: 32GB
-
- Cores: 8 core
-
- Memory: 16GB
- OS: Ubuntu 22.04
操作步骤
HAProxy是一种负载均衡软件。
使用代理服务器执行。
-
- 実行対象
Proxy Server
安装HAProxy。
HAProxy是一种功能丰富的代理服务器,也是一种软件负载均衡器。
apt update
apt -y upgrade
apt -y install haproxy
获取默认配置文件的备份。
cp -ai /etc/haproxy/haproxy.cfg{,.default}
创建配置文件。
在本次连接主节点时,通过代理服务器监听访问。
然后,将接收到的访问分配给后端的主节点。
cat << _EOF_ >> /etc/haproxy/haproxy.cfg
frontend kube-api
bind *:6443
option tcplog
mode tcp
default_backend api-6443
backend api-6443
mode tcp
balance roundrobin
server master1 192.168.122.232:6443
server master2 192.168.122.116:6443
server master3 192.168.122.18:6443
_EOF_
确认所设置的内容。
$ diff /etc/haproxy/haproxy.cfg{.default,}
34a35,47
>
> frontend kube-api
> bind *:6443
> option tcplog
> mode tcp
> default_backend api-6443
>
> backend api-6443
> mode tcp
> balance roundrobin
> server master1 192.168.122.232:6443
> server master2 192.168.122.116:6443
> server master3 192.168.122.18:6443
重新启动 HAProxy。
systemctl restart haproxy.service
systemctl enable haproxy.service
Kubernetes – Kubernetes
在配置 Kubernetes 集群的机器上执行以下步骤。
-
- 実行対象
master01, master02, master03, worker01, worker02
在开始安装之前,请先更新环境一次。
apt update
apt upgrade
CRI-O的中文释义为容器运行时接口。
安装 CRI-O。
CRI-O 是用于 Kubernetes 和容器运行时进行通信的容器运行时接口(CRI)规范。
将要导出的变量更改为符合自身环境的变量。
export OS=xUbuntu_22.04
export VERSION=1.24
echo "deb [signed-by=/usr/share/keyrings/libcontainers-archive-keyring.gpg] https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
echo "deb [signed-by=/usr/share/keyrings/libcontainers-crio-archive-keyring.gpg] https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list
mkdir -p /usr/share/keyrings
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | gpg --dearmor -o /usr/share/keyrings/libcontainers-archive-keyring.gpg
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/Release.key | gpg --dearmor -o /usr/share/keyrings/libcontainers-crio-archive-keyring.gpg
apt-get update
apt-get install cri-o cri-o-runc cri-tools
启动CRI-O。
systemctl enable crio.service
systemctl start crio.service
内核参数
设置内核参数。
cat << _EOF_ > /etc/modules-load.d/crio.conf
overlay
br_netfilter
_EOF_
modprobe overlay
modprobe br_netfilter
cat << _EOF_ > /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
_EOF_
应用设置。
sysctl --system
安装kubeadm / kubelet / kubectl
安装所需软件以安装和操作Kubernetes。
添加GPG密钥。
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
添加存储库。
apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
安装 kubeadm / kubelet / kubectl。
apt update
apt install -y kubeadm kubelet kubectl
禁用交换
如果开关有效,则使其无效。
如果已经被禁用,则这个步骤是不必要的。
# 一時的な swap の無効化 (再起動で有効化)
swapoff -a
# 永続的な swap の無効化
cp -p /etc/fstab{,.default}
vim /etc/fstab
## swap の設定をコメントアウトする
搭建 Kubernetes 集群。
从这里开始,主节点和工作节点执行的任务内容是不同的。
主节点
在中文中本地化的释义如下:
对主节点进行初始化。
此初始化操作只在主节点中的一台上执行。
-
- 実行対象
master01
在运行时,通过 control-plane-endpoint 指定代理服务器的前端。
在这种情况下,按照指定,在 [HAProxy] 的 frontend kube-api 中,指定代理服务器的 IP 地址:6443。
此外,通过 upload-certs 对主节点的证书进行加密,并将其上传到 Secrets 资源中的 kubeadm-certs。
这个输出结果将在后面的Master节点添加和Worker节点添加时使用。
$ kubeadm init --control-plane-endpoint "192.168.90.1:6443" --upload-certs
... (省略) ...
[bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
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 192.168.90.1:6443 --token d9tr90.jpif6a1hboo2gxk2 \
--discovery-token-ca-cert-hash sha256:c0afb2695d3b18590e9acefa7e28a9163f25b7532bf38dbd8e5c4494ad56f1d7 \
--control-plane --certificate-key 5bf2e194f4a4b49ad1457e28aa338a6cf67554eb59ccb39bdb26a4a458516b51
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 192.168.90.1:6443 --token d9tr90.jpif6a1hboo2gxk2 \
--discovery-token-ca-cert-hash sha256:c0afb2695d3b18590e9acefa7e28a9163f25b7532bf38dbd8e5c4494ad56f1d7
将剩余的机器也添加到构建的第一台主节点。
-
- 実行対象
master02, master03
以下的命令与第一台主节点建立时输出的命令相同。
kubeadm join 192.168.90.1:6443 --token d9tr90.jpif6a1hboo2gxk2 \
--discovery-token-ca-cert-hash sha256:c0afb2695d3b18590e9acefa7e28a9163f25b7532bf38dbd8e5c4494ad56f1d7 \
--control-plane --certificate-key 5bf2e194f4a4b49ad1457e28aa338a6cf67554eb59ccb39bdb26a4a458516b51
工作节点
初始化Worker节点。
-
- 実行対象
worker01, worker02
下面的命令与第一台主节点构建时输出的命令相同。注意在添加主节点时命令不同。
kubeadm join 192.168.90.1:6443 --token d9tr90.jpif6a1hboo2gxk2 \
--discovery-token-ca-cert-hash sha256:c0afb2695d3b18590e9acefa7e28a9163f25b7532bf38dbd8e5c4494ad56f1d7
请确认连接。
当查看 Kubernetes Cluster 的 kubeconfig 时,可以看到 server 被指定为 control-plane-endpoint。
$ cat .kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: xxx
server: https://192.168.90.1:6443
name: kubernetes
...
将上述的配置文件移动到本地,并进行连接确认。
在连接确认时,可以通过代理服务器查看日志文件来确认连接的目标主节点已经被分配。
# ローカル環境で実行
$ kubectl --kubeconfig config get node
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane 20m v1.27.2
master02 Ready control-plane 9m36s v1.27.2
master03 Ready control-plane 7m11s v1.27.2
worker01 Ready <none> 6m44s v1.27.2
worker02 Ready <none> 6m31s v1.27.2
# Proxy Server で実行
ubuntu@wg-r640-01:~$ tail -f /var/log/haproxy.log
... (省略) ...
xxx kube-api api-6443/master02 1/0/47 31650 -- 11/11/10/3/0 0/0
xxx kube-api api-6443/master03 1/0/23 16348 -- 11/11/10/3/0 0/0
xxx kube-api api-6443/master01 1/0/21 4934 -- 11/11/10/4/0 0/0
xxx kube-api api-6443/master02 1/0/18 4933 -- 11/11/10/3/0 0/0
总结
本次使用了代理服务器 HAProxy 来构建 Kubernetes 多个 Master 节点的集群。
通过采用多个 Master 节点的配置,不仅可以提供冗余性保证,还可以考虑将 Master 节点分布在不同地理位置,实现地理分散。
接下来想尝试构建存在于不同网络上的 Kubernetes 集群,其中有多个 Master 节点。
這一次,通過使用HAProxy,我們輕鬆擴展了Master節點並確保了冗余性,但HAProxy本身並不具備冗余性。
在這種情況下,由於HAProxy本身可能成為故障點,建議對HAProxy本身進行冗余化處理。
在進行這種冗余化處理時,可以使用Keepalived。
Keepalived是一個監視服務運行狀態並提供冗余功能的開源軟件,它可以基於負載均衡器本身的監視,在故障時自動切換到備用服務器。
因此,引入Keepalived並確保HAProxy本身不成為故障點是可取的。