使用Ingress來負載分發微服務

目錄

使用Ingress來負載分發微服務

  • Demo規劃

  • 準備Demo並完成部署

  • 創建部署(Deployment)資源

  • 創建服務(Service)資源

  • 創建Ingress資源並配置轉發規則

使用Ingress來負載分發微服務

NodePort Service存在太多缺陷,不適合生產環境。LoadBlancer Service則不太靈活,比如針對微服務架構,那麼不同服務是否需要多個負載均衡服務呢?那麼,我們還有其他選擇麼?那就是Ingress。

使用Ingress来负载分发微服务

Ingress將集群外部的HTTP和HTTPS路由暴露給集群中的Service,相當於集群的入口,而入口規則則由Ingress定義的規則來控制。在使用Ingress之前,我們先需要有一個Ingress Controller(入口控制器),例如ingress-nginx。Ingress負責定義抽象的規則,而Ingress Controller負責具體實現。通常情況下,Ingress搭配負載均衡一起使用。接下來,筆者結合一個簡單的微服務Demo來使用Ingress進行負載分發。由於需要使用到負載均衡服務,本教程使用騰訊雲容器服務進行講解。

Demo規劃

    為了便於大家理解,我們先做一個簡單的規劃。整體規劃圖如下所示:
使用Ingress来负载分发微服务

如圖所示,整體步驟如下所示:

  1. 我們需要開發兩個應用,分別為apidemo1和apidemo2,並提供不同的接口服務;

  2. 然後需要將兩個應用分別部署到k8s集群,並且分別創建不同的Service;

  3. 接下來,我們需要創建Ingress,配置不同的轉發規則;

  4. 最後,為了訪問方便,我們需要配置域名映射。


準備Demo並完成部署

    如上所述,接下來我們進入開發環節。

為了完成我們上述的目標,我們需要提供以下兩個demo(不限編程語言):

  • apidemo1

如下圖所示,apidemo1的訪問路徑為https://{hostname}:{port}/api/demo1,輸出JSON“["value1","value2"]”。

使用Ingress来负载分发微服务

注意:apidemo1和apidemo2均需支持80端口和443端口訪問。

  • apidemo2

如下圖所示,apidemo2的訪問路徑為https://{hostname}:{port}/api/demo2,輸出JSON“["value3","value4"]”。

使用Ingress来负载分发微服务

由於Demo比較簡單,這裡我們就不貼代碼了。Demo準備完成後,我們需要推送docker鏡像到目標倉儲,然後創建部署(Deployment)以及服務(Service)。


    創建部署(Deployment)資源


整個過程在前面的章節我們均有詳細講述,因此這裡就不贅述了,這裡我們僅提供參考的YAML定義文件:

<code>apiVersion: apps/v1beta2 #api版本/<code><code>kind: Deployment #使用部署對象/<code><code>metadata:/<code><code> labels: #標籤列表/<code><code> app: apidemo1/<code><code> name: apidemo1 #部署名稱/<code><code> namespace: default #命名空間/<code><code>spec:/<code><code> replicas: 1 #副本數/<code><code> selector: #選擇器/<code><code> matchLabels:/<code><code> app: apidemo1/<code><code> template: #Pod模板/<code><code> metadata:/<code><code> labels:/<code><code> app: apidemo1/<code><code> spec:/<code><code> containers: #容器列表/<code><code> - env: #環境變量設置/<code><code> - name: PATH/<code><code> value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin/<code><code> - name: ASPNETCORE_URLS/<code><code> value: http://+:80/<code><code> - name: DOTNET_RUNNING_IN_CONTAINER/<code><code> value: "true"/<code><code> - name: ASPNETCORE_VERSION/<code><code> value: 2.2.6/<code><code> image: ccr.ccs.tencentyun.com/magicodes/apidemo1:latest #鏡像地址/<code><code> imagePullPolicy: Always #鏡像拉取策略,Always表示總是拉取最新鏡像,IfNotPresent表示如果本地存在則不拉取,Never則表示只使用本地鏡像/<code><code> name: apidemo1 #容器名稱/<code><code> resources: #資源限制/<code><code> limits: #最高限制/<code><code> cpu: 500m/<code><code> memory: 256Mi/<code><code> requests: #預分配/<code><code> cpu: 250m/<code><code> memory: 64Mi/<code><code> workingDir: /app #工作目錄/<code><code> dnsPolicy: ClusterFirst #DNS策略/<code><code> restartPolicy: Always #重啟策略/<code><code> terminationGracePeriodSeconds: 30 #刪除需要時間/<code>

