k8s 部署spring cloud项目

微服务架构是一项在云中部署应用和服务的新技术。大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务,而红帽说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
  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
微服务是什么?微服务是用于构建应用程序的架构风格,一个大的系统可由一个或者多个微服务组成,微服务架构可将应用拆分成多个核心功能,每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作和出现故障的时候不会相互影响。为什么要用微服务?单体架构下的所有代码模块都耦合在一起,代码量大,维护困难,想要更新一个模块的代码,也可能会影响其他模块,不能很好的定制化代码。微服务中可以有java编写、有Python编写的,他们都是靠restful架构风格统一成一个系统的,所以微服务本身与具体技术无关、扩展性强。大型电商平台微服务功能图为什么要将SpringCloud项目部署k8s平台?SpringCloud只能用在SpringBoot的java环境中,而kubernetes可以适用于任何开发语言,只要能被放进docker的应用,都可以在kubernetes上运行,而且更轻量,更简单。SpringCloud很多功能都跟kubernetes重合,比如服务发现,负载均衡,配置管理,所以如果把SpringCloud部署k8s,那么很多功能可以直接使用k8s原生的,减少复杂度。Kubernetes作为成熟的容器编排工具,在国内外很多公司、世界500强等企业已经落地使用,很多中小型公司也开始把业务迁移到kubernetes中。kubernetes已经成为互联网行业急需的人才,很多企业都开始引进kubernetes技术人员,实现其内部的自动化容器云平台的建设。对于开发、测试、运维、架构师等技术人员来说k8s已经成为的一项重要的技能,下面列举了国内外在生产环境使用kubernetes的公司: 国内在用k8s的公司:阿里巴巴、百度、腾讯、京东、360、新浪、头条、知乎、华为、小米、富士康、移动、银行、电网、阿里云、青云、时速云、腾讯、优酷、抖音、快手、美团等国外在用k8s的公司:谷歌、IBM、丰田、iphone、微软、redhat等整个K8S体系涉及到的技术众多,包括存储、网络、安全、监控、日志、DevOps、微服务等,很多刚接触K8S的初学者,都会感到无从下手,为了能让大家系统地学习,克服这些技术难点,推出了这套K8S架构师课程。Kubernetes的发展前景 kubernetes作为炙手可热的技术,已经成为云计算领域获取高薪要掌握的重要技能,在招聘网站搜索k8s,薪资水平也非常可观,为了让大家能够了解k8s目前的薪资分布情况,下面列举一些K8S的招聘截图: 讲师介绍:  先超容器云架构师、IT技术架构师、DevOps工程师,曾就职于世界500强上市公司,拥有多年一线运维经验,主导过上亿流量的pv项目的架构设计和运维工作;具有丰富的在线教育经验,对课程一直在改进和提高、不断的更新和完善、开发更多的企业实战项目。所教学员遍布京东、阿里、百度、电网等大型企业和上市公司。课程学习计划 学习方式:视频录播+视频回放+全套源码笔记 教学服务:模拟面试、就业指导、岗位内推、一对一答疑、远程指导 VIP终身服务:一次购买,终身学习课程亮点:1. 学习方式灵活,不占用工作时间:可在电脑、手机观看,随时可以学习,不占用上班时间2.老师答疑及时:老师24小时在线答疑3. 知识点覆盖全、课程质量高4. 精益求精、不断改进根据学员要求、随时更新课程内容5. 适合范围广,不管你是0基础,还是拥有工作经验均可学习:0基础1-3年工作经验3-5年工作经验5年以上工作经验运维、开发、测试、产品、前端、架构师其他行业转行做技术人员均可学习课程部分项目截图   课程大纲 k8s+SpringCloud全栈技术:基于世界500强的企业实战课程-大纲第一章 开班仪式老师自我介绍、课程大纲介绍、行业背景、发展趋势、市场行情、课程优势、薪资水平、给大家的职业规划、课程学习计划、岗位内推第二章 kubernetes介绍Kubernetes简介kubernetes起源和发展kubernetes优点kubernetes功能kubernetes应用领域:在大数据、5G、区块链、DevOps、AI等领域的应用第三章  kubernetes中的资源对象最小调度单元Pod标签Label和标签选择器控制器Replicaset、Deployment、Statefulset、Daemonset等四层负载均衡器Service第四章 kubernetes架构和组件熟悉谷歌的Borg架构kubernetes单master节点架构kubernetes多master节点高可用架构kubernetes多层架构设计原理kubernetes API介绍master(控制)节点组件:apiserver、scheduler、controller-manager、etcdnode(工作)节点组件:kube-proxy、coredns、calico附加组件:prometheus、dashboard、metrics-server、efk、HPA、VPA、Descheduler、Flannel、cAdvisor、Ingress     Controller。第五章 部署多master节点的K8S高可用集群(kubeadm)第六章 带你体验kubernetes可视化界面dashboard在kubernetes部署dashboard通过token令牌登陆dashboard通过kubeconfig登陆dashboard限制dashboard的用户权限在dashboard界面部署Web服务在dashboard界面部署redis服务第七章 资源清单YAML文件编写技巧编写YAML文件常用字段,YAML文件编写技巧,kubectl explain查看帮助命令,手把手教你创建一个Pod的YAML文件第八章 通过资源清单YAML文件部署tomcat站点编写tomcat的资源清单YAML文件、创建service发布应用、通过HTTP、HTTPS访问tomcat第九章  kubernetes Ingress发布服务Ingress和Ingress Controller概述Ingress和Servcie关系安装Nginx Ingress Controller安装Traefik Ingress Controller使用Ingress发布k8s服务Ingress代理HTTP/HTTPS服务Ingress实现应用的灰度发布-可按百分比、按流量分发第十章 私有镜像仓库Harbor安装和配置Harbor简介安装HarborHarbor UI界面使用上传镜像到Harbor仓库从Harbor仓库下载镜像第十一章 微服务概述什么是微服务?为什么要用微服务微服务的特性什么样的项目适合微服务?使用微服务需要考虑的问题常见的微服务框架常见的微服务框架对比分析第十二章 SpringCloud概述SpringCloud是什么?SpringCloudSpringBoot什么关系?SpringCloud微服务框架的优缺点SpringCloud项目部署k8s的流程第十三章 SpringCloud组件介绍服务注册与发现组件Eureka客户端负载均衡组件Ribbon服务网关Zuul熔断器HystrixAPI网关SpringCloud Gateway配置中心SpringCloud Config第十四章 将SpringCloud项目部署k8s平台的注意事项如何进行服务发现?如何进行配置管理?如何进行负载均衡?如何对外发布服务?k8s部署SpringCloud项目的整体流程第十五章 部署MySQL数据库MySQL简介MySQL特点安装部署MySQL在MySQL数据库导入数据对MySQL数据库授权第十六章 将SpringCLoud项目部署k8s平台SpringCloud微服务电商框架安装openjdk和maven修改源代码、更改数据库连接地址通过Maven编译、构建、打包源代码在k8s部署Eureka组件在k8s部署Gateway组件在k8s部署前端服务在k8s部署订单服务在k8s部署产品服务在k8s部署库存服务第十七章 微服务的扩容和缩容第十八章 微服务的全链路监控什么是全链路监控?为什么要进行全链路监控?全链路监控能解决哪些问题?常见的全链路监控工具:zipkin、skywalking、pinpoint全链路监控工具对比分析第十九章 部署pinpoint服务部署pinpoint部署pinpoint agent在k8s中重新部署带pinpoint agent的产品服务在k8s中重新部署带pinpoint agent的订单服务在k8s中重新部署带pinpoint agent的库存服务在k8s中重新部署带pinpoint agent的前端服务在k8s中重新部署带pinpoint agent的网关和eureka服务Pinpoint UI界面使用第二十章 基于Jenkins+k8s+harbor等构建企业级DevOps平台第二十一章 基于Promethues+Alert+Grafana搭建企业级监控系统第二十二章 部署智能化日志收集系统EFK 
### 回答1: 当在 Kubernetes部署 Spring Cloud 项目时,您需要考虑以下几个方面: 1. 容器化应用程序:您需要将 Spring Cloud 项目打包为 Docker 镜像,以便在 Kubernetes 上运行。确保您的应用程序容器化,并将其上传到 Docker 镜像仓库。 2. 部署:您需要使用 Kubernetes 部署资源(如 Deployment、StatefulSet 或 DaemonSet)来部署应用程序。确保您的 Kubernetes 部署资源中包含正确的容器映像和应用程序配置信息。 3. 服务发现和负载均衡:使用 Kubernetes 中的服务资源来公开您的应用程序,并使用 Ingress 控制器实现路由。您可以使用 Spring Cloud Kubernetes 提供的 Kubernetes 服务发现客户端来访问 Kubernetes 服务。 4. 配置管理:使用 Kubernetes ConfigMap 和 Secret 资源管理应用程序配置和密钥。您可以使用 Spring Cloud Kubernetes Config 提供的配置客户端来访问这些配置。 5. 监控和日志记录:在 Kubernetes 上运行 Spring Cloud 项目时,您需要使用 Kubernetes 的监控和日志记录工具来跟踪应用程序的健康状况和行为。您可以使用 Prometheus 和 Grafana 来监控应用程序的度量标准,并使用 Fluentd 或 Elasticsearch 来收集和分析日志数据。 这些是在 Kubernetes部署 Spring Cloud 项目时需要考虑的一些方面。希望对您有所帮助! ### 回答2: K8sKubernetes)是一个可扩展、自动化的容器编排系统,它在部署、扩展、管理和自动化容器化应用程序方面提供了极大的帮助。SpringCloud是一种分布式微服务框架,它为开发者提供了一整套分布式解决方案。在使用K8s部署SpringCloud项目时,我们需要以下步骤: 第一步:准备Docker镜像 我们需要在本地或在线上Docker里制作好我们项目的镜像,镜像可以在代码仓库里面写好镜像构建的步骤,也可以手动制作。如果手动制作,需要在本地安装Docker环境,然后运行Dockerfile进行构建。构建好后,将镜像推送至DockerHub或私有仓库。 第二步:在K8s部署 在使用K8s部署SpringCloud项目之前,需要先安装和配置K8s。然后,我们需要创建一个deployment对象,其中包含了我们的容器镜像信息、副本数、环境变量等信息。例如,我们有四个服务需要部署,可以通过以下方式: ``` apiVersion: apps/v1 kind: Deployment metadata: name: springcloud-deployment spec: selector: matchLabels: app: springcloud replicas: 4 template: metadata: labels: app: springcloud spec: containers: - name: service1 image: your-docker-image1 ports: - containerPort: 8081 - name: service2 image: your-docker-image2 ports: - containerPort: 8082 - name: service3 image: your-docker-image3 ports: - containerPort: 8083 - name: service4 image: your-docker-image4 ports: - containerPort: 8084 ``` 第三步:创建Service对象 Service对象可以将Pod暴露给外部,以便于其他服务或客户端能够访问到。我们可以在创建Service对象时指定LB算法、端口、协议等信息。例如,在上面的deployment所创建的所有Pod中,我们可以创建一个Service对象,将它们对外暴露出来,供其他服务访问。可以通过以下方式创建: ``` apiVersion: v1 kind: Service metadata: name: springcloud-service spec: selector: app: springcloud type: LoadBalancer ports: - protocol: TCP port: 8080 targetPort: 8080 ``` 第四步:准备配置文件 SpringCloud模块中通常会有一些配置文件,例如application.properties,我们可以将它们放置在ConfigMap中,然后再将它们挂载到Pod中。这样一来,我们就可以在不重启Pod的情况下修改配置文件。例如,我们有一个configMap对象,可以通过以下方式创建: ``` apiVersion: v1 kind: ConfigMap metadata: name: springcloud-configmap data: application.properties: | db.url=jdbc:mysql://localhost:3306/mydb db.username=admin db.password=password ``` 第五步:使用Secret管理敏感信息 由于SpringCloud应用程序中通常包含敏感信息,例如数据库密码,我们需要在K8s中使用Secret对象来管理这些信息。我们可以将敏感信息编码后放置在Secret对象中,然后再将它们挂载到Pod中。这样一来,敏感信息就安全地存放在集群中,避免了泄漏。例如,我们有一个Secret对象,可以通过以下方式创建: ``` apiVersion: v1 kind: Secret metadata: name: springcloud-secret data: db.password: YWRtaW4= ``` 总结: 以上是在Kubernetes部署Spring Cloud项目的步骤,K8s能够快速、高效地管理容器。在使用K8s部署应用时,需要按照最佳实践进行设置,以确保应用的正常运行和高可用性。同时,使用K8s还能够大大减少我们在应用部署管理方面的工作量,从而提高我们的工作效率。 ### 回答3: 1. 确认部署环境:k8s集群、Docker镜像仓库、Spring Cloud项目代码库。 2. 构建Docker镜像:将Spring Cloud项目打包成Docker镜像并上传至Docker镜像仓库。可以使用maven插件或Dockerfile来构建镜像。 3. 配置k8s部署文件:在k8s中编写部署文件,包括Deployment、Service和Ingress等资源的配置。Deployment用于定义Pod的副本数和容器镜像等信息,Service用于定义Pod之间的网络互通,Ingress用于定义外部访问路由。 4. 部署Spring Cloud项目:使用kubectl apply命令将部署文件提交至k8s进行部署。可以使用kubectl get命令来查看部署的状态和日志。 5. 配置服务发现与负载均衡:使用k8s的Service对象进行服务发现和负载均衡。可以使用kubectl describe命令来查看Service对象的IP和端口信息。 6. 配置外部访问路由:使用k8s的Ingress对象进行外部访问路由的配置。可以使用kubectl describe命令来查看Ingress对象的IP和端口信息。 7. 监控与日志收集:使用k8s自带的监控工具和日志收集工具进行监控和日志收集。可以使用kubectl logs和kubectl exec命令来查看Pod的日志和进行进程操作。 8. 自动化部署与运维:可以使用持续集成工具如Jenkins和GitLab来实现自动化部署和运维。可以使用k8s的API和命令行工具来进行自动化操作。 总之,利用k8s进行Spring Cloud项目部署可以实现高可用、弹性伸缩、自动化部署等优势。但需要注意的是,k8s部署需要一定的技术水平和实践经验,建议在熟悉k8s之后再进行相关操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值