Ingress 和 Ingress Controller 总结
vim nginx-ingress-controller-rbac.yml
vim default-backend.yaml
注意这里的 nodeName
vim nginx-ingress-controller.yaml
更新文件
kubectl apply -f nginx-ingress-controller-rbac.yml
kubectl apply -f default-backend.yaml
kubectl apply -f nginx-ingress-controller.yaml
kubectl get po -n kube-system
测试 Ingress HTTP 代理 tomcat
vim ingress-demo.yaml
修改物理机本地的 host 文件,增加如下一行,下面的 ip 是 k8s 的 k8s-01 节点 ip
192.168.2.20 tomcat.lucky.com
浏览器访问 tomcat.lucky.com,出现如下:
把上面资源清单文件删除,防止干扰后面的实验
kubectl delete -f ingress-myapp.yaml
测试 Ingress HTTPS 代理 tomcat
1、构建 TLS 站点
(1)准备证书,在控制节点操作
openssl genrsa -out tls.key 2048
openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=tomcat.lucky.com
(2)生成 secret,在控制节点操作
kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key
(3)查看 secret
kubectl get secret
显示如下:
(4)查看 tomcat-ingress-secret 详细信息
kubectl describe secret tomcat-ingress-secret
创建 Ingress
Ingress 规则可以参考官方:
https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
kubectl explain ingress.spec.rules.http.paths.backend.service
vim ingress-tomcat-tls.yaml
安装 harbor 请参考拙作
创建 docker 私有化仓库_高飞的博客-CSDN博客
安装和配置数据存储仓库 MySQL
yum install mysql* -y
yum install mariadb* -y
启动 MySQL
systemctl enable mariadb.service --now
安装成功后,默认的 root 用户密码为空,你可以使用以下命令来创建 root 用户的密码,密码设置成 111111
mysqladmin -u root password "111111"
登陆数据库
mysql -uroot -p111111
创建数据库 tb_order、tb_product、tb_stock
mysql> create database tb_product;
mysql> create database tb_stock;
mysql> create database tb_order;
mysql> use tb_order
mysql> source /root/order.sql
mysql> use tb_stock
mysql> source /root/stock.sql
mysql> use tb_product
mysql> source /root/product.sql
mysql> grant all on *.* to 'root'@'10.244.%.%' identified by '111111';
mysql> grant all on *.* to 'root'@'192.168.%.%' identified by '111111';
mysql> grant all on *.* to 'root'@'%' identified by '111111';
mysql> flush privileges;
mysql> exit
为什么要将 SpringCloud 项目迁移到 K8S 平台?
SpringCloud 只能用在 SpringBoot 的 java 环境中,而 kubernetes 可以适用于任何开发语言,只要能被放进 docker 的应用,都可以在 kubernetes 上运行,而且更轻量,更简单。
每个微服务可以部署多个,没有多少依赖,并且有负载均衡能力,比如一个服务部署一个副本或 5 个副本,通过 k8s 可以更好的去扩展我们的应用。
SpringCloud 很多功能都跟 kubernetes 重合,比如服务发现,负载均衡,配置管理,所以如果把SpringCloud 部署到 k8s,那么很多功能可以直接使用 k8s 原生的,减少复杂度。
SpringCloud 容易上手,是对开发者比较友好的平台;Kubernetes 是可以实现 DevOps 流程的,SpringCloud 和 kubernetes 各有优点,只有结合起来,才能发挥更大的作用,达到最佳的效果。
Xmind
Visio
https://www.processon.com
部署 SpringCloud 框架的电商项目:在线购物平台
安装 openjdk 和 maven
在 k8s 控制节点上操作
yum install java-1.8.0-openjdk maven-3.0.5* -y- 修改源代码,更改数据库连接地址
vim /root/microservic-test/stock-service/stock-service-biz/src/main/resources/application-fat.yml 修改产品服务 product 的数据库连接地址
vim /root/microservic-test/product-service/product-service-biz/src/main/resources/application-fat.yml 修改订单数据库
vim /root/microservic-test/order-service/order-service-biz/src/main/resources/application-fat.yml 通过 Maven 编译、构建、打包源代码
在 k8s 控制节点上操作
修改源代码数据库的地址之后回到/root/microservic-test 目录下执行如下命令:
# cd microservic-test
# mvn clean package -D maven.test.skip=true
清理缓存 /root/.m2/repository
编译完成大概需要 15-20 分钟,看到如下说明编译打包已经成功了:
在 k8s 中部署 Eureka 组件
修改 k8s 的控制节点和工作节点的上的 docker 的配置文件:
cat > /etc/docker/daemon.json <{
"registry-mirrors":["https://hxn0tro1.mirror.aliyuncs.com","https://registry.dockercn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hubmirror.c.163.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"insecure-registries":["192.168.2.50","harbor"]
}
EOF
注意:
daemon.json 中新增加了如下一行内容:
"insecure-registries":["192.168.2.50","harbor"],
这样才可以使用 harbor 私有镜像仓库- 重启 docker 使配置生效
systemctl daemon-reload && systemctl restart docker && systemctl status docker --no-pager创建拉取私有镜像仓库需要的 secret
kubectl create ns ms && kubectl create secret docker-registry registry-pull-secret --docker-server=192.168.2.50 --docker-username=admin --docker-password=Harbor12345 -n ms在 harbor 上创建一个项目 microservice
构建镜像
cd /root/microservic-test/eureka-servicedocker build -t 192.168.2.50/microservice/eureka:v1 .
docker login harbor
docker push 192.168.2.50/microservice/eureka:v12)部署服务
cd /root/microservic-test/k8s
修改 eureka.yaml 文件,把镜像变成 image: 192.168.2.50/microservice/eureka:v13)更新 yaml 文件
kubectl apply -f eureka.yaml上面运行没问题之后,在物理机的 hosts 文件,新加如下一行:
192.168.2.20 eureka.ctnrs.com
在浏览器访问 eureka.ctnrs.com 即可,可看到如下,说明 eureka 部署成功了:在 k8s 中部署网关 Gateway 服务
- 1)构建镜像
cd /root/microservic-test/gateway-service/
docker build -t 192.168.2.50/microservice/gateway:v1 .
docker push 192.168.2.50/microservice/gateway:v1 2)部署服务
cd /root/microservic-test/k8s
修改 gateway.yaml 文件,把镜像变成 image: 192.168.2.50/microservice/gateway:v1
3)更新 yaml 文件
kubectl apply -f gateway.yaml
4)查看 pod 状态
kubectl get pods -n ms 6)配置 hosts 文件
gateway 的域名是 gateway.ctnrs.com,需要在物理机找到 hosts 文件,再增加一行如下:
192.168.2.20 gateway.ctnrs.com
在浏览器访问 eureka.ctnrs.com
可看到 GATEWAY-SERVICE 已经注册到 eureka 了:
- 在 k8s 中部署前端 portal 服务
1)构建镜像
cd /root/microservic-test/portal-service
docker build -t 192.168.2.50/microservice/portal:v1 .
docker push 192.168.2.50/microservice/portal:v1 2)部署服务
cd /root/microservic-test/k8s
修改 portal.yaml 文件,把镜像变成 image: 192.168.2.50/microservice/portal:v1 3)更新 yaml 文件
kubectl apply -f portal.yaml
4)查看 pod 状态
kubectl get pods -n ms 在物理机的 hosts 文件中,再增加一行如下内容:
192.168.2.20 portal.ctnrs.com
6)查看 portal 是否注册到 eureka 中
在浏览器访问 eureka.ctnrs.com 可看到 portal 服务已经注册到 eureka 了
7)访问前端页面
在浏览器访问 portal.ctnrs.com
- 在 k8s 中部署订单 order 服务
1)构建镜像
cd /root/microservic-test/order-service/order-service-biz
docker build -t 192.168.2.50/microservice/order:v1 .
docker push 192.168.2.50/microservice/order:v1
2)部署服务
cd /root/microservic-test/k8s
修改 order.yaml 文件,把镜像变成 image: 192.168.2.50/microservice/order:v1 3)更新 yaml 文件
kubectl apply -f order.yaml
4)查看 pod 状态
kubectl get pods -n ms
全链路监控工具对比分析
- 市面上的全链路监控理论模型大多都是借鉴 Google Dapper 论文,下面重点关注以下三种 APM 组件:APM = ApplicationPerformance Management,中文即应用性能管理
1)Zipkin:由 Twitter 公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。
2)Pinpoint:一款对 Java 编写的大规模分布式系统的 APM 工具,由韩国人开源的分布式跟踪组件。
3)Skywalking:国产的优秀 APM 组件,是一个对 JAVA 分布式应用程序集群的业务运行情况进行追踪、告警和分析的系统。- 全面的调用链路数据分析,提供代码级别的可见性以便轻松定位失败点和瓶颈。
1.zipkin
zipkin 的链路监控粒度相对没有那么细,调用链中具体到接口级别,再进一步的调用信息未普及。
2.skywalking
skywalking 支持 20+的中间件、框架、类库,比如:主流的 dubbo、Okhttp,还有 DB 和消息中间件。skywalking 链路调用分析截取的比较简单,网关调用 user 服务,由于支持众多的中间件,所以 skywalking 链路调用分析比 zipkin 完备些。
3.pinpoint
pinpoint 应该是这三种 APM 组件中,数据分析最为完备的组件。提供代码级别的可见性以便轻松定位失败点和瓶颈,上图可以看到对于执行的 sql 语句,都进行了记录。还可以配置报警规则等,设置每个应用对应的负责人,根据配置的规则报警,支持的中间件和框架也比较完备。
pinpoint 和 zipkin 对比分析
- 差异性:
1. Pinpoint 是一个完整的性能监控解决方案,有从探针、收集器、存储到 Web 界面等全套体系,而 Zipkin 只侧重收集器和存储服务,虽然也有用户界面,但其功能与 Pinpoint 不可同日而语。反而 pinpoint 提供有 Query 接口,更强大的用户界面和系统集成能力,可以基于该接口二次开发实现。
2. Zipkin 官方提供有基于 Finagle 框架(Scala 语言)的接口,而其他框架的接口由社区贡献,目前可以支持 Java、Scala、Node、Go、Python、Ruby 和 C# 等主流开发语言和框架;但是Pinpoint 目前只有官方提供的 Java Agent 探针,其他的都在请求社区支援中。
3. Pinpoint 提供有 Java Agent 探针,通过字节码注入的方式实现调用拦截和数据收集,可以做到真正的代码无侵入,只需要在启动服务器的时候添加一些参数,就可以完成探针的部署,而 Zipkin 的Java 接口实现 Brave(zipkin 的 java 客户端),只提供了基本的操作 API,如果需要与框架或者项目集成的话,就需要手动添加配置文件或增加代码。
4. Pinpoint 的后端存储基于 Hbase,而 Zipkin 基于 Cassandra(Cassandra 是一套开源分布式 NoSQL 数据库系统)。
相似性:
pinpoint 与 zipkin 都是基于 Google Dapper(google 的分布式追踪系统 dapper)的那篇论文,因此理论基础大致相同。两者都是将服务调用拆分成若干有级联关系的 Span,通过 SpanId 和ParentSpanId 来进行调用关系的级联,最后再将整个调用链流经的所有的 Span 汇聚成一个 Trace,报告给服务端的 collector 进行收集和存储。
Pinpoint 所采用的概念也不完全与那篇论文一致。比如他采用 TransactionId 来取代 TraceId,而真正的 TraceId 是一个结构,里面包含了 TransactionId, SpanId 和 ParentSpanId。而且Pinpoint 在 Span 下面又增加了一个 SpanEvent 结构,用来记录一个 Span 内部的调用细节(比如具体的方法调用等等),因此 Pinpoint 默认会比 Zipkin 记录更多的跟踪数据。但是理论上并没有限定Span 的粒度大小,所以一个服务调用可以是一个 Span,那么每个服务中的方法调用也可以是个Span,这样的话,其实 Brave 也可以跟踪到方法调用级别,只是具体实现并没有这样做而已。- span 是什么?
基本工作单元,一次链路调用(可以是 RPC,DB 等没有特定的限制)创建一个 span,通过一个 64位 ID 标识它,uuid 较为方便,span 中还有其他的数据,例如描述信息,时间戳,key-value 对的(Annotation)tag 信息,parent_id 等,其中 parent-id 可以表示 span 调用链路来源。 上图说明了 span 在一次大的跟踪过程中是什么样的。Dapper 记录了 span 名称,以及每个 span的 ID 和父 ID,以重建在一次追踪过程中不同 span 之间的关系。如果一个 span 没有父 ID 被称为 root span。所有 span 都挂在一个特定的跟踪上,也共用一个跟踪 id。
Span 数据结构:
type Span struct {
TraceID int64 #用于标示一次完整的请求 id
Name string
ID int64 #当前这次调用 span_id
ParentID int64 #上层服务的调用 span_id 最上层服务 parent_id 为 null
Annotation []Annotation #用于标记的时间戳
Debug bool
}- Trace 是什么?
类似于树结构的 Span 集合,表示一次完整的跟踪,从请求到服务器开始,服务器返回 response 结束,跟踪每次 rpc 调用的耗时,存在唯一标识 trace_id。比如:你运行的分布式大数据存储一次 Trace就由你的一次请求组成。 每种颜色的 note 标注了一个 span,一条链路通过 TraceId 唯一标识,Span 标识发起的请求信息。树节点是整个架构的基本单元,而每一个节点又是对 span 的引用。节点之间的连线表示的 span 和它的父 span 直接的关系。虽然 span 在日志文件中只是简单的代表 span 的开始和结束时间,他们在整个树形结构中却是相对独立的。初始化实验环境,新创建一台虚拟机安装 pinpoint
- 安装 pinpoint 服务
- unzip pinpoint-docker-2.0.1.zip
cd pinpoint-docker-2.0.1
修改 docker-compose.yml 文件的 version 版本,变成自己支持的版本
version: "3.6" 变成 version: "2.2"
#通过下面命令在线安装 pinpoint 需要的镜像(镜像较大,拉取需要时间)
docker-compose pull
#启动服务
docker-compose up -d
#查看对应的服务是否启动
docker ps | grep pinpoint
#找到 pinpoint-web,可看到在宿主机绑定的端口是 8079,
在浏览器访问 ip:8079 即可访问 pinpoint 的 web ui 界面- 部署电商项目:带 pinpoint agent 客户端
- unzip microservic-test-dev1.zip
修改源代码,更改数据库连接地址
1)修改库存数据库
vim /root/microservic-test-dev1/stock-service/stock-service-biz/src/main/resources/application-fat.yml
jdbc:mysql://192.168.2.10:3306/tb_stock?characterEncoding=utf-8
#变成自己的 mysql 数据库所在机器的地址 2)修改产品数据库
vim /root/microservic-test-dev1/product-service/product-service-biz/src/main/resources/application-fat.yml
jdbc:mysql://192.168.2.10:3306/tb_product?characterEncoding=utf-8 3)修改订单数据库
vim /root/microservic-test-dev1/order-service/order-service-biz/src/main/resources/application-fat.yml
url: jdbc:mysql://192.168.2.10:3306/tb_order?characterEncoding=utf-8 #修改配置,指定 pinpoint 服务端
vim /root/microservic-test-dev1/product-service/product-service-biz/pinpoint/pinpoint.config
profiler.collector.ip=192.168.2.60
#这个是安装 pinpoint 服务的 ip 地址
vim /root/microservic-test-dev1/order-service/order-service-biz/pinpoint/pinpoint.config
profiler.collector.ip=192.168.2.60
vim /root/microservic-test-dev1/stock-service/stock-service-biz/pinpoint/pinpoint.config
profiler.collector.ip=192.168.2.60
vim /root/microservic-test-dev1/portal-service/pinpoint/pinpoint.config
profiler.collector.ip=192.168.2.60
vim /root/microservic-test-dev1/gateway-service/pinpoint/pinpoint.config
profiler.collector.ip=192.168.2.60
vim /root/microservic-test-dev1/eureka-service/pinpoint/pinpoint.config
profiler.collector.ip=192.168.2.60
#上面修改的 ip 是部署 pinpoint 的机器的 ip 地址,也就是 pinpoint 的服务端- 通过 Maven 编译、打包、构建代码
在 k8s 的控制节点操作
修改源代码之后回到/root/microservic-test-dev1 目录下执行如下命令:
cd /root/microservic-test-dev1
mvn clean package -D maven.test.skip=true
#看到如下,说明代码已经打包完成
- 部署带 pinpoint agent 端的产品服务
- cd /root/microservic-test-dev1/product-service/product-service-biz
docker build -t 192.168.2.50/microservice/product:v2 .
docker push 192.168.2.50/microservice/product:v2
cd /root/microservic-test-dev1/k8s
修改 product.yaml 文件,把镜像变成 image: 192.168.2.50/microservice/product:v2
更新 yaml 文件
kubectl delete -f product.yaml
kubectl apply -f product.yaml 上面部署成功之后,登陆 pinpoint web 界面,可看到有个新的应用是 ms-product
- 部署带 pinpoint agent 端的订单服务
cd /root/microservic-test-dev1/order-service/order-service-biz
docker build -t 192.168.2.50/microservice/order:v2 .
docker push 192.168.2.50/microservice/order:v2
cd /root/microservic-test-dev1/k8s
修改 order.yaml 文件,把镜像变成 image: 192.168.2.50/microservice/order:v2
更新 yaml 文件
kubectl delete -f order.yaml
kubectl apply -f order.yaml
上面部署成功之后,登陆 pinpoint web 界面,可看到有个新的应用是 ms-order
- 部署带 pinpoint agent 端的 stock 服务
cd /root/microservic-test-dev1/stock-service/stock-service-biz
docker build -t 192.168.2.50/microservice/stock:v2 .
docker push 192.168.2.50/microservice/stock:v2
cd /root/microservic-test-dev1/k8s
修改 stock.yaml 文件,把镜像变成 image: 192.168.2.50/microservice/stock:v2
更新 yaml 文件
kubectl delete -f stock.yaml
kubectl apply -f stock.yaml
上面部署成功之后,登陆 pinpoint web 界面,可看到有个新的应用是 ms-stock
- 部署带 pinpoint agent 端的 portal 服务
cd /root/microservic-test-dev1/portal-service/
docker build -t 192.168.2.50/microservice/portal:v2 .
docker push 192.168.2.50/microservice/portal:v2
cd /root/microservic-test-dev1/k8s
修改 portal.yaml 文件,把镜像变成 image: 192.168.2.50/microservice/portal:v2
更新 yaml 文件
kubectl delete -f portal.yaml
kubectl apply -f portal.yaml
上面部署成功之后,登陆 pinpoint web 界面,可看到有个新的应用是 ms-portal
- 部署带 pinpoint agent 端的网关服务
1)构建镜像
cd /root/microservic-test-dev1/gateway-service/
docker build -t 192.168.2.50/microservice/gateway:v2 .
docker push 192.168.2.50/microservice/gateway:v2
2)部署服务
cd /root/microservic-test-dev1/k8s
修改 gateway.yaml 文件,把镜像变成 image: 192.168.2.50/microservice/gateway:v2
3)更新 yaml 文件
kubectl delete -f gateway.yaml
kubectl apply -f gateway.yaml
4)配置 hosts 文件
gateway 的域名是 gateway.ctnrs.com,找到 hosts 文件,再增加一行如下:
192.168.2.20 gateway.ctnrs.com
在浏览器访问 eureka.ctnrs.com
可看到 GATEWAY-SERVICE 已经注册到 eureka 了: #访问前端页面
http://portal.ctnrs.com/- Pinpoint web 界面使用说明
上面都部署好之后,可以在 pinpoint 的 web 页面查看服务之间的调用关系: 在上图可看到右侧有绿色的点,我们把鼠标放上去,把绿色点的圈住 点击上面的 Path,就可以看到具体的代码之间的调用了