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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發布時間:2023/12/13 asp.net 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .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

總結

以上是生活随笔為你收集整理的.Net Core 商城微服务项目系列(十二):使用k8s部署商城服务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。