我正在运行一个简单的裸机多主机“高可用性”环境,其中包含 2 个主机和 2 个工作人员,以及另一个使用 HAProxy 作为外部负载均衡器的 VM。
我的问题是:可以从集群外部访问服务(仪表板、ngnix、mysql(尤其是 mysql)等...),使用我正在运行的这个设置将它们暴露给网络?
我曾尝试在此环境中使用 MetalLB 将服务公开为 LoadBalancer,但它似乎不起作用,而且由于我对 Kubernetes 有点陌生,我不知道为什么。
编辑:现在开始工作了,遵循@c4f4t0r 的建议,而不是外部 HAProxy 负载均衡器,同一个 VM 成为第三个主节点,以及其他主节点,它们现在每个运行一个 HAProxy 和 Keepalived 的内部实例,而曾经作为外部 LB 的 VM 现在是其他节点加入集群的端点主机,MetalLB 在集群内运行,nginx 入口控制器将请求引导到已请求的服务。
>>> 以下是我创建环境以及设置中使用的所有配置所遵循的步骤。
使用 kubeadm 设置高可用 Kubernetes 集群
按照本文档使用Ubuntu 20.04 LTS设置高可用性 Kubernetes 集群。
本文档指导您使用 HAProxy 设置具有两个主节点、一个工作节点和一个负载平衡器节点的集群。
裸机环境
角色 | 全域名 | 知识产权 | 操作系统 | 内存 | 中央处理器 |
---|---|---|---|---|---|
负载均衡器 | 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 |
- 所有这些虚拟机上的root帐户的密码都是kubeadmin
- 除非另有说明,否则以 root 用户身份执行所有命令
先决条件
如果您想在工作站上的虚拟化环境中尝试此操作
- 安装了虚拟机
- 主机至少有 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)
使用您从第一个 master 上的 kubeadm init 命令的输出中复制的相应 kubeadm join 命令。
重要提示:当您加入另一个主节点时,您还需要将 --apiserver-advertise-address 传递给 join 命令。
如果您使用的是metalb,我认为您不需要具有haproxy的外部vm,您可以在kubernetes中安装一个入口控制器并将入口控制器的服务类型更改为LoadBalancer。
现在,您的局域网中将有一个外部 ip,可以通过入口控制器 ip 访问您的本地服务。