.Net Core 商城微服務項目系列(十二):使用k8s部署商城服務

一、簡介

本篇我們將會把商城的服務部署到k8s中,同時變化的還有以下兩個地方:

1.不再使用Consul做服務的注冊和發現,轉而使用k8s-dns來實現。

2.不再使用Ocelot作為業務網關,使用Traefik來實現。

正如上面所講,服務發現和網關均使用k8s的相關工具,當然,相比與以上兩個工具,Traefik還有自己的不足,比如Consul的健康檢查、Ocelot的限流、熔斷機制,不過這些我們后面可以通過其它方式來實現。

整體思路很簡單哈,就是編寫Dockerfile文件,將各個服務打包成鏡像上傳到DockerHub,然后再我們的k8s集群中部署,并使用Traefik路由。

?

二、打包鏡像

Dockerfile文件都一樣的,所以我這里只列出IdentityServer4服務的Dockerfile:

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
Copy . .RUN dotnet restore
RUN dotnet build -c Release -o /appFROM build as publish
RUN dotnet publish -c Releease -o /appFROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "MI.Service.Identity.dll"]

通過以下命令進行打包:

docker build -t 鏡像名 .

這里需要注意的是鏡像名要用自己DockerHub的用戶名作為前綴,比如 用戶名/mi.service.identity ,只有這樣才能再后面上傳鏡像。

然后通過以下命令登錄Docker,上傳鏡像:

docker login --username xxxdocker push 用戶名/mi.service.identity

?

這里需要注意的是如果我們的項目是包含類庫的,比如下面這種:

那我們的Dockerfile文件寫法要改成下面這樣,并且要把它放在和解決方案.sln同級的文件夾內,因為類庫也需要進行編譯:

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
Copy . .

WORKDIR /src/MI.Service.Account

RUN dotnet restore
RUN dotnet build -c Release -o /app

FROM build as publish
RUN dotnet publish -c Releease -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "MI.Service.Account.dll"]

?

三、部署到k8s

我們的需要編寫deployment、Service和ingress的yaml文件,分別如下

kind: Deployment
apiVersion: apps/v1
metadata:labels:k8s-app: mi-servicename: mi-service-identitynamespace: mi
spec:replicas: 2selector:matchLabels:k8s-app: mi-service-identitytemplate:metadata:labels:k8s-app: mi-service-identityspec:containers:- name: mi-service-identityimage: 用戶名/mi.service.identityports:- containerPort: 80
apiVersion: v1
kind: Service
metadata:name: mi-service-identitynamespace: mi
spec:selector:k8s-app: mi-service-identityports:- name: httpport: 80targetPort: 80
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: mi-servicenamespace: mi
spec:rules:- host: mi.service.identityhttp:paths:- path: /backend:serviceName: mi-service-identityservicePort: http

通過以下命令部署(拉取鏡像需要點時間):

kubectl apply -f mi_identity.yaml
kubectl apply -f mi_identity_service.yaml
kubectl apply -f mi-service-ingress.yaml

完成后查看svc、pod、ingress的狀態:

[root@localhost ~]# kubectl get pods -n mi
NAME                                 READY   STATUS    RESTARTS   AGE
mi-service-identity-7dfbf85d-x7w82   1/1     Running   0          23h
mi-service-identity-7dfbf85d-z4hz9   1/1     Running   0          23h[root@localhost ~]# kubectl get deployment -n mi
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
mi-service-identity   2/2     2            2           23h[root@localhost service-yaml]# kubectl get svc -n mi
NAME                  TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
mi-service-identity   ClusterIP   10.109.13.2   <none>        80/TCP    7s[root@localhost k8s-mi]# kubectl get ing -n mi
NAME         HOSTS                 ADDRESS   PORTS   AGE
mi-service   mi.service.identity             80      33m

這個時候我們已經可以再集群內部訪問了:

[root@localhost service-yaml]# curl http://10.109.13.2/api/Health
ok

然后配置下Host文件,通過瀏覽器訪問

這個服務是用來獲取token令牌的,所以呢我們需要postman測試下能不能獲取到Token:

成功!

?

