从本地网络外部访问集群中的 Kubernetes 服务 - Bare Metal

从本地网络外部访问集群中的 Kubernetes 服务 - Bare Metal

我正在运行一个简单的裸机多主“高可用性”环境,其中有 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

复制命令以加入其他主节点和工作节点。

部署印花布网络(我使用 Wea​​ve 而不是 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

相关内容