k8s 部署spring cloud项目

2023-11-16

微服务架构是一项在云中部署应用和服务的新技术。大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务,而红帽说API应该是重点。

微服务可以在"自己的程序"中运行,并通过"轻量级设备与HTTP型API进行沟通"。关键在于该服务可以在自己的程序中运行。通过这一点我们就可以将服务公开与微服务架构(在现有系统中分布一个API)区分开来。在服务公开中,许多服务都可以被内部独立进程所限制。如果其中任何一个服务需要增加某种功能,那么就必须缩小进程范围。在微服务架构中,只需要在特定的某种服务中增加所需功能,而不影响整体进程的架构。
微服务是什么?

微服务是一种软件设计风格,开发人员在开发项目时,是一种微服务这种标准去设计的,这种的设计风格是一种将单体的应用,拆分为多个小的组件去开发,那每个组件是独立的部署,独立的测试,服务之间采用轻量级的通信

微服务的特点

服务的组件化

每个服务独立开发、部署、有效避免一个服务的修改引起整个系统重新部署。

技术栈灵活

约定通信方式,使得服务本身功能实现对技术要求不再那么敏感,可以根据不停语言进行开发

独立部署

每个微服务独立部署,加快部署速度,方便扩展,比起单体应用来讲要小,轻量级的,方便快速部署,扩展

扩展性强

每个微服务可以部署多个,没有多少依赖,并且有负载均衡能力,比如一个服务部署一个副本或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 最终上线

