我正在运行一个简单的裸机多主“高可用性”环境,其中有 2 个主服务器和 2 个工作服务器,以及另一个带有 HAProxy 的 VM 作为外部负载均衡器。
我的问题是:是否可以从集群外部访问服务(仪表板,ngnix,mysql(尤其是mysql)等...),并使用我正在运行的设置将它们公开到网络?
我曾尝试在此环境中使用 MetalLB 将服务公开为 LoadBalancer,但它似乎不起作用,而且由于我对 Kubernetes 还不太熟悉,所以我无法弄清楚原因。
编辑:现在可以工作了,按照@c4f4t0r 的建议,不再使用外部 HAProxy 负载均衡器,而是让同一个 VM 成为第三个主节点,与其他节点一样,它们现在每个节点都运行 HAProxy 和 Keepalived 的内部实例,而曾经是外部 LB 的 VM 现在是其他 VM 加入集群的端点主节点,MetalLB 在集群内部运行,nginx 入口控制器将请求引导至已请求的服务。
>>> 下面是我创建环境以及设置中使用的所有配置所遵循的步骤。
使用 kubeadm 设置高可用性 Kubernetes 集群
按照本文档使用以下方法设置高可用性 Kubernetes 集群Ubuntu 20.04 LTS。
本文档指导您使用 HAProxy 设置具有两个主节点、一个工作节点和一个负载均衡器节点的集群。
裸机环境
角色 | 完整限定域名 (FQDN) | 知识产权 | 操作系统 | 内存 | 中央处理器 |
---|---|---|---|---|---|
负载均衡器 | loadbalancer.example.com | 192.168.44.100 | Ubuntu 21.04 | 1G | 1 |
掌握 | kmaster1.example.com | 10.84.44.51 | Ubuntu 21.04 | 2G | 2 |
掌握 | kmaster2.example.com | 192.168.44.50 | Ubuntu 21.04 | 2G | 2 |
工人 | kworker1.example.com | 10.84.44.50 | Ubuntu 21.04 | 2G | 2 |
工人 | kworker2.example.com | 192.168.44.51 | Ubuntu 21.04 | 2G | 2 |
- 密码为根所有这些虚拟机上的帐户kubeadmin
- 除非另有说明,否则以 root 用户身份执行所有命令
先决条件
如果你想在工作站的虚拟化环境中尝试此操作
- Virtualbox 安装
- 主机至少有 8 个核心
- 主机至少有8G内存
设置负载均衡器节点
安装 Haproxy
apt update && apt install -y haproxy
配置 haproxy
将以下几行附加到/etc/haproxy/haproxy.cfg
frontend kubernetes-frontend
bind 192.168.44.100:6443
mode tcp
option tcplog
default_backend kubernetes-backend
backend kubernetes-backend
mode tcp
option tcp-check
balance roundrobin
server kmaster1 10.84.44.51:6443 check fall 3 rise 2
server kmaster2 192.168.44.50:6443 check fall 3 rise 2
重启haproxy服务
systemctl restart haproxy
在所有 kubernetes 节点上(kmaster1、kmaster2、kworker1)
禁用防火墙
ufw disable
禁用交换
swapoff -a; sed -i '/swap/d' /etc/fstab
更新 Kubernetes 网络的 sysctl 设置
cat >>/etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
安装docker引擎
{
apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt update && apt install -y docker-ce containerd.io
}
Kubernetes 设置
添加 Apt 存储库
{
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
}
安装 Kubernetes 组件
apt update && apt install -y kubeadm=1.19.2-00 kubelet=1.19.2-00 kubectl=1.19.2-00
在任意一个 Kubernetes 主节点上(例如:kmaster1)
初始化 Kubernetes 集群
kubeadm init --control-plane-endpoint="192.168.44.100:6443" --upload-certs
复制命令以加入其他主节点和工作节点。
部署印花布网络(我使用 Weave 而不是 Calico)
kubectl --kubeconfig=/etc/kubernetes/admin.conf create -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml
将其他节点加入集群(kmaster2 和 kworker1)
使用从第一个主服务器上的 kubeadm init 命令的输出复制的相应 kubeadm join 命令。
重要提示:当您加入其他主节点时,还需要将 --apiserver-advertise-address 传递给加入命令。
答案1
如果您正在使用 metalb,我认为您不需要带有 haproxy 的外部虚拟机,您可以在 kubernetes 中安装入口控制器并将入口控制器的服务类型更改为 LoadBalancer。
现在,您将在局域网中拥有一个外部 IP,可以通过入口控制器 IP 访问本地服务。
(Internet) -> (Router) -> Nat -> Metalb-Ip -> Ingress-controller -> k8s-service