.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部署商城服务相关推荐
- .Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关...
1.服务注册 在上一篇的鉴权和登录服务中分别通过NuGet引用Consul这个包,同时新增AppBuilderExtensions类: public static class AppBuilderEx ...
- 【k8s系列十二】k8s 之 Service的类型
svc的类型 ClusterIp:默认类型,自动分配一个仅 Cluster 内部可以访问的虚拟 IP NodePort:在 ClusterIP 基础上为 Service 在每台机器上绑定一个端口,这样 ...
- vue简易微前端项目搭建(二):子项目模板及项目脚手架搭建
github传送门: 1.h5主项目 2.项目脚手架 3.子项目模板 系列文章传送门: vue简易微前端项目搭建(一):项目背景及简介 vue简易微前端项目搭建(二):子项目模板及项目脚手架搭建 vu ...
- xen是服务器虚拟化,xen虚拟化实战系列(十二)之xen虚拟机高可用之在线迁移
xen虚拟化实战系列文章列表 xen虚拟化实战系列(十三)之xen虚拟机集中管理之convirt 1. 方案背景概述 本文是有对我们一个xen虚拟化生产环境将要改造的一个方案而来,在项目上线初期,没有 ...
- Alamofire源码解读系列(十二)之请求(Request)
本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...
- kotlin杂谈系列十二(Kotlin和Java的互操作)
Kotlin杂谈系列十二 这次就主要来谈谈kotlin和java互操作的问题 kotlin出来的使命就是为了解决java的模板问题和一些冗长的问题所以kotlin天生就很好的支持了java 所以我们在 ...
- Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】
2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...
- Netty实战 IM即时通讯系统(十二)构建客户端与服务端pipeline
Netty实战 IM即时通讯系统(十二)构建客户端与服务端pipeline 零. 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 客户端启动流程 实战: 客户端和服务端双向 ...
- 【甄选靶场】Vulnhub百个项目渗透——项目四十二:Moria1.1(MD5加盐爆破)
Vulnhub百个项目渗透 Vulnhub百个项目渗透--项目四十二:Moria1.1(MD5加盐爆破)
- 【甄选靶场】Vulnhub百个项目渗透——项目五十二:Fowsniff-1(任务挟持)
Vulnhub百个项目渗透 Vulnhub百个项目渗透--项目五十二:Fowsniff-1(任务挟持)
最新文章
- 如何访问固定的内存位置?
- Numpy中求向量和矩阵的范数
- HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo...
- 什么是引力波?它是怎么被发现的?
- TMS、物流系统、司机运输商、承运商、结算流程、运输流程、运输调度、结构图、在途跟踪、提货单、签收单、回单交接、车辆管理、运力资源、报价管理、发票管理、询价单管理、审批报价、KPI数据、适度配载
- C++中的面向对象(二)
- ajax向后台传递list参数
- 《前端之路》之 JavaScript 高级技巧、高阶函数(一)
- php转义还原,PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例_PHP
- 成功解决微信浏览器实现自动下载功能
- 产品经理/技术总监的能力模型
- ubuntu 18.04设置静态ip(固定IP地址)
- 【深度学习基础】Epoch, Batch, Iteration这三个概念的区别与联系
- 云耀服务器切换系统,云耀云服务器切换操作系统
- 作业4: 用户体验分析——以 “师路南通网站” 为例
- Java物流项目第五天 数据聚合服务开发(pd-aggregation)
- 嵌入式中的BSP---BSP到底是什么?
- 芯片制造系列全流程:设计、制造、封测
- 【MATLAB-app】系列教程(含视频)第2课_实例:使用appdesigner 制作简单的计算器
- springboot、quartz定时任务未触发
热门文章
- ue4 gpu构建_待在家里吗 为什么不构建GPU Box!
- cnn卷积神经网络应用_卷积神经网络(CNN):应用的核心概念
- 主题建模lda_使用LDA的Google Play商店应用评论的主题建模
- 央行无意放宽松,7月贷款仍有可能吃紧
- verilog经验谈
- OOo-MySpell 一个C++的拼写语法检查开源项目
- 开榨油店的失败教训_想开水果店没有经验?线下开水果店经营心得分享,或许你用得上...
- java项目经验怎么写_模具工简历项目经验怎么写
- python 杀死子进程_Python:当父异常终止时,如何杀死子进程?
- Unity C# Job System介绍(四) 并行化Job和故障排除(完结)