Load-Balancing

從本地網路外部訪問集群中的 Kubernetes 服務 - 裸機

  • November 19, 2021

我正在執行一個簡單的裸機多主機“高可用性”環境,其中包含 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 設置具有兩個主節點、一個工作節點和一個負載平衡器節點的集群。

裸機環境

  • 所有這些虛擬機上的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

複製命令以加入其他主節點和工作節點。

部署印花布網路(我使用 Wea​​ve 而不是 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 訪問您的本地服務。

(Internet) -> (Router) -> Nat -> Metalb-Ip -> Ingress-controller -> k8s-service

引用自:https://serverfault.com/questions/1083690