從本地網路外部訪問集群中的 Kubernetes 服務 - 裸機
我正在執行一個簡單的裸機多主機“高可用性”環境,其中包含 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
複製命令以加入其他主節點和工作節點。
部署
印花布網路(我使用 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 訪問您的本地服務。
(Internet) -> (Router) -> Nat -> Metalb-Ip -> Ingress-controller -> k8s-service