微服务架构是一项在云中部署应用和服务的新技术。大部分围绕微服务的争论都集中在容器或其余技术是否能很好的实施微服务,而红帽说API应该是重点。前端
微服务能够在"本身的程序"中运行,并经过"轻量级设备与HTTP型API进行沟通"。关键在于该服务能够在本身的程序中运行。经过这一点咱们就能够将服务公开与微服务架构(在现有系统中分布一个API)区分开来。在服务公开中,许多服务均可以被内部独立进程所限制。若是其中任何一个服务须要增长某种功能,那么就必须缩小进程范围。在微服务架构中,只须要在特定的某种服务中增长所需功能,而不影响总体进程的架构。
微服务是什么?java
微服务是一种软件设计风格,开发人员在开发项目时,是一种微服务这种标准去设计的,这种的设计风格是一种将单体的应用,拆分为多个小的组件去开发,那每一个组件是独立的部署,独立的测试,服务之间采用轻量级的通讯node
微服务的特色mysql
服务的组件化nginx
每一个服务独立开发、部署、有效避免一个服务的修改引发整个系统从新部署。git
技术栈灵活github
约定通讯方式,使得服务自己功能实现对技术要求再也不那么敏感,能够根据不停语言进行开发spring
独立部署sql
每一个微服务独立部署,加快部署速度,方便扩展,比起单体应用来说要小,轻量级的,方便快速部署,扩展docker
扩展性强
每一个微服务能够部署多个,没有多少依赖,而且有负载均衡能力,好比一个服务部署一个副本或5个副本,经过k8s能够更好的去扩展咱们的应用
独立数据
每一个微服务有独立的基本组件,例如数据库、缓存等,可能有不一样的开放人员,不依赖
微服务不足
沟通成本:因为组件都是分开来开发的,不一样的项目组,沟通起来不方便,单体应用就是集中起来开发的
数据一致性:保证这个数据,独立的组件数据是一致性。
运维成本:虚拟机部署,须要考虑组件性,调用关系,监控,配置
内部架构复杂性:分布式的,须要轻量级的通讯,rbac,MQ,还有不少的数据库。
单体应用 vs 微服务
单体架构优点 单体架构不足
易于部署 代码膨胀,难以维护
易于测试 构建、部署成本大、新人上手难
单体应用适合于轻量级的应用,不提供复杂的应用
微服务适合比较大的应用,复杂一些的
java微服务框架
spring Boot 是独立的
spring cloud ,基于spring boot的
Dubbo 阿里巴巴的开源微服务框架,经过rbc实现组件之间的通讯
为何要用注册中心
须要记录一个或者多个微服务多个副本接口地址
须要实现一个或者多个微服务多个副本负载均衡
须要判断一个或者多个微服务的副本是否可用
主流注册中心,Eureka,Nacos
不一样环境如何区分配置文件
第一种:java-jar --spring.profile.active=dev xxx.jar
第二种:统一的配置中心,例如携程的Apollo,百度的Disconf,动态根据不一样的环境进行配置,页面进行管理,须要二次开发,
项目迁移到k8s平台是怎样的流程
咱们先举个例子了解一下大概的一个怎样的流程
1制做镜像--->2控制管理pod--->3暴露应用--->4对外发布应用--->5日志/监控
制做镜像{ 应用程序
{ 运行环境
{ 文件系统
控制器
deployment :无状态部署
statefulset :有状态部署
Daemonset :守护进程部署
job & cronjob:批处理
暴露应用
service定义pod的逻辑集合,提供服务发现,只要加进这组就能发现
提供负载均衡
支持cluster ip nodeport loadbalancer三种类型
底层实现iptables/ipvs两种网络模式
经过label关联pod
使用Coredns解析service名称
对外发布应用
ingress
经过service关联pod
基于域名访问
经过ingress controller实现pod的负载均衡
支持tcp、udp 4层和http7层
pod数据持久化
容器部署过程当中通常有如下三种数据
启动时须要的初始数据,能够是配置文件
启动过程当中产生的临时数据,该数据须要多个容器间共享
启动过程当中产生的持久化数据
这里只作演示,以及在k8s中如何部署微服务,以及实现步骤和思路,但愿对你有所帮助
主机使用ip:
192.168.30.21 k8s-master 192.168.30.22 k8s-node1 192.168.30.23 k8s-node2 192.168.30.24 harbor-mysql
Dev1 交付代码
Dev2 编写Dockerfile构建镜像
Dev3 k8s资源编排
Dev4 微服务链路监控
Dev5 新功能测试
Master 最终上线
1、代码编译构建(Maven)
拉取项目代码
代码分支:[root@k8s-master ~]# git clone -b dev https://github.com/xxxxx/simple-microservice
声明:交付的分支
simple-microservice-dev1
[root@k8s-master ~]# ls anaconda-ks.cfg simple-microservice-dev2 simple-microservice-master 模板 文档 桌面 initial-setup-ks.cfg simple-microservice-dev3 yum.sh 视频 下载 simple-microservice-dev1 simple-microservice-dev4 公共 图片 音乐 编译须要安装jdk , jdk版本要看开发那边使用什么,注意一下。我这里用的1.8.0
用maven去编译项目
Centos7默认有openjdk的包
[root@k8s-master ~]# yum install java-1.8.0-openjdk maven -y 软件包 1:java-1.8.0-openjdk-1.8.0.222.b10-0.el7_6.x86_64 已安装
而且是最新版本
软件包 maven-3.0.5-17.el7.noarch 已安装而且是最新版本
查看安装的jdk版本
[root@k8s-master ~]# java -version openjdk version "1.8.0_222" OpenJDK Runtime Environment (build 1.8.0_222-b10) OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
查看maven启动文件
[root@k8s-master ~]# mvn mvn mvnDebug mvnyjp
进行编译:
进入源代码里,咱们先进入交付的分支,开发工程师原封不动的把源代码交给咱们,而后咱们运维工程师进行编译构建,把源代码打成jar包
[root@k8s-master ~]# cd simple-microservice-dev1 [root@k8s-master simple-microservice-dev1]# ls basic-common eureka-service LICENSE order-service portal-service README.md db gateway-service lombok.config pom.xml product-service stock-service
Maven项目对象模型(POM),能够经过一小段描述信息来观念里项目的构建,报告和文档的项目管理工具软件
mvn clean package -D maven.test.skip=true -P prod mvn clean package:清除目录中生成的结果,作一个清除,从新打新的包。 -D maven.test.skip: 跳过单元测试,写的测试用例,若是写的有问题,是编译不过去的 -P prod: 使用哪一套配置文件 [root@k8s-master simple-microservice-dev1]# mvn clean package -D maven.test.skip=true
若是代码没问题就会如下面的呈现,有问题就能够去找研发那边
运行不少的输出,构建中会在网上拉取须要的依赖包,
[INFO]
[INFO] --- spring-boot-maven-plugin:2.0.9.RELEASE:repackage (default) @ portal-service ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] simple-microservice ............................... SUCCESS [13.208s]
[INFO] basic-common ...................................... SUCCESS [0.002s]
[INFO] basic-common-core ................................. SUCCESS [6:34.870s]
[INFO] gateway-service ................................... SUCCESS [5:15.194s]
[INFO] eureka-service .................................... SUCCESS [30.681s]
[INFO] product-service ................................... SUCCESS [0.014s]
[INFO] product-service-api ............................... SUCCESS [0.677s]
[INFO] stock-service ..................................... SUCCESS [0.001s]
[INFO] stock-service-api ................................. SUCCESS [0.545s]
[INFO] product-service-biz ............................... SUCCESS [10.321s]
[INFO] stock-service-biz ................................. SUCCESS [1.787s]
[INFO] order-service ..................................... SUCCESS [0.002s]
[INFO] order-service-api ................................. SUCCESS [0.697s]
[INFO] order-service-biz ................................. SUCCESS [2.029s]
[INFO] basic-common-bom .................................. SUCCESS [0.001s]
[INFO] portal-service .................................... SUCCESS [2.454s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 13:16.229s
[INFO] Finished at: Fri Aug 02 09:35:01 CST 2019
[INFO] Final Memory: 78M/392M
[INFO] ------------------------------------------------------------------------
构建完成会多出一个target,在源码中是没有这个target
[root@k8s-master simple-microservice-dev1]# ls basic-common eureka-service LICENSE order-service portal-service README.md db gateway-service lombok.config pom.xml product-service stock-service [root@k8s-master simple-microservice-dev1]# ls gateway-service/ pom.xml src target
order-service-api:是相关调用; order-service-biz:具体是咱们部署的
这几个里面都有
[root@k8s-master simple-microservice-dev1]# ls order-service/ order-service-api order-service-biz pom.xml [root@k8s-master simple-microservice-dev1]# ls product-service/ pom.xml product-service-api product-service-biz [root@k8s-master simple-microservice-dev1]# ls stock-service/ pom.xml stock-service-api stock-service-biz
查看order-service/order-service-biz/里面有这个target;
[root@k8s-master simple-microservice-dev1]# ls pom.xml src target
target里面有一个jar包,这个就是咱们部署的包,打包到镜像中部署到k8s中,其余目录页同样都这个jar包,传统项目也会生成target,目录下有可部署的jar包
[root@k8s-master simple-microservice-dev1]# ls order-service/order-service-biz/target/ classes maven-archiver order-service-biz.jar generated-sources maven-status order-service-biz.jar.original
2、构建项目镜像并推送到镜像仓库
构建镜像使用Docker和结合Dockerfile
镜像三类:
一、基础镜像,基本操做系统
二、运行环境,java就会有tomcat
三、项目镜像,应用程序和应用程序环境,最终的镜像,部署到任何docker上或者K8s中
将咱们构建完的jar包,打包到镜像中
将咱们的Dockerfile放入dev1分支中,这个我没放Dockerfile,如今把dev2分支的拿过来
[root@k8s-master ~]# cd simple-microservice-dev1 [root@k8s-master simple-microservice-dev1]# cd gateway-service/ [root@k8s-master gateway-service]# cp /root/simple-microservice-dev2/gateway-service/Dockerfile ./ [root@k8s-master gateway-service]# ls Dockerfile pom.xml src target
Dockerfile声明:
java:8-jdk-alpine:这里使用的是一个alpine的小Linux命令操做系统的镜像,大约300条命令,以便测试构建用
apk add -U tzdata:这是一个时区,默认jdk中没有时区,而后经过软链接,放到系统里面
./target/gateway-service.jar ./:拷贝dev1咱们分支下target/gateway-service.jar包放到根目录下
EXPOSE 9999:暴露端口:9999
CMD java -jar /gateway-service.jar:启动镜像
[root@k8s-master gateway-service]# vim Dockerfile FROM java:8-jdk-alpine LABEL maintainer xxx/www.ctnrs.com RUN apk add -U tzdata && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime COPY ./target/gateway-service.jar ./ EXPOSE 9999 CMD java -jar /gateway-service.jar
使用docker命令构建镜像:安装docker,这里不作演示了[root@k8s-master gateway-service]# docker build -t gateway .
查看咱们构建的镜像
[root@k8s-master gateway-service]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE gateway latest c9429e09fe42 34 seconds ago 191MB java 8-jdk-alpine 3fd9dd82815c 2 years ago 145MB
而后开始将咱们构建好的镜像推送到咱们的镜像仓库,这里我用的是Harbor,安装步骤这里不演示了
建立一个microservice的项目名称
打个标签,安装上面的格式,把咱们的gateway打个标签[root@k8s-master gateway-service]# docker tag gateway 192.168.30.24/microservice/gateway:latest
若是不是https的Harbor须要在docker里面添加信任才能访问到镜像
[root@k8s-master ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["http://f1361db2.m.daocloud.io"], "insecure-registries": ["192.168.30.24"] }
测试登陆,由于我在页面上登陆了,全部显示已经登陆了
[root@k8s-master ~]# docker login 192.168.30.24 Username: admin Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
推送镜像到Harbor仓库中
[root@k8s-master ~]# docker push 192.168.30.24/microservice/gateway:latest The push refers to repository [192.168.30.24/microservice/gateway] 6912928d45d8: Pushed e7917d042778: Pushed a1e7033f082e: Pushed 78075328e0da: Pushed 9f8566ee5135: Pushed latest: digest:
查看咱们的Harbor仓库已经上传成功
接下来就是部署k8s,而后将spring cloud放入咱们k8s中
这里须要注意的是,用二进制或者kubeadm均可以
K8s平台环境的要求以下:
跨主机网络:使用flannel或者Calico ,须要网络来打通主机之间资源的通讯
CoreDNS: k8s内部的DNS ,用于对pod对service作记录的,好让其余的pod作访问
Harbor镜像仓库:这个咱们已经准备好了,并将项目镜像推送上去了
Ingress Controller:同一暴露咱们的应用,写yaml文件实现
K8s部署这里不作演示了,flannel也已经部署好了,k8s-master节点部署coredns和ingress-nginx 也部署好了
这里portal门户网站,前端,用户访问www.baidu.com的页面,经过域名访问以后,进行的一个页面展现,咱们咱们经过pod来进行实现,拿ingress来定义咱们的域名,域名定义哪一个service,来定义到某个pod上,来影响静态页面,下订单请求交给网关api,采用异步调用,
暴露网关,进行来用户访问,ingress也来调用,来service来实现pod副本
gateway网关,经过一些前端页面的页面功能,同gateway来调用实现,用户点击某个功能gateway拿到这个请求以后,经过路由转发规则,到后端的业务程序,好比商品信息(product)
库存,订单,他会根据不一样的业务须要来处理,库存服务会根据订单的使用来和内部的调用接口来实现,pod直接调用,须要跨主机网络,怎么找到这个服务,就须要这个注册中心,谁找谁就须要这个注册中心,全部的服务都会放在这里,来进行消息通讯,如今比较流行的就是erueka,订单服务都会放入到咱们的mysql数据库中的,mysql是部署在外部的,有状态的,这个部署在k8s中是比较麻烦大的,erueka是部署在k8s集群内的,只须要保证他的id是惟一性就能够了,不须要考虑他的存储。
3、spring cloud部署到k8s集群中
一、服务编排
二、在k8s平台部署Erueka
三、导入数据库文件到Mysql
四、部署网关gateway
五、部署业务程序(product、stock、order)
六、部署前端(portal)
编译打成jar包,在dev3分支
建立命名空间
kubectl create ns ms [root@k8s-master simple-microservice-dev3]# mvn clean package -D maven.test.skip=true
[INFO] --- spring-boot-maven-plugin:2.0.9.RELEASE:repackage (default) @ portal-service ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] simple-microservice ............................... SUCCESS [0.732s]
[INFO] basic-common ...................................... SUCCESS [0.002s]
[INFO] basic-common-core ................................. SUCCESS [41.516s]
[INFO] gateway-service ................................... SUCCESS [34.127s]
[INFO] eureka-service .................................... SUCCESS [8.062s]
[INFO] product-service ................................... SUCCESS [0.001s]
[INFO] product-service-api ............................... SUCCESS [3.029s]
[INFO] stock-service ..................................... SUCCESS [0.001s]
[INFO] stock-service-api ................................. SUCCESS [0.371s]
[INFO] product-service-biz ............................... SUCCESS [6.170s]
[INFO] stock-service-biz ................................. SUCCESS [10.095s]
[INFO] order-service ..................................... SUCCESS [0.002s]
[INFO] order-service-api ................................. SUCCESS [0.372s]
[INFO] order-service-biz ................................. SUCCESS [4.396s]
[INFO] basic-common-bom .................................. SUCCESS [0.001s]
[INFO] portal-service .................................... SUCCESS [4.379s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2:05.137s
[INFO] Finished at: Wed Aug 07 13:38:55 CST 2019
[INFO] Final Memory: 70M/391M
[INFO] ------------------------------------------------------------------------
查看生成的jar包
[root@k8s-master simple-microservice-dev3]# cd eureka-service/ [root@k8s-master eureka-service]# ls Dockerfile pom.xml src target [root@k8s-master eureka-service]# cd target/ [root@k8s-master target]# ls classes eureka-service.jar.original maven-archiver eureka-service.jar generated-sources maven-status [root@k8s-master eureka-service]# ls Dockerfile pom.xml src target
查看dockerfile
[root@k8s-master eureka-service]# cat Dockerfile FROM java:8-jdk-alpine LABEL maintainer lizhenliang/www.ctnrs.com RUN apk add -U tzdata && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime COPY ./target/eureka-service.jar ./ EXPOSE 8888 CMD java -jar -Deureka.instance.hostname=${MY_POD_NAME}.eureka.ms /eureka-service.jar
构建镜像
[root@k8s-master eureka-service]# docker build -t eureka . [root@k8s-master eureka-service]# docker tag eureka 192.168.30.24/microservice/eureka:latest 上传到咱们的harbor上 [root@k8s-master eureka-service]# docker push 192.168.30.24/microservice/eureka:latest The push refers to repository [192.168.30.24/microservice/eureka] d0a47606affb: Layer already exists d37aee246f9e: Layer already exists a1e7033f082e: Layer already exists 78075328e0da: Layer already exists 9f8566ee5135: Layer already exists
修改咱们的euerka的yaml,这样他就能调用咱们的eureka.yaml的标签了
[root@k8s-master ~]# vim simple-microservice-dev3/k8s/eureka.yaml spec: imagePullSecrets: - name: registry-pull-secret containers: - name: eureka image: 192.168.30.24/microservice/eureka:latest ports: [root@k8s-master ~]# cd simple-microservice-dev3 [root@k8s-master simple-microservice-dev3]# cd k8s/
建立k8s登陆harbor信息认证[root@k8s-master k8s]# kubectl create secret docker-registry registry-pull-secret --docker-server=192.168.30.24 --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@ctnrs.com -n ms
修改register-with-eureka: true为true
[root@k8s-master resources]# vim application-fat.yml register-with-eureka: true serviceUrl: defaultZone: http://eureka-0.eureka.ms:${server.port}/eureka/,http://eureka-1.eureka.ms:${server.port}/eureka/,http://eureka-2.eureka.ms:${server.port}/eureka/ fetch-registry: true
建立eurekayaml
[root@k8s-master k8s]# kubectl create -f eureka.yaml ingress.extensions/eureka created service/eureka created statefulset.apps/eureka created
查看详细信息,这里有可能会报错,kubelet node节点登陆harbor须要认证这里在daemon.json里面写进去就能够了
查看日志信息
[root@k8s-master k8s]# kubectl describe pod eureka-0 -n ms
查看状态
[root@k8s-master k8s]# kubectl get pod eureka-0 -n ms NAME READY STATUS RESTARTS AGE eureka-0 1/1 Running 1 4m18s [root@k8s-master ~]# kubectl get pod,svc,ing -n ms NAME READY STATUS RESTARTS AGE pod/eureka-0 1/1 Running 1 16h pod/eureka-1 1/1 Running 0 16h pod/eureka-2 1/1 Running 1 16h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/eureka ClusterIP None <none> 8888/TCP 16h NAME HOSTS ADDRESS PORTS AGE ingress.extensions/eureka eureka.ctnrs.com 80 16h
将域名写入本机windows的hosts文件里面进行ingress的访问
一、打开路径C:\Windows\System32\drivers\etc。
二、将hosts文件拖拽到桌面上。
三、以笔记本程序打开,完成修改后保存。
四、修改完成后从新拖回etc目录下完成修改。
192.168.30.23 eureka.ctnrs.com portal.ctnrs.com gateway.ctnrs.com
这里确保ingress和coredns集群状态正常,当咱们去访问eureka.ctnrs.com的时候就能够正常访问的咱们的页面,按F5刷新就能够切换不一样的节点上
而后说一下用云服务器或者服务器来怎么设置域名访问
这里也是同样,注意的是写外网ip,这是访问外部的
导入数据库到Mysql
[root@k8s-master1 ~]# cd simple-microservice-dev3 [root@k8s-master1 simple-microservice-dev3]# ls basic-common gateway-service lombok.config portal-service stock-service db k8s order-service product-service eureka-service LICENSE pom.xml README.md [root@k8s-master1 simple-microservice-dev3]# cd db/ [root@k8s-master1 db]# ls order.sql product.sql stock.sql [root@k8s-master1 db]# scp * root@192.168.30.24:~
这里我安装了一个mariadb的实例进行测试
[root@harbor-mysql ~]# yum install mariadb mariadb-server mariadb-devel [root@harbor-mysql ~]# systemctl start mariadb [root@harbor-mysql ~]# netstat -anpt |grep 3306 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 6226/mysqld
修改mariadb的密码,默认没有密码
[root@harbor-mysql ~]# mysql -u root -p MariaDB [(none)]> set password for root@localhost = password('666666'); MariaDB [(none)]> flush privileges;
建立数据库
MariaDB [(none)]> create database tb_order; MariaDB [(none)]> create database tb_product; MariaDB [(none)]> create database tb_stock;
进入order数据库,把咱们根目录下的sql语句导入咱们的数据库中
MariaDB [(none)]> use tb_order; MariaDB [tb_order]> source /root/order.sql;
进入product数据库,把咱们根目录下的sql语句导入咱们的数据库中
MariaDB [tb_order]> use tb_product ; MariaDB [tb_product]> source /root/product.sql
进入stock数据库,把咱们根目录下的sql语句导入咱们的数据库中
MariaDB [tb_product]> use tb_stock ; Database changed MariaDB [tb_stock]> source /root/stock.sql; MariaDB [tb_stock]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | tb_order | | tb_product | | tb_stock | | test | +--------------------+ 7 rows in set (0.00 sec)
部署网关gateway
[root@k8s-master1 ~]# cd simple-microservice-dev3 [root@k8s-master1 simple-microservice-dev3]# cd k8s/ [root@k8s-master1 k8s]# ls docker_build.sh eureka.yaml gateway.yaml order.yaml portal.yaml product.yaml stock.yaml [root@k8s-master1 k8s]# vim docker_build.sh #!/bin/bash docker_registry=192.168.30.24 kubectl create secret docker-registry registry-pull-secret --docker-server=$docker_registry --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@ctnrs.com -n ms service_list="eureka-service gateway-service order-service product-service stock-service portal-service" service_list=${1:-${service_list}} work_dir=$(dirname $PWD) current_dir=$PWD cd $work_dir mvn clean package -Dmaven.test.skip=true for service in $service_list; do cd $work_dir/$service if ls |grep biz &>/dev/null; then cd ${service}-biz fi service=${service%-*} image_name=$docker_registry/microservice/${service}:$(date +%F-%H-%M-%S) docker build -t ${image_name} . docker push ${image_name} sed -i -r "s#(image: )(.*)#\1$image_name#" ${current_dir}/${service}.yaml kubectl apply -f ${current_dir}/${service}.yaml Done
[root@k8s-master1 k8s]# ./docker_build.sh gateway-service [root@k8s-master1 k8s]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.30.24/microservice/gateway 2019-08-10-14-54-28 395e59fcaf17 4 minutes ago 191MB 192.168.30.24/microservice/eureka latest 72d2811b9d61 3 hours ago 194MB eureka latest 72d2811b9d61 3 hours ago 194MB 192.168.30.24/microservice/gateway latest e7af6a3ae487 27 hours ago 191MB gateway latest e7af6a3ae487 27 hours ago 191MB java 8-jdk-alpine 3fd9dd82815c 2 years ago
[root@k8s-master1 ~]# kubectl get pod -n ms NAME READY STATUS RESTARTS AGE eureka-0 1/1 Running 1 114m eureka-1 1/1 Running 1 113m eureka-2 1/1 Running 1 112m gateway-59f86bfffb-7lglm 1/1 Running 0 5m50s gateway-59f86bfffb-s4qzl 1/1 Running 0 5m50s [root@k8s-master1 ~]# kubectl get pod,svc,ing -n ms NAME READY STATUS RESTARTS AGE pod/eureka-0 1/1 Running 1 115m pod/eureka-1 1/1 Running 1 114m pod/eureka-2 1/1 Running 1 113m pod/gateway-59f86bfffb-7lglm 1/1 Running 0 6m19s pod/gateway-59f86bfffb-s4qzl 1/1 Running 0 6m19s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/eureka ClusterIP None <none> 8888/TCP 115m service/gateway ClusterIP 10.0.0.3 <none> 9999/TCP 6m20s NAME HOSTS ADDRESS PORTS AGE ingress.extensions/eureka eureka.ctnrs.com 80 115m ingress.extensions/gateway gateway.ctnrs.com 80 6m20s
查看咱们的eureka的注册中心,已经把gateway注册进来了
部署微服务业务程序与前端
对咱们的脚本的mvn注释,咱们这里不须要构建了
后端的服务咱们只须要部署deployment就能够
[root@k8s-master1 k8s]# ./docker_build.sh product-service [root@k8s-master1 k8s]# kubectl get pods -n ms NAME READY STATUS RESTARTS AGE eureka-0 1/1 Running 1 137m eureka-1 1/1 Running 1 136m eureka-2 1/1 Running 1 135m gateway-59f86bfffb-7lglm 1/1 Running 0 28m gateway-59f86bfffb-s4qzl 1/1 Running 0 28m product-7fcd7646d-kpfxm 1/1 Running 0 87s product-7fcd7646d-lgfzq 1/1 Running 0 87s product也部署成功了
[root@k8s-master1 k8s]# ./docker_build.sh stock-service [root@k8s-master1 k8s]# ./docker_build.sh order-service [root@k8s-master k8s]# ./docker_build.sh portal-service
查看咱们的微服务正常运行,这个根据本身的业务量启动副本数
[root@k8s-master k8s]# kubectl get pod,svc,ing -n ms NAME READY STATUS RESTARTS AGE pod/eureka-0 1/1 Running 7 56m pod/eureka-1 1/1 Running 5 55m pod/eureka-2 1/1 Running 7 54m pod/gateway-8b67dc9d4-8g2s9 1/1 Running 1 38m pod/gateway-8b67dc9d4-d6996 1/1 Running 1 38m pod/order-89f7bd55b-6t7wf 1/1 Running 1 12m pod/order-89f7bd55b-n74cv 1/1 Running 0 12m pod/portal-5f6d96ffdd-2smtj 1/1 Running 0 3m33s pod/portal-5f6d96ffdd-s7wf9 1/1 Running 0 3m33s pod/product-65d9bb865-9h7z7 1/1 Running 1 20m pod/product-65d9bb865-khvjp 1/1 Running 0 20m pod/stock-cb7fd87b5-6bqfp 1/1 Running 1 14m pod/stock-cb7fd87b5-7mbg9 1/1 Running 2 14m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/eureka ClusterIP None <none> 8888/TCP 56m service/gateway ClusterIP 10.0.0.74 <none> 9999/TCP 38m service/portal ClusterIP 10.0.0.62 <none> 8080/TCP 3m33s NAME HOSTS ADDRESS PORTS AGE ingress.extensions/eureka eureka.ctnrs.com 80 56m ingress.extensions/gateway gateway.ctnrs.com 80 38m ingress.extensions/portal portal.ctnrs.com 80 3m33s
访问portal.ctnrs.com