首页 > 其他分享 >.Net Core 商城微服务项目系列(十二):使用k8s部署商城服务

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

时间:2023-01-07 22:01:35浏览次数:59  
标签:Core http Service service mi 商城 Net k8s identity

原文网址:https://www.bbsmax.com/A/Ae5RRDeN5Q/

一、简介

本篇我们将会把商城的服务部署到k8s中,同时变化的还有以下两个地方:

1.不再使用Consul做服务的注册和发现,转而使用k8s-dns来实现。

2.不再使用Ocelot作为业务网关,使用Traefik来实现。

正如上面所讲,服务发现和网关均使用k8s的相关工具,当然,相比与以上两个工具,Traefik还有自己的不足,比如Consul的健康检查、Ocelot的限流、熔断机制,不过这些我们后面可以通过其它方式来实现。

整体思路很简单哈,就是编写Dockerfile文件,将各个服务打包成镜像上传到DockerHub,然后再我们的k8s集群中部署,并使用Traefik路由。

二、打包镜像

Dockerfile文件都一样的,所以我这里只列出IdentityServer4服务的Dockerfile:

  1. FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
  2. WORKDIR /app
  3. EXPOSE
  4.  
  5. FROM microsoft/dotnet:2.1-sdk AS build
  6. WORKDIR /src
  7. Copy . .
  8.  
  9. RUN dotnet restore
  10. RUN dotnet build -c Release -o /app
  11.  
  12. FROM build as publish
  13. RUN dotnet publish -c Releease -o /app
  14.  
  15. FROM base AS final
  16. WORKDIR /app
  17. COPY --from=publish /app .
  18. ENTRYPOINT ["dotnet", "MI.Service.Identity.dll"]

通过以下命令进行打包:

  1. docker build -t 镜像名 .

这里需要注意的是镜像名要用自己DockerHub的用户名作为前缀,比如 用户名/mi.service.identity ,只有这样才能再后面上传镜像。

然后通过以下命令登录Docker,上传镜像:

  1. docker login --username xxx
  2.  
  3. docker 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文件,分别如下

  1. kind: Deployment
  2. apiVersion: apps/v1
  3. metadata:
  4. labels:
  5. k8s-app: mi-service
  6. name: mi-service-identity
  7. namespace: mi
  8. spec:
  9. replicas:
  10. selector:
  11. matchLabels:
  12. k8s-app: mi-service-identity
  13. template:
  14. metadata:
  15. labels:
  16. k8s-app: mi-service-identity
  17. spec:
  18. containers:
  19. - name: mi-service-identity
  20. image: 用户名/mi.service.identity
  21. ports:
  22. - containerPort:
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: mi-service-identity
  5. namespace: mi
  6. spec:
  7. selector:
  8. k8s-app: mi-service-identity
  9. ports:
  10. - name: http
  11. port:
  12. targetPort:
  1. apiVersion: extensions/v1beta1
  2. kind: Ingress
  3. metadata:
  4. name: mi-service
  5. namespace: mi
  6. spec:
  7. rules:
  8. - host: mi.service.identity
  9. http:
  10. paths:
  11. - path: /
  12. backend:
  13. serviceName: mi-service-identity
  14. servicePort: http

通过以下命令部署(拉取镜像需要点时间):

  1. kubectl apply -f mi_identity.yaml
  2. kubectl apply -f mi_identity_service.yaml
  3. kubectl apply -f mi-service-ingress.yaml

完成后查看svc、pod、ingress的状态:

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

这个时候我们已经可以再集群内部访问了:

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

然后配置下Host文件,通过浏览器访问

这个服务是用来获取token令牌的,所以呢我们需要postman测试下能不能获取到Token:

成功!

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

  1. apiVersion: extensions/v1beta1
  2. kind: Ingress
  3. metadata:
  4. name: mi-service
  5. namespace: mi
  6. spec:
  7. rules:
  8. - host: mi.service.identity
  9. http:
  10. paths:
  11. - path: /
  12. backend:
  13. serviceName: mi-service-identity
  14. servicePort: http
  15. - host: mi.service.account
  16. http:
  17. paths:
  18. - path: /
  19. backend:
  20. serviceName: mi-service-account
  21. servicePort: http
  22. - host: mi.service.monitor
  23. http:
  24. paths:
  25. - path: /
  26. backend:
  27. serviceName: mi-service-monitor
  28. servicePort: http
  29. - host: mi.service.picture
  30. http:
  31. paths:
  32. - path: /
  33. backend:
  34. serviceName: mi-service-picture
  35. servicePort: http
  36. - host: mi.service.shopcar
  37. http:
  38. paths:
  39. - path: /
  40. backend:
  41. serviceName: mi-service-shopcar
  42. servicePort: http

