Rancher 2.x 負載均衡配置及使用

1、Rancher 2.x 負載均衡

我們知道 Kubernetes 支持 4 層和 7 層負載均衡策略,其中 4 層負載均衡(或外部負載均衡)支持轉發 HTTP、TCP 請求到 Nodeports 上去,7 層負載均衡(或 Ingress Controller)支持根據 Host、Path 的負載均衡以及 SSL 終端,因爲它只支持轉發 HTTP 和 HTTPS 的請求,所以它需要監聽 80 和 443 端口。4 層和 7 層負載均衡策略在 EKS、GKE、AKS 以及 RKE 在各個雲平臺的支持情況,參照下表。

部署集羣 4 層負載均衡支持 7 層負載均衡支持
Amazon EKS AWS cloud 提供支持 AWS cloud 提供支持
Google GKE GCE cloud 提供支持 GKE cloud 提供支持
Azure AKS Azure cloud 提供支持 不支持
RKE on EC2 AWS cloud 提供支持 Nginx Ingress Controller
RKE on DigitalOcean 不支持 Nginx Ingress Controller
RKE on vSphere 不支持 Nginx Ingress Controller
RKE on Custom Hosts 不支持 Nginx Ingress Controller

注意: RKE 集羣部署 7 層負載均衡底層默認支持 Nginx Ingress Controller 類型。

2、環境、軟件準備

上一篇文章 Rancher 2.x 搭建及管理 Kubernetes 集羣 中我們是在虛擬機上安裝 RancherOS 系統,然後在 RancherOS 上啓動 Rancher,並且通過 RKE 在 RancherOS 上搭建 Kubernetes 集羣,這裏需要的環境、軟件準備跟之前大致一樣。

不過今天我們得換一個方式啓動 Rancher,即本機或者換一個主機啓動 Rancher,那是爲什麼呢?這是因爲 Rancher 服務啓動需要監聽 80 端口以及 443 端口,而默認 RKE 啓動的 Nginx Ingress Controller 也需要監聽 80 端口和 443 端口,如果二者都在一個主機上的話,那麼 Nginx Ingress Controller 會一直顯示 Initializing 狀態,查看日誌提示 80 或者 443 端口已佔用的報錯信息。然後我嘗試修改 Rancher 啓動命令 -p 80:80 -p 443:443 端口映射爲其他端口號的時候,發現 Rancher 能夠啓動,但是 UI 頁面始終無法訪問。所以,爲了解決這個端口衝突問題,我將 Rancher 服務在本機啓動。

3、Rancher 部署服務

本地我已啓動好了 Rancher Server,訪問地址爲 https://10.222.76.78,並且已參照上一篇文章中 6、Rancher 2.x 基於 RKE 搭建 Kubernetes 集羣 創建好了 Kubernetes 集羣名稱爲 my-rancheros
rancher-ui-dashboard

注意:通過 RKE 搭建 Kubernetes 集羣后,可以通過 Rancher UI 頁面,切換到 System 項目下工作負荷頁面,查看系統各命令空間下 Kubernetes 資源以及 Rancher 資源是否顯示啓動正常。尤其要注意命名空間 ingress-nginx 下的 default-http-backend 以及 nginx-ingress-controller 是否正常啓動完畢,如果這裏顯示啓動不正常的話,那麼下邊無法正常使用 Ingress 負載均衡配置。
rancher-ui-system-workload
接下來我們通過 Rancher 部署兩個簡單的服務: my-nginxmy-tomcat,顧名思義就是部署 nginx 和 tomcat 兩個簡單服務,方便下邊演示 Ingress 負載均衡配置。my-nginx 服務部署這裏可以參照 7、Rancher 部署服務 文章裏的配置即可,同樣映射容器內 80 端口到主機 30001 端口,這裏就不演示了,貼一下部署完成之後的頁面。
rancher-ui-my-nginx
本地通過 NodePort 端口訪問一下 http://192.168.99.102:30001 也是沒有問題的。
rancher-ui-nginx-nodeport
同理,我們部署一個 my-tomcat 服務,使用 tomcat:alpine 鏡像,映射容器內 8080 端口到主機 30002 端口,貼一下部署完成之後的頁面。
rancher-ui-my-tomcat
本地訪問一下 http://192.168.99.102:30002 也是沒有問題的。
rancher-ui-tomcat-nodeport
同時可以看到 Rancher 爲每個服務創建了兩個 Service 類型,一個爲 ClusterIP 方式,一個爲 NodePort,而這些就是下邊 Ingress 配置負載均衡轉發到的 Service。
rancher-ui-service-discover

4、Rancher Ingress 負載均衡配置

服務已經部署完畢,而且服務發現也已經有了,接下來就可以配置負載均衡了。上邊說到 Ingress Controller 支持根據 Host、Path 的負載均衡,那麼分別來演示下。

4.1、Ingress Base Host

登錄 Rancher UI 頁面,切換到 my-rancheros 集羣下 Default 項目下的負載均衡頁面,點擊 “添加Ingress” 按鈕來配置 Ingress。這裏我使用 my-nginx.k8s.com 域名來綁定到指定的 my-nginx 服務上。
rancher-ui-ingress
配置完成後,稍等片刻即可顯示 Active 狀態,說明 Ingress 已生效。
rancher-ui-loadblance
此時,我們將 my-nginx.k8s.com 域名綁定一下本地 Host 即可瀏覽器訪問啦!綁定的 IP 爲 Kubernetes Cluster Master IP,這裏因爲我創建在 RancherOS 裏面,所以這裏需要綁定創建的 rancheros 虛擬機 IP。

$ docker-machine ip rancheros
192.168.99.102
$ echo "192.168.99.102 my-nginx.k8s.com" >> /etc/hosts

