.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.mzph.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…