鏡像是公開的,基於以上YAML定義,各位可以直接基於騰訊雲的容器服務的【YAML創建資源】進行創建,步驟如下:

  1. 進入容器服務,選擇已有集群進入

  2. 進入工作負載面板,選擇【Deployment】,點擊右上角的【YAML創建資源】按鈕

  3. 貼入剛剛定義的YAML,如下圖所示,然後點擊創建

使用Ingress来负载分发微服务

4.接下來,需要確保創建成功。我們使用上述參考的YAML分別創建Deployment“apidemo1”和“apidemo2”如下圖所示:

使用Ingress来负载分发微服务

    創建服務(Service)資源


接下來,我們來分別創建“apidemo1”和“apidemo2”Service資源。參考YAML如下所示:

<code>apiVersion: v1/<code><code>kind: Service #資源類型/<code><code>metadata:/<code><code> name: apidemo1 #服務名稱/<code><code> namespace: default/<code><code>spec:/<code><code> ports: #端口列表/<code><code> - name: tcp-80-80/<code><code> nodePort: 31010 #節點端口/<code><code> port: 80 #當前端口/<code><code> protocol: TCP #協議/<code><code> targetPort: 80 #目標端口/<code><code> selector: #標籤選擇器/<code><code> app: apidemo1/<code><code> type: NodePort #NodePort 類型的Service/<code>

注意:因為Ingress不會暴露任意端口或協議,因此用於外部訪問時,Service類型必須為NodePort或者LoadBalancer類型。

使用上述類似的“YAML創建資源”的步驟創建Service如下圖所示:

使用Ingress来负载分发微服务

我們創建的Service類型為NodePort,因此可以通過節點公網IP和上述定義的nodePort訪問,如下圖所示:

使用Ingress来负载分发微服务

    創建Ingress資源並配置轉發規則


接下來我們需要創建Ingress並配置好轉發規則達成如下目標:

  • 使用同一個IP訪問多個API服務,這裡我們對應的是“apidemo1”和“apidemo2”

  • 地址http://{IP}/api/demo1將訪問應用“apidemo1”

  • 地址http://{IP}/api/demo2將訪問應用“apidemo2”

根據以上目標,我們定義YAML如下所示:

<code>apiVersion: extensions/v1beta1/<code><code>kind: Ingress/<code><code>metadata:/<code><code> annotations:/<code><code> kubernetes.io/ingress.class: qcloud #註釋,不同的Ingress控制器支持不同的註釋/<code><code> name: demo-ip/<code><code> namespace: default/<code><code>spec:/<code><code> rules: #規則列表/<code><code> - http: #HTTP規則/<code><code> paths: #路徑列表/<code><code> - backend: #後端配置/<code><code> serviceName: apidemo1 #後端服務名稱/<code><code> servicePort: 80 #服務端口/<code><code> path: /api/demo1 #路徑,同一個域名路徑需不同/<code><code> - http:/<code><code> paths:/<code><code> - backend:/<code><code> serviceName: apidemo2 #後端服務名稱/<code><code> servicePort: 80 #服務端口/<code><code> path: /api/demo2 #路徑,同一個域名路徑需不同/<code>

使用以上YAML創建資源,騰訊雲會自動創建負載均衡服務並且提供負載均衡IP,如下圖所示:

使用Ingress来负载分发微服务

我們來驗證下通過此IP訪問是否能夠達到預期結果,測試分別如下圖所示:

使用Ingress来负载分发微服务

雖然我們達成了目標,但是通過IP訪問體驗並不友好,如何通過域名訪問呢?YAML定義定義如下所示:

<code>apiVersion: extensions/v1beta1/<code><code>kind: Ingress/<code><code>metadata:/<code><code> annotations:/<code><code> kubernetes.io/ingress.class: qcloud #註釋,不同的Ingress控制器支持不同的註釋/<code><code> kubernetes.io/ingress.http-rules: '[{"host":"demo.xin-lai.com","path":"/api/demo1","backend":{"serviceName":"apidemo1","servicePort":80}},{"host":"demo.xin-lai.com","path":"/api/demo2","backend":{"serviceName":"apidemo2","servicePort":80}}]' #HTTP轉發規則/<code><code> kubernetes.io/ingress.https-rules: ""/<code><code> kubernetes.io/ingress.rule-mix: "true"/<code><code> random: "777825551427677 
3869"/<code><code> name: demo/<code><code> namespace: default/<code><code>spec:/<code><code> rules: #規則列表/<code><code> - host: demo.xin-lai.com #主機名,可選。如不填寫,則使用IP地址。/<code><code> http: #HTTP規則/<code><code> paths: #路徑列表/<code><code> - backend: #後端配置/<code><code> serviceName: apidemo1 #後端服務名稱/<code><code> servicePort: 80 #服務端口/<code><code> path: /api/demo1 #路徑,同一個域名路徑需不同/<code><code> - host: demo.xin-lai.com #主機名,可選。如不填寫,則使用IP地址。/<code><code> http:/<code><code> paths:/<code><code> - backend:/<code><code> serviceName: apidemo2 #後端服務名稱/<code><code> servicePort: 80 #服務端口/<code><code> path: /api/demo2 #路徑,同一個域名路徑需不同/<code>

值得注意的是,不同的Ingress控制器支持不同的註釋,因此註釋的編寫請參閱所使用的Ingress控制器的說明。轉發規則中,host為空則使用IP。

創建完成之後,騰訊雲同樣會自動創建負載均衡服務並且提供負載均衡IP,如下圖所示,接下來我們需要將域名“demo.xin-lai.com”解析到該負載均衡IP“193.112.232.48”:

使用Ingress来负载分发微服务

解析完成後,我們同樣進行驗證:

使用Ingress来负载分发微服务

如上圖所示,我們使用域名完成了以下目標:

  • 使用同一個域名“demo.xin-lai.com”訪問了“apidemo1”和“apidemo2”

  • 地址http://demo.xin-lai.com/api/demo1將訪問應用“apidemo1”

  • 地址http://demo.xin-lai.com/api/demo2將訪問應用“apidemo2”

至此,一個簡單的使用Ingress來負載分發微服務的Demo完成。當然這僅僅是微服務架構的萬里長征第一步,畢竟Nginx Ingress控制器僅僅解決了服務的分發,並不具備完整的接口網關功能,對於這塊,筆者推薦大家使用Kong+Kong Ingress Controller,架構如下圖所示:

使用Ingress来负载分发微服务

接下來,我們再談談微服務應用服務的管理問題。微服務往往有許多小服務,每個微服務都能夠獨立進行部署和擴展,那麼必然提高了應用管理的複雜度,它們的配置、分發、版本管理等等都是一個管理的難題。在這塊,有什麼更好的解決方案嗎?那就Helm。

往期內容

Docker+ Kubernetes已成為雲計算的主流(二十六)

容器化之後如何節省雲端成本?(二十七)

瞭解Kubernetes主體架構(二十八)

使用Minikube部署本地Kubernetes集群(二十九)

使用kubectl管理k8s集群(三十)

使用Kubeadm創建k8s集群之部署規劃(三十一)

使用Kubeadm創建k8s集群之節點部署(三十二)

集群故障處理之處理思路以及健康狀態檢查(三十三)

集群故障處理之處理思路以及聽診三板斧(三十四)

使用WebDeploy部署遠程IIS網站

使用Kubectl部署應用

通過Service訪問應用 (1)

通過Service訪問應用 (2)

使用Ingress来负载分发微服务使用Ingress来负载分发微服务

如果喜歡作者的文章,請關注【麥扣聊技術】訂閱號以便第一時間獲得最新內容。本文版權歸作者和湖南心萊信息科技有限公司共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

文檔官網:docs.xin-lai.com

QQ群:

編程交流群<85318032>

產品交流群<897857351>


分享到:


相關文章: