日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

使用Ingress来负载分发微服务

發(fā)布時(shí)間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Ingress来负载分发微服务 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄??

使用Ingress來(lái)負(fù)載分發(fā)微服務(wù)?

  • Demo規(guī)劃?

  • 準(zhǔn)備Demo并完成部署?

  • 創(chuàng)建部署(Deployment)資源?

  • 創(chuàng)建服務(wù)(Service)資源?

  • 創(chuàng)建Ingress資源并配置轉(zhuǎn)發(fā)規(guī)則?

使用Ingress來(lái)負(fù)載分發(fā)微服務(wù)


NodePort Service存在太多缺陷,不適合生產(chǎn)環(huán)境。LoadBlancer Service則不太靈活,比如針對(duì)微服務(wù)架構(gòu),那么不同服務(wù)是否需要多個(gè)負(fù)載均衡服務(wù)呢?那么,我們還有其他選擇么?那就是Ingress。

Ingress將集群外部的HTTP和HTTPS路由暴露給集群中的Service,相當(dāng)于集群的入口,而入口規(guī)則則由Ingress定義的規(guī)則來(lái)控制。在使用Ingress之前,我們先需要有一個(gè)Ingress Controller(入口控制器),例如ingress-nginx。Ingress負(fù)責(zé)定義抽象的規(guī)則,而Ingress Controller負(fù)責(zé)具體實(shí)現(xiàn)。通常情況下,Ingress搭配負(fù)載均衡一起使用。接下來(lái),筆者結(jié)合一個(gè)簡(jiǎn)單的微服務(wù)Demo來(lái)使用Ingress進(jìn)行負(fù)載分發(fā)。由于需要使用到負(fù)載均衡服務(wù),本教程使用騰訊云容器服務(wù)進(jìn)行講解。

Demo規(guī)劃

為了便于大家理解,我們先做一個(gè)簡(jiǎn)單的規(guī)劃。整體規(guī)劃圖如下所示:

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

  • 我們需要開(kāi)發(fā)兩個(gè)應(yīng)用,分別為apidemo1和apidemo2,并提供不同的接口服務(wù);

  • 然后需要將兩個(gè)應(yīng)用分別部署到k8s集群,并且分別創(chuàng)建不同的Service;

  • 接下來(lái),我們需要?jiǎng)?chuàng)建Ingress,配置不同的轉(zhuǎn)發(fā)規(guī)則;

  • 最后,為了訪(fǎng)問(wèn)方便,我們需要配置域名映射。

  • 準(zhǔn)備Demo并完成部署

    如上所述,接下來(lái)我們進(jìn)入開(kāi)發(fā)環(huán)節(jié)。

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

    • apidemo1

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

    注意:apidemo1和apidemo2均需支持80端口和443端口訪(fǎng)問(wèn)。

    • apidemo2

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

    由于Demo比較簡(jiǎn)單,這里我們就不貼代碼了。Demo準(zhǔn)備完成后,我們需要推送docker鏡像到目標(biāo)倉(cāng)儲(chǔ),然后創(chuàng)建部署(Deployment)以及服務(wù)(Service)。

    創(chuàng)建部署(Deployment)資源

    整個(gè)過(guò)程在前面的章節(jié)我們均有詳細(xì)講述,因此這里就不贅述了,這里我們僅提供參考的YAML定義文件:

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

    鏡像是公開(kāi)的,基于以上YAML定義,各位可以直接基于騰訊云的容器服務(wù)的【YAML創(chuàng)建資源】進(jìn)行創(chuàng)建,步驟如下:

  • 進(jìn)入容器服務(wù),選擇已有集群進(jìn)入

  • 進(jìn)入工作負(fù)載面板,選擇【Deployment】,點(diǎn)擊右上角的【YAML創(chuàng)建資源】按鈕

  • 貼入剛剛定義的YAML,如下圖所示,然后點(diǎn)擊創(chuàng)建

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

    創(chuàng)建服務(wù)(Service)資源

    接下來(lái),我們來(lái)分別創(chuàng)建“apidemo1”和“apidemo2”Service資源。參考YAML如下所示:

    apiVersion: v1 kind: Service #資源類(lèi)型 metadata: name: apidemo1 #服務(wù)名稱(chēng) namespace: default spec: ports: #端口列表 - name: tcp-80-80 nodePort: 31010 #節(jié)點(diǎn)端口 port: 80 #當(dāng)前端口 protocol: TCP #協(xié)議 targetPort: 80 #目標(biāo)端口 selector: #標(biāo)簽選擇器 app: apidemo1 type: NodePort #NodePort 類(lèi)型的Service

    注意:因?yàn)镮ngress不會(huì)暴露任意端口或協(xié)議,因此用于外部訪(fǎng)問(wèn)時(shí),Service類(lèi)型必須為NodePort或者LoadBalancer類(lèi)型。

    使用上述類(lèi)似的“YAML創(chuàng)建資源”的步驟創(chuàng)建Service如下圖所示:

    我們創(chuàng)建的Service類(lèi)型為NodePort,因此可以通過(guò)節(jié)點(diǎn)公網(wǎng)IP和上述定義的nodePort訪(fǎng)問(wèn),如下圖所示:

    創(chuàng)建Ingress資源并配置轉(zhuǎn)發(fā)規(guī)則

    接下來(lái)我們需要?jiǎng)?chuàng)建Ingress并配置好轉(zhuǎn)發(fā)規(guī)則達(dá)成如下目標(biāo):

    • 使用同一個(gè)IP訪(fǎng)問(wèn)多個(gè)API服務(wù),這里我們對(duì)應(yīng)的是“apidemo1”和“apidemo2”

    • 地址http://{IP}/api/demo1將訪(fǎng)問(wèn)應(yīng)用“apidemo1”

    • 地址http://{IP}/api/demo2將訪(fǎng)問(wèn)應(yīng)用“apidemo2”

    根據(jù)以上目標(biāo),我們定義YAML如下所示:

    apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: qcloud #注釋,不同的Ingress控制器支持不同的注釋 name: demo-ip namespace: default spec: rules: #規(guī)則列表 - http: #HTTP規(guī)則 paths: #路徑列表 - backend: #后端配置 serviceName: apidemo1 #后端服務(wù)名稱(chēng) servicePort: 80 #服務(wù)端口 path: /api/demo1 #路徑,同一個(gè)域名路徑需不同 - http: paths: - backend: serviceName: apidemo2 #后端服務(wù)名稱(chēng) servicePort: 80 #服務(wù)端口 path: /api/demo2 #路徑,同一個(gè)域名路徑需不同

    使用以上YAML創(chuàng)建資源,騰訊云會(huì)自動(dòng)創(chuàng)建負(fù)載均衡服務(wù)并且提供負(fù)載均衡IP,如下圖所示:

    我們來(lái)驗(yàn)證下通過(guò)此IP訪(fǎng)問(wèn)是否能夠達(dá)到預(yù)期結(jié)果,測(cè)試分別如下圖所示:

    雖然我們達(dá)成了目標(biāo),但是通過(guò)IP訪(fǎng)問(wèn)體驗(yàn)并不友好,如何通過(guò)域名訪(fǎng)問(wèn)呢?YAML定義定義如下所示:

    apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: qcloud #注釋,不同的Ingress控制器支持不同的注釋 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轉(zhuǎn)發(fā)規(guī)則 kubernetes.io/ingress.https-rules: "null" kubernetes.io/ingress.rule-mix: "true" random: "7778255514276773869" name: demo namespace: default spec: rules: #規(guī)則列表 - host: demo.xin-lai.com #主機(jī)名,可選。如不填寫(xiě),則使用IP地址。 http: #HTTP規(guī)則 paths: #路徑列表 - backend: #后端配置 serviceName: apidemo1 #后端服務(wù)名稱(chēng) servicePort: 80 #服務(wù)端口 path: /api/demo1 #路徑,同一個(gè)域名路徑需不同 - host: demo.xin-lai.com #主機(jī)名,可選。如不填寫(xiě),則使用IP地址。 http: paths: - backend: serviceName: apidemo2 #后端服務(wù)名稱(chēng) servicePort: 80 #服務(wù)端口 path: /api/demo2 #路徑,同一個(gè)域名路徑需不同

    值得注意的是,不同的Ingress控制器支持不同的注釋,因此注釋的編寫(xiě)請(qǐng)參閱所使用的Ingress控制器的說(shuō)明。轉(zhuǎn)發(fā)規(guī)則中,host為空則使用IP。

    創(chuàng)建完成之后,騰訊云同樣會(huì)自動(dòng)創(chuàng)建負(fù)載均衡服務(wù)并且提供負(fù)載均衡IP,如下圖所示,接下來(lái)我們需要將域名“demo.xin-lai.com”解析到該負(fù)載均衡IP“193.112.232.48”:

    解析完成后,我們同樣進(jìn)行驗(yàn)證:

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

    • 使用同一個(gè)域名“demo.xin-lai.com”訪(fǎng)問(wèn)了“apidemo1”和“apidemo2”

    • 地址http://demo.xin-lai.com/api/demo1將訪(fǎng)問(wèn)應(yīng)用“apidemo1”

    • 地址http://demo.xin-lai.com/api/demo2將訪(fǎng)問(wèn)應(yīng)用“apidemo2”

    至此,一個(gè)簡(jiǎn)單的使用Ingress來(lái)負(fù)載分發(fā)微服務(wù)的Demo完成。當(dāng)然這僅僅是微服務(wù)架構(gòu)的萬(wàn)里長(zhǎng)征第一步,畢竟Nginx Ingress控制器僅僅解決了服務(wù)的分發(fā),并不具備完整的接口網(wǎng)關(guān)功能,對(duì)于這塊,筆者推薦大家使用Kong+Kong Ingress Controller,架構(gòu)如下圖所示:

    接下來(lái),我們?cè)僬務(wù)勎⒎?wù)應(yīng)用服務(wù)的管理問(wèn)題。微服務(wù)往往有許多小服務(wù),每個(gè)微服務(wù)都能夠獨(dú)立進(jìn)行部署和擴(kuò)展,那么必然提高了應(yīng)用管理的復(fù)雜度,它們的配置、分發(fā)、版本管理等等都是一個(gè)管理的難題。在這塊,有什么更好的解決方案嗎?那就Helm。

    往期內(nèi)容

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

    容器化之后如何節(jié)省云端成本?(二十七)

    了解Kubernetes主體架構(gòu)(二十八)

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

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

    使用Kubeadm創(chuàng)建k8s集群之部署規(guī)劃(三十一)

    使用Kubeadm創(chuàng)建k8s集群之節(jié)點(diǎn)部署(三十二)

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

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

    使用WebDeploy部署遠(yuǎn)程IIS網(wǎng)站

    使用Kubectl部署應(yīng)用

    通過(guò)Service訪(fǎng)問(wèn)應(yīng)用 (1)

    通過(guò)Service訪(fǎng)問(wèn)應(yīng)用 (2)

    轉(zhuǎn)載是一種動(dòng)力 分享是一種美德

    總結(jié)

    以上是生活随笔為你收集整理的使用Ingress来负载分发微服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。