这个时候其实我们已经可以正常使用了,我们将Web项目里的服务地址修改下,不再通过调用Ocelot进行转发,而是使用k8s中Service的标识,修改appsettings:

  1. {
  2. "Logging": {
  3. "IncludeScopes": false,
  4. "LogLevel": {
  5. "Default": "Warning"
  6. }
  7. },"ServiceAddress": {
  8. "Service.Identity": "http://mi.service.identity",
  9. "Service.Account": "http://mi.service.account","Service.Picture": "http://mi.service.picture",
  10. "Service.Monitor": "http://mi.service.monitor",
  11. "Service.ShopCar": "http://mi.service.shopcar"
  12. }
  13. }

然后运行项目查看:

但是我们现在还存在一个问题。虽然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的名称就可以访问其提供的服务。

 

标签:Core,http,Service,service,mi,商城,Net,k8s,identity
From: https://www.cnblogs.com/bruce1992/p/17033639.html

相关文章

  • Kubernetes初探[1]:部署您的第一个ASP.NET Core应用到k8s集群
    原文网址:http://www.manongjc.com/detail/41-lgbqyltuzalhfxg.htmlKubernetes简介Kubernetes是Google基于Borg开源的容器编排调度引擎,作为CNCF(CloudNativeComputingFo......
  • Net Core 微服务 - 如何将.Net Core Web Api服务部署到Kubernetes (K8s)中 转载
    原文网址:https://blog.51cto.com/u_15127693/43566721.新建一个WebApi项目 默认的webapi项目包含一个默认的api:/weatherforecast  2.新建一个Dockerfile文件 ......
  • .net core操作MongoDB
    前言现实中认识的一个搞java(百万富婆)的大佬,已经转行做抖音主播了,搞技术的只能赶在年前再水一篇博客,不足之处欢迎拍砖,以免误人子弟,呔,真是太难受了环境准备.ne......
  • 【Netty】工作原理图
    https://blog.csdn.net/Youth_lql/article/details/115734142  工作原理示意图1-简单版Netty主要基于主从Reactors多线程模型(如图)做了一定的改进,其中主从React......
  • CICD dotnet 自动化部署 jenkins+gitee
    问题描述:在Centos8系统中,使用dockerrun时,出现如下报错:EmulateDockerCLIusingpodman.Create/etc/containers/nodockertoquietmsg.Error:open/proc/self/uid_map......
  • OneTab插件的替代产品-OneTab Pro
    插件名称:OneTabProOneTabPro更实用的新一代标签页管理工具,主要功能和onetab一样,为了节省内存的消耗和标签页混乱问题。可以节省高达95%的内存和减少标签混乱,当您发现自......
  • OneTab插件的替代产品-OneTab Pro
    插件名称:OneTabProOneTabPro更实用的新一代标签页管理工具,主要功能和onetab一样,为了节省内存的消耗和标签页混乱问题。可以节省高达95%的内存和减少标签混乱,当您发......
  • 将NETStandard和NetCore智能提示从英文变成中文
    惯例,先鸣谢大佬的文章:将NetCore智能提示从英文变成中文第一步:下载语言包并解压按照大佬的指导,先到Downloadlocalized.NETIntelliSensefiles下载了语言包下载之后......
  • docker 与 kubernetes
    最近尝试安装 kubernetes因为墙的问题弄的是焦头烂额,特记录下一.Docker的安装参照官方文档配置yum源为阿里源基本安装就没啥问题 二.cri-dockerd安装因为国内......
  • java服装商城购物商场项目源码
    简介Java基于ssm开发的服装商城,用户可以浏览商品和特价商品,加入购物车,直接下单支付,在我的个人中心里可以管理自己的订单,收货地址,编辑资料等。管理员可以发布商品,上下架商......