rancher-ui-ingress-nginx
注意:默認目標後端是基於工作負荷的,這個工作負荷是個啥呢?選擇工作負荷類型,Rancher 會自動幫我們創建一個 Ingress 綁定的 Service,例如上邊操作自動創建了 ingress-00a468ccd101703fea1965f2f1786811 Service。當然,我們也可以選擇服務類型,選擇已存在的 my-nginxmy-nginx-nodeport 服務,那麼就不用在創建了,直接就可以使用。
rancher-ui-service-discover-ingress
後臺通過 Kubectl 命令獲取一下 Service 也可以看到。

$ kubectl get svc -n my-namespaces
NAME                                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
ingress-00a468ccd101703fea1965f2f1786811   ClusterIP   10.43.227.135   <none>        80/TCP           23m
my-nginx                                   ClusterIP   10.43.165.62    <none>        80/TCP           57m
my-nginx-nodeport                          NodePort    10.43.165.31    <none>        80:30001/TCP     57m
my-tomcat                                  ClusterIP   10.43.131.119   <none>        8080/TCP         54m
my-tomcat-nodeport                         NodePort    10.43.36.241    <none>        8080:30002/TCP   54m

4.2、Ingress Base Path

接下來,我們根據不同的 Path 來分別訪問不同的 Service,例如通過 my-ingress.k8s.com/nginx 來訪問 my-nginx 服務,通過 my-ingress.k8s.com/tomcat 來訪問 my-tomcat 服務,添加 Ingress 配置如下所示。
rancher-ui-ingress-nginx-tomcat
注意:根據 Path 來訪問不同的 Service,需要配置後端重寫,具體方法就是以註釋的方式添加到 Ingress 中,這裏我們需要配置註釋項 nginx.ingress.kubernetes.io/rewrite-target=/
rancher-ui-loadbalance
配置完畢後,本地將 my-ingress.k8s.com 域名綁定一下本地 Host 即可瀏覽器分別訪問啦!

$ echo "192.168.99.102 my-ingress.k8s.com" >> /etc/hosts

rancher-ui-ingress-nginx
rancher-ui-ingress-tomcat
妥妥沒有問題,可以看到上邊我選擇目標後端爲服務類型,並選擇了 my-nginxmy-tomcat-nodeport 服務,也是一樣可以的。

5、tomcat-i18n demo 示例演示

好了,上邊演示了通過 Rancher UI 如何配置 Ingress 來實現負載均衡的,不過例子中都是比較簡單的服務,那這裏我在演示一下如何製作一個服務鏡像並通過 Rancher 運行在 Kubernetes 集羣中吧!由於之前文章 基於jQuery.i18n.properties 實現前端頁面的資源國際化 一文中,諸多網友下載了源碼後依舊運行不起來,各種報錯等情況,我再次說明一下:源碼沒有問題,親測可行,注意要在 tomcat 等服務器中運行,修改項目名時注意修改 cookie 存儲域 Path。那我就以這個 i18n demo 爲例,將源碼添加到 tomcat 鏡像中,最終通過 Rancher 部署在 Kubernetes 集羣中並配置 Ingress 訪問它吧!

下載 Demo 源碼 到本地並解壓,在項目 i18n 同級目錄創建 Dockerfile 如下:

$ vim Dockerfile.tomcat
FROM tomcat:alpine

MAINTAINER wanyang3 <[email protected]>

ADD i18n  /usr/local/tomcat/webapps/i18n/

然後 Build 鏡像並 Push 到 Dockerhub 倉庫中,供後續服務部署拉取鏡像。

$ docker build -t huwanyang168/tomcat-i18n:alpine -f Dockerfile.tomcat .
$ docker push huwanyang168/tomcat-i18n:alpine

注意:如果 push 不上去,有可能是未登錄 DockerHub 倉庫,登錄以後再次執行 Push 即可,注意自己製作鏡像時需要修改 huwanyang168 爲自己的 DockerHub 倉庫名稱。

部署服務之前,本地啓動一下該鏡像,測試下有問題木有。

$ docker run -d --rm -p 9000:8080 huwanyang168/tomcat-i18n:alpine

本地瀏覽器訪問 http://127.0.0.1:9000/i18n 試下,妥妥沒有問題的嘛!
rancher-ui-tomcat-i18n-docker
接着,我們就可以去 Rancher UI 上部署一個新的服務爲 my-tomcat-i18n 的服務了。
rancher-ui-my-tomcat-i18n-deployment
稍等片刻,等服務 my-tomcat-i18n 狀態爲 Active 後,本地通過 NodePort 訪問一下 http://192.168.99.102:30003/i18n/ 也是妥妥沒有問題的呦!
rancher-ui-my-tomcat-i18n-nodeport
最後,配置一下 Ingress 負載均衡,通過 my-tomcat.k8s.com/i18n 來訪問 my-tomcat-i18n 服務,爲什麼這裏 URL 我要帶上 /i18n?那是因爲在 js 中配置的 cookie 存儲域 Path 爲 i18n,如果不帶該路徑就會出現存儲域跟讀取域不一致,導致的切換語言時加載不到選擇的語言值。如果想不帶 i18n 路徑,那麼就需要修改 js 中 cookie 存儲域 path 爲空。
rancher-ui-my-tomcat-i18n-ingress
配置完畢後,本地將 my-tomcat.k8s.com 域名綁定一下本地 Host 即可瀏覽器訪問啦!

$ echo "192.168.99.102 my-tomcat.k8s.com" >> /etc/hosts

rancher-ui-my-tomcat-i18n-ingress
rancher-ui-my-tomcat-i18n-ingress
rancher-ui-my-tomcat-i18n-ingress

同樣妥妥沒有問題的!

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章