1. 背景介紹
??隨著亞馬遜云、阿里云、華為云、騰訊云等云計算服務(wù)廠商越來越安全、穩(wěn)定,以及價格越來越便宜,越來越多的企業(yè)或個人開始嘗試或正在使用云計算服務(wù)廠商提供的IaaS服務(wù)替代自建IDC機房中的基礎(chǔ)設(shè)施資源。面對各個云計算廠商的營銷套路,不少企業(yè)不知道選哪家云商的服務(wù)比較合適,一怕被綁架,上車容易下車難,第一年免費用,第二年沒折扣;二怕今年上阿里,明年華為更便宜,后年騰訊更優(yōu)惠,服務(wù)遷移難。如何讓業(yè)務(wù)在不同云商之間隨意切換呢?這樣就能實現(xiàn)想用哪家的云就選哪家的資源。
??下邊通過實驗的方式嘗試一種實現(xiàn)上述訴求的方法,即搭建一套k8s容器集群平臺,不同云商上云主機部署工作負載節(jié)點,并注冊到k8s集群。實現(xiàn)一套容器集群管理多個云商的工作負載節(jié)點,于是根據(jù)云商的優(yōu)惠政策,動態(tài)的將容器化部署的服務(wù)有側(cè)重點的分布到性價比更高的云商上。
??如上圖所示,華為云上部署3個節(jié)點,阿里云上部署3個節(jié)點,其中華為云上 k8s-master1 與 k8s-master2 為 k8s 集群的管理服務(wù),k8s-node1 為 k8s 集群的工作負載節(jié)點,阿里云上的 k8s-node2、k8s-node3、k8s-node4 為 k8s 集群的工作負載節(jié)點。
2. 跨云商內(nèi)網(wǎng)打通
??通過建立GRE隧道,在華為云 k8s-master2 與阿里云 k8s-node2 節(jié)點之間建立 GRE 隧道,打通華為云與阿里云內(nèi)網(wǎng)通信。同時使用 iptables 設(shè)置流量轉(zhuǎn)發(fā)規(guī)則,例如 k8s-master2 通過設(shè)置 iptables 規(guī)則將阿里云上的主機對 k8s-master1 與 k8s-node1 的流量進行轉(zhuǎn)發(fā),同理,k8s-node2 通過設(shè)置 iptables 規(guī)則將華為云上的主機對 k8s-node3 與 k8s-node4 的流量進行轉(zhuǎn)發(fā),從而實現(xiàn)華為云與阿里云上所有主機之間的內(nèi)網(wǎng)互通。
??建立 GRE 隧道的方法請參考 構(gòu)建GRE隧道打通不同云商的云主機內(nèi)網(wǎng) 。這篇文章主要介紹了在兩個云商之間搭建 GRE 隧道實現(xiàn)兩個內(nèi)網(wǎng)互通的方法。由于使用 route 工具添加的路由并不會持久話的保存(服務(wù)器重啟將會丟失),所以,本章將會介紹如何搭建 GRE 隧道,并持久話保存。
2.1 阿里云環(huán)境安裝部署
2.1.1 加載驅(qū)動模塊
??在阿里云 k8s-node2 節(jié)點上執(zhí)行下邊命令
cat > /etc/sysctl.d/gre.conf <<EOF
net.ipv4.ip_forward=1
EOF
2.1.2 添加 GRE 隧道開機啟動腳本
??在阿里云 k8s-node2 節(jié)點上執(zhí)行下邊命令
cat > /etc/init.d/gre.sh <<EOF
#!/bin/bash
ip tunnel del tunnel999
ip tunnel add tunnel999 mode gre remote 112.124.59.21 local 172.26.32.235
ip link set tunnel999 up mtu 1476
ip addr add 192.168.100.2 peer 192.168.100.1/32 dev tunnel999
ip route add 192.168.0.0/24 dev tunnel999
EOF
chmod +x /etc/init.d/gre.sh
cat > /usr/lib/systemd/system/gre.service <<EOF
[Unit]
Description=GRE Service
After=network.target
[Service]
Type=oneshot
User=root
ExecStart=/etc/init.d/gre.sh
[Install]
WantedBy=multi-user.target
EOF
systemctl enable gre
systemctl start gre
2.1.3 配置 iptalbes 規(guī)則
??在阿里云 k8s-node2 節(jié)點上執(zhí)行下邊命令
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.100.1 -j MASQUERADE
iptables -A FORWARD -s 192.168.100.1 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -o tunnel999 -s 192.168.0.0/24 -j MASQUERADE
iptables -A FORWARD -s 192.168.0.0/24 -o tunnel999 -j ACCEPT
2.1.4 在其他節(jié)點配置路由
??在阿里云 k8s-node3 和 k8s-node4 節(jié)點上執(zhí)行下邊的命令,添加華為云內(nèi)網(wǎng)CIDR路由到 k8s-node2 節(jié)點內(nèi)網(wǎng)IP上。
route add -net 192.168.0.0/24 gw 172.26.32.235
??添加完成后 k8s-node3 和 k8s-node4 暫時無法訪問華為云主機內(nèi)網(wǎng)IP,等待華為云上安裝部署完成后,才可以訪問華為云上主機內(nèi)網(wǎng)IP。
2.2 華為云上安裝部署
2.2.1 加載驅(qū)動模塊
??在華為云 k8s-master2 節(jié)點上執(zhí)行下邊命令
cat > /etc/sysctl.d/gre.conf <<EOF
net.ipv4.ip_forward=1
EOF
2.2.2 添加 GRE 隧道開機啟動腳本
??在華為云 k8s-master2 節(jié)點上執(zhí)行下邊命令
cat > /etc/init.d/gre.sh <<EOF
#!/bin/bash
ip tunnel del tunnel999
ip tunnel add tunnel999 mode gre remote 114.116.84.123 local 192.168.0.200
ip link set tunnel999 up mtu 1476
ip addr add 192.168.100.1 peer 192.168.100.2/32 dev tunnel999
ip route add 172.26.32.0/24 dev tunnel999
EOF
chmod +x /etc/init.d/gre.sh
cat > /usr/lib/systemd/system/gre.service <<EOF
[Unit]
Description=GRE Service
After=network.target
[Service]
Type=oneshot
User=root
ExecStart=/etc/init.d/gre.sh
[Install]
WantedBy=multi-user.target
EOF
systemctl enable gre
systemctl start gre
2.2.3 配置 iptalbes 規(guī)則
??在華為云 k8s-master2 節(jié)點上執(zhí)行下邊命令
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.100.2 -j MASQUERADE
iptables -A FORWARD -s 192.168.100.2 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -o tunnel999 -s 172.26.32.0/24 -j MASQUERADE
iptables -A FORWARD -s 172.26.32.0/24 -o tunnel999 -j ACCEPT
2.2.4 在其他節(jié)點配置路由
??在華為云 k8s-master1 和 k8s-node1 節(jié)點上執(zhí)行下邊命令,添加阿里云內(nèi)網(wǎng)CIDR路由到 k8s-master2 節(jié)點內(nèi)網(wǎng)IP上。
route add -net 172.26.32.0/24 gw 192.168.0.200
??添加完成后就可以在 k8s-node1 和 k8s-master1 節(jié)點上訪問阿里云上所有云主機的內(nèi)網(wǎng)IP,并且阿里云上的所有云主機可以訪問華為云上所有云主機的內(nèi)網(wǎng)IP。
3. 構(gòu)建K8S集群
??首先在華為云上安裝部署 kubernetes 集群主節(jié)點,具體操作步驟請參考:部署安裝kubernetes集群。
4. 容器集群跨云商添加工作負載節(jié)點
??在阿里云主機上安裝 kubernetes worker 節(jié)點配置。主要涉及到:Linux 內(nèi)核升級,Containerd 容器安裝,Linux 參數(shù)優(yōu)化,Kubelet與Kube-Proxy 組件部署。下邊操作以阿里云 172.26.32.235 主機為例。
4.1 安裝Containerd 容器服務(wù)
- 在線安裝 containerd 服務(wù)
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install containerd
- 導(dǎo)出 containerd 默認配置
containerd config default > /etc/containerd/config.toml
- 編輯 /etc/containerd/config.toml 文件
sandbox_image = "registry.k8s.io/pause:3.6"
替換成
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = false
替換成
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
添加國內(nèi)鏡像倉庫,這個非常關(guān)鍵,否則將會導(dǎo)致鏡像下載失敗,Pod中服務(wù)無法啟動。
[plugins."io.containerd.grpc.v1.cri".registry]
......
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
在containerd 配置文件中找到上邊內(nèi)容,并在此處添加下邊兩行, 注意縮進,下邊兩行內(nèi)容與上邊一行有2個空格的縮進,下邊兩行內(nèi)容之間也存在2個空格的縮進。
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com"]
- 重啟 containerd 容器運行時服務(wù)
systemctl enable containerd
systemctl restart containerd
4.2 Linux 參數(shù)優(yōu)化
??Linux 參數(shù)優(yōu)化請參考 K8S安裝過程七:Kubernetes 節(jié)點配置調(diào)整
4.3 Kubernetes Worker 節(jié)點組件安裝
4.3.1 獲取安裝包
??從華為云已經(jīng)安裝部署好的節(jié)點上獲取 kubernetes 的安裝包。詳細過程請參考:K8S安裝過程九:Kubernetes Worker 節(jié)點安裝
- 獲取安裝包以及ssl證書。
scp root@192.168.0.200:/opt/kubernetes.tar.gz /opt/
mkdir -p /etc/kubernetes/ssl
scp root@192.168.0.200:/etc/kubernetes/ssl/* /etc/kubernetes/ssl/
cd /opt
tar -xvf kubernetes.tar.gz
mkdir /opt/kubernetes/manifests
4.3.2 kubelet 創(chuàng)建 systemctl 啟動服務(wù)
cat > /usr/lib/systemd/system/kubelet.service <<EOF
[Unit]
Description=Kubernetes Kubelet
After=docker.service
[Service]
EnvironmentFile=/opt/kubernetes/cfg/kubelet.conf
ExecStart=/opt/kubernetes/server/bin/kubelet \$KUBELET_OPTS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
4.3.3 啟動 kubelet
systemctl enable kubelet
systemctl start kubelet
- 查看 kubelet 服務(wù)啟動狀態(tài)
systemctl status kubelet
4.3.4 為 kube-proxy 創(chuàng)建 systemctl 啟動服務(wù)
cat > /usr/lib/systemd/system/kube-proxy.service <<EOF
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=/opt/kubernetes/cfg/kube-proxy.conf
ExecStart=/opt/kubernetes/server/bin/kube-proxy \$KUBE_PROXY_OPTS
Restart=on-failure
RestartSec=10
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
4.3.5 啟動 kube-proxy 服務(wù)
systemctl enable kube-proxy
systemctl start kube-proxy
- 查看 kube-proxy 服務(wù)的啟動狀態(tài)
systemctl status kube-proxy
文章來源:http://www.zghlxwxcb.cn/news/detail-407154.html
??到此,跨越不同云商搭建容器集群完成,此時的容器集群中工作負載節(jié)點涵蓋了華為云與阿里云。后續(xù)添加其他云商的云主機,流程與上述類似。文章來源地址http://www.zghlxwxcb.cn/news/detail-407154.html
5. 總結(jié)
- 容器集群中工作負載節(jié)點跨越多個云商,不同云商之間的服務(wù)互相調(diào)用實際上走的是公網(wǎng)流量,如果公網(wǎng)帶寬資源不足,將會導(dǎo)致跨云服務(wù)調(diào)用存在性能瓶頸。
- 采用跨云商部署容器集群,建議將不同云商工作負載中運行的業(yè)務(wù)具備獨立性,也即是減少不同云商上服務(wù)之間的互相調(diào)用。
- 涉及到中間件的使用時,需要考慮跨越云商訪問中間件時,保證訪問性能。
到了這里,關(guān)于k8s容器集群工作負載節(jié)點跨越多個云計算廠商的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!