一、代码编译构建(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

二、构建项目镜像并推送到镜像仓库
构建镜像使用Docker和结合Dockerfile

镜像三类:
1、基础镜像,基本操作系统
2、运行环境,java就会有tomcat
3、项目镜像,应用程序和应用程序环境,最终的镜像,部署到任何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是唯一性就可以了,不需要考虑他的存储。

三、spring cloud部署到k8s集群中
1、服务编排
2、在k8s平台部署Erueka
3、导入数据库文件到Mysql
4、部署网关gateway
5、部署业务程序(product、stock、order)
6、部署前端(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的访问
1、打开路径C:\Windows\System32\drivers\etc。
2、将hosts文件拖拽到桌面上。

3、以笔记本程序打开,完成修改后保存。
4、修改完成后重新拖回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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s 部署spring cloud项目 的相关文章

  • Eclipse 在源代码管理中保存操作

    我们希望找到一种在签入之前执行代码标准的 轻量级 方法 我们真的很喜欢使用 Eclipse 内置的想法保存操作 go to Preferences gt gt Java gt gt Editor gt gt Save Actions 其中有
  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • 如何创建一个显示 Spinners 的 x 和 y 值的表格?

    我想创建一个位于图表右侧的表格 其中显示 2 列 x 和 y 值已输入到xSpin and ySpin旋转器 我已经画了一张我想要桌子放置的位置的图 我尝试过在网格窗格布局中使用文本框来创建表格并将值直接输入到文本框网格中 但是我无法将它们
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • Java:迭代 Collection 的最佳方法(此处为 ArrayList)

    今天 当我看到一段我已经使用了数百次的代码时 我很高兴地开始编码 迭代集合 此处为 ArrayList 出于某种原因 我实际上查看了 Eclipse 的自动完成选项 这让我想知道 在什么情况下以下循环比其他循环更好使用 经典的数组索引循环
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • JavaFX 中具有自定义内容的 ListView

    How i can make custom ListView with JavaFx for my app I need HBox with image and 2 Labels for each line listView 您可以通过查看
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • 在 S3 中迭代对象时出现“ConnectionPoolTimeoutException”

    我已经使用 aws java API 一段时间了 没有遇到太多问题 目前我使用的是库 1 5 2 版本 当我使用以下代码迭代文件夹内的对象时 AmazonS3 s3 new AmazonS3Client new PropertiesCred
  • 在 Netbeans 8 上配置 JBoss EAP 的问题

    我已经下载了 JBoss EAP 7 并正在 Netbeans 8 上配置它 我已经到达向导 实例属性 其中要求从选择框中选择 域 当我打开选择框时 它是空的 没有什么可以选择的 因此 完成 按钮也处于非活动状态 这使得无法完成配置 我通过
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF
  • 如何在selenium服务器上提供自定义功能?

    我知道可以通过某种方法获得一些硒功能 其中之一如下 driver getCapabilities getBrowserName 它返回浏览器名称的值 但如果它指的是一个可用的方法 如果我没有误解的话 这似乎与自定义功能有关 就像我的意思是
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • 欧洲中部时间 14 日 3 月 30 日星期五 00:00:00 至 日/月/年

    我尝试解析格式日期Fri Mar 30 00 00 00 CET 14至 日 月 年 这是我的代码 SimpleDateFormat formatter new SimpleDateFormat dd MM yyyy System out
  • 在 Spring 中重构这个的最佳方法?

    private final ExecutorService executorParsers Executors newFixedThreadPool 10 public void parse List
  • Cucumber Java 与 Spring Boot 集成 - Spring @Autowired 抛出 NullPointer 异常

    我正在为 Spring boot 应用程序编写 cucumber java 单元测试来测试每个功能 当我与 Spring Boot 集成时 Autowired 类抛出 NullPointer 异常 Spring Boot应用程序类 Spri
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树
  • ServletContainer 类未找到异常

    我无法再编译我的球衣项目 并且出现以下异常 GRAVE Servlet Project API threw load exception java lang ClassNotFoundException com sun jersey spi
  • 如何从 Maven 存储库引用本机 DLL?

    如果 JAR 附带 Maven 存储库中的本机 DLL 我需要在 pom xml 中放入什么才能将该 DLL 放入打包中 更具体地举个例子Jacob http search maven org artifactdetails 7Cnet s
  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个

随机推荐

  • 2 拉普拉斯分布

    2 拉普拉斯分布 一元拉普拉斯分布的密度函数为 p x 1 2
  • 2022-2023 计算机视觉顶会截止时间

    2022 2023计算机视觉会议截止时间 参考网页 Docs 网页中内容如下 Level Conference Name Conference Location Submission Deadline Conference Date Web
  • 第三周作业

    1 图文并茂说明raid0 raid1 raid10 raid01 raid5等原理 RAID 0 以chunk为单位并行读写数据 速度非常快 但是没有冗余容错能力 如果一块硬盘损坏的话 会导致所有数据的丢失 最少磁盘数 1 RAID 1
  • vector模板类的简单实现 C++

    学了模板类那一节 所以动手自己用C 简单实现了一下 vector 的几个简单函数 直接上代码吧 include
  • JVM内存溢出与内存泄露

    1 什么是内存溢出 当前创建的对象的大小大于可用的内存容量大小 发生内存溢出 2 什么是内存泄露 该回收的垃圾对象没有被回收 发生了内存泄露 垃圾对象越堆越多 可用内存越来越少 若可用内存无法存放新的垃圾对象 就导致内存溢出 内存泄露会导致
  • 华为云云耀云服务器L实例评测|redis漏洞回顾 & MySQL数据安全解决 搭建主从集群MySQL & 相关设置

    前言 最近华为云云耀云服务器L实例上新 也搞了一台来玩 期间遇到过MySQL数据库被攻击的情况 数据丢失 还好我有几份备份 没有造成太大的损失 后来有发现Redis数据库被攻击的情况 加入了redis密码初步解决问题 总之就是各种遭受毒打
  • 2023年网络与信息安全国际会议(NISecurity 2023)

    会议简介 Brief Introduction 2023年网络与信息安全国际会议 NISecurity 2023 会议时间 2023年10月13日 15日 召开地点 中国 杭州 大会官网 www nisecurity org 2023年网络
  • python之selenium-web自动化<一>

    python之web自动化 二 戳这里 一图了解整个代码驱动浏览器的过程 前提 Chrome浏览器驱动下载地址 http chromedriver storage googleapis com index html Firefox 火狐 浏
  • 【vscode单位转换】px、rem、rpx相互转换工具

    文章目录 一 px rem px rem rem px 我失效了 写个新的 二 px rpx 三 rpx px 重点 四 新 px rem px rem rem px 记录学习的轨迹 2022 06 20 之前写在wiki里 移植记录 具体
  • global lib dirs 在设置多个编译器时仍旧使用旧的编译器路径

    BB的地方 以前自己用arm linux gnueabihf的5 4 1的版本编译测试了虚拟键盘 全部都没有问题 突然呢 说不行 就要用厂家给的arm realarm的5 5版本 原本Qt用5 13 0 那不行 要用13 2的 那拜托你之前
  • springboot项目制作docker镜像,如何动态传递变量值?

    springboot项目制作成docker镜像后 如何给properties文件的变量动态传递值呢 步骤1 将properties文件设置为如下形式 serverUrl SERVER URL apiKey API KEY 步骤2 制作成do
  • 如何重启mysql服务?

    Mysql在修改my ini文件后 如修改字符集 需要重启服务才能生效 下面介绍如何重启mysql服务 1 Win R 输入cmd 确定后进入命令窗口 输入命令net stop mysql 停止当前mysql服务 2 如果出现如图所示错误
  • JAVA 获取指定月份的每周的开始日期和结束日期

    1 第一种情况 从1号开始到月份最后一天结束 代码如下 private DateTimeFormatter dateTimeFormatter DateTimeFormatter ofPattern yyyy MM dd public Li
  • Arduino和Python卡尔曼滤波对四元数进行姿态测定

    在本文中 我将演示使用EKF 扩展卡尔曼滤波 对四元数确定姿态的实现 并说明将多个传感器数据融合在一起以使系统正常工作的必要性 将要使用的传感器是陀螺仪 加速度计和磁力计 Arduino用于从传感器读取数据 但是数据处理将在python中完
  • 移动端开发框架

    总体概述 现在比较流行的移动APP开发框架有以下六种 网页 混合 渐进 原生 桥接 自绘 前三种体验与Web的体验相似 后三种与原生APP的体验相似 这六种框架形式 都有自己适用的范围 无所谓好坏 适用就是好 网页应用适用于传统网站APP化
  • 手写vue(三)模板渲染解析

    一 目标 创建一个Vue实例时 我们可以传入el配置项 去指定一个DOM元素作为Vue容器 而这个Vue容器中 可以使用例如插值表达式等Vue框架提供的语法 并且能够渲染到浏览器页面上 而浏览器并不能解析这些Vue语法 因此 Vue框架是通
  • python: How to Create a Python Package

    StudentScoreInfo py 学生成绩类 date 2023 06 16 edit Geovin Du geovindu 涂聚文 ide PyCharm 2023 1 python 11 import datetime impor
  • GAN生成手写数字实例讲解Colab使用教程

    Colab 全称Colaboratory 是谷歌提供的一个在线工作平台 可以与谷歌云盘协作使用 我们可以在Colab平台上运行代码 而且大部分常用的包都已经安装好 不需要再进行安装 也不需要进行环境配置 非常方便快捷 对于初学者来说非常友好
  • 颠覆传统逻辑的C程序

    1 在main之前运行的C代码 before main c include
  • k8s 部署spring cloud项目

    微服务架构是一项在云中部署应用和服务的新技术 大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务 而红帽说API应该是重点 微服务可以在 自己的程序 中运行 并通过 轻量级设备与HTTP型API进行沟通 关键在于该服务可以在