然后我們需要把另外的服務也部署到k8s,同時更新Ingress的配置,如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: mi-servicenamespace: mi
spec:rules:- host: mi.service.identityhttp:paths:- path: /backend:serviceName: mi-service-identityservicePort: http- host: mi.service.accounthttp:paths:- path: /backend:serviceName: mi-service-accountservicePort: http- host: mi.service.monitorhttp:paths:- path: /backend:serviceName: mi-service-monitorservicePort: http- host: mi.service.picturehttp:paths:- path: /backend:serviceName: mi-service-pictureservicePort: http- host: mi.service.shopcarhttp:paths:- path: /backend:serviceName: mi-service-shopcarservicePort: http

?

這個時候其實我們已經可以正常使用了,我們將Web項目里的服務地址修改下,不再通過調用Ocelot進行轉發,而是使用k8s中Service的標識,修改appsettings:

{"Logging": {"IncludeScopes": false,"LogLevel": {"Default": "Warning"}},"ServiceAddress": {"Service.Identity": "http://mi.service.identity","Service.Account": "http://mi.service.account","Service.Picture": "http://mi.service.picture","Service.Monitor": "http://mi.service.monitor","Service.ShopCar": "http://mi.service.shopcar"}
}

然后運行項目查看:

?

?

?但是我們現在還存在一個問題。雖然Pod的IP可以被Service發現,但是Service的IP被誰發現呢,現在Traefik中配置host和其IP是我們手動配置,當然Service的IP一般是固定不變的,但是如果變了,我們希望能被自動發現和映射,這一步將通過k8s dns來實現。

?

三、使用k8s-dns做服務發現

k8s中的service分配的虛擬IP是固定的,而pod異常后新生成的pod ip會發生變化,可以通過service做代理關聯到后端的pod。

kube-dns可以解決Service的發現問題,k8s將Service的名稱當做域名注冊到kube-dns中,通過Service的名稱就可以訪問其提供的服務。

通過設置k8s中的dns服務可以直接解析service的名字,得到對應service的ip,可以實現服務在集群內部互相訪問。

轉載于:https://www.cnblogs.com/weiBlog/p/10604961.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249324.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249324.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249324.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTML、CSS知識點總結,淺顯易懂。

一&#xff0c;htmlcss基礎 1-1 Html和CSS的關系 學習web前端開發基礎技術需要掌握&#xff1a;HTML、CSS、JavaScript語言。下面我們就來了解下這三門技術都是用來實現什么的&#xff1a; 1. HTML是網頁內容的載體。內容就是網頁制作者放在頁面上想要讓用戶瀏覽的信息&#xf…

Thinking in Java 源代碼 source code 在IDEA上運行

參考我52的文章&#xff1a;https://www.52pojie.cn/thread-912471-1-1.html 轉載于:https://www.cnblogs.com/AI-Cobe/p/10605434.html

CSS知識體系圖譜

轉自&#xff1a;https://blog.csdn.net/A13330069275/article/details/78448415

python2 pip安裝包等出現各種編碼錯誤UnicodeDecodeError: 'ascii'(/或者utf-8) codec can't decode byte 0xd2......

1.問題描述&#xff1a; python2環境&#xff0c;pip安裝包時報錯UnicodeDecodeError: ascii(/或者utf-8) codec cant decode byte 0xd2... 類似如下情況 2.原因分析 一開始依據網上給出的教程修改python安裝路徑下的各種文件&#xff0c;添加各種編碼&#xff0c;始終無法解決…

mybatis自動生成代碼

https://blog.csdn.net/qq_31169429/article/details/89137896

leetcood學習筆記-111-二叉樹的最小深度

題目描述&#xff1a; 第一次提交&#xff1a; class Solution(object):def minDepth(self, root):""":type root: TreeNode:rtype: int"""if not root:return 0if root.left and root.right:return min(self.minDepth(root.left)1,self.minDept…

深入淺析HTML5中的article和section的區別

在HTML5中&#xff0c;為了使文檔的結構更加清晰明確&#xff0c;追加了幾個與頁眉、頁腳、內容區塊等文檔結構相關聯的結構元素。內容區塊是指將HTML頁面按邏輯分割后 的單位。例如對于書籍來說&#xff0c;章、節可以稱為內容區塊&#xff1b;對于博客網站來說&#xff0c;導…

IPV6 簡單總結

1. 轉帖別人的內容 來源&#xff1a;https://www.2cto.com/net/201112/114937.html 2. 本地用IPV6單播地址 (包括鏈路本地單播地址 和 站點本地單播地址) 2.1 鏈路本地單播地址 規定了鏈路本地和站點本地兩種類型的本地使用單播地址。鏈路本地地址用在單鏈路上&#xff0c; 而…

源碼分析

https://blog.csdn.net/taifei/article/details/73546836

面向對象第一單元總結

一、對面向對象的理解 有位同學給java的面向對象做了一個形象生動的類比&#xff0c;我覺得很有道理&#xff0c;大概按我的理解如下&#xff1a; 結構的形成看圖之前&#xff0c;我們要先明白&#xff0c;世界上是先有了實體&#xff0c;才有了一步步抽象至以上的體系結構&…

理解HTML語義化

1、什么是HTML語義化&#xff1f; <基本上都是圍繞著幾個主要的標簽&#xff0c;像標題&#xff08;H1~H6&#xff09;、列表&#xff08;li&#xff09;、強調&#xff08;strong em&#xff09;等等> 根據內容的結構化&#xff08;內容語義化&#xff09;&#xff0c;…

maven上傳命令

mvn deploy:deploy-file -DgroupIdcom.oracle -DartifactIdojdbc8 -Dversion12.2.0.1 -Dpackagingjar -DfileC:\Users\Admin\Desktop\ojdbc8.jar -Durlhttp://116.247.107.83:8081/repository/maven-releases/ -DrepositoryIdmy-nexus-releases

cocos2dx 開啟控制臺

打開 SimulatorWin.cpp 把這句啟用&#xff1a; #define SIMULATOR_WITH_CONSOLE_AND_MENU 1 這句本來因為#define隱藏了轉載于:https://www.cnblogs.com/mingfuqishi/p/9774301.html

網頁編排規則

所謂大綱&#xff0c;簡單來說就是文檔中各內容區塊的結構編排。可以分為顯式編排和隱式編排2種方式。 顯式編排&#xff1a;明確使用section元素創建文檔結構&#xff0c;在每個內容區塊內使用標題 隱式編排&#xff1a;不明確使用section等元素&#xff0c;根據頁面中所書寫的…

基本動態規劃題集

觀察下面的數字金字塔。寫一個程序查找從最高點到底部任意處結束的路徑&#xff0c;使路徑經過數字的和最大。每一步可以從當前點走到左下方的點也可以到達右下方的點。 在上面的樣例中,從13到8到26到15到24的路徑產生了最大的和86。 【輸入】 第一個行包含R(1≤ R≤1000)&…

springboot項目間接口調用實現:RestTemplate

https://blog.csdn.net/zhanglf02/article/details/89842372

python入門學習的第三天

step 1 時間 Python有兩個模塊&#xff0c;time和calendar&#xff0c;它們可以用于處理時間和日期 首先 import time 導入時間模塊 然后 print time.time() 這個叫時間戳&#xff0c;它是從1970年1月1日午夜到現在時刻的秒數 print time.localtime(time.time()) print time.st…

JavaScript事件詳解

JavaScript與HTML之間的交互是通過事件來實現的。事件&#xff0c;就是文檔或瀏覽器窗口中發生的一些特定的交互瞬間。可以用偵聽器來預訂事件&#xff0c;以便事件發生的時候執行相應的代碼。 事件流 事件流描述了從頁面中接收事件的順序&#xff0c;包括事件冒泡和事件捕獲。…

JavaScript基礎01

JavaScript查漏補缺 JavaScript有幾種數據類型&#xff1f; 0. String(字符串) 1. Number(數值) 2. Boolean(布爾) 3. Null(空值) 4. Undefined(未定義) 5. Object(對象)前 5 種是基本類型 Null類型和Undefined類型的定義和區別&#xff1f; Null類型的值只有一個(null)&#…

.Net Core應用框架Util介紹(五)

上篇簡要介紹了Util在Angular Ts方面的封裝情況&#xff0c;本文介紹Angular封裝的另一個部分&#xff0c;即Html的封裝。 標準組件與業務組件 對于管理后臺這樣的表單系統&#xff0c;你通常會使用Angular Material或Ng-Zorro這樣的UI組件庫&#xff0c;它們提供了標準化的U…