、K8Sインフラ
1.1マスターノード:
1.APIサーバー
API ServerはRESTfulなスタイルのAPIを提供し、APIサーバーは、インタフェースK8Sクラスタです。クライアントツール
(Kublet)とクラスタ内の他の構成要素K8Sクラスタを管理するためのリソースのさまざまなスルー。
2.scheduler
スケジューラは、実行するノード上でポッドを決定する責任があります
3.Controllerマネージャー
クラスタ内のリソースの管理を担当するコントローラマネージャは、リソースが状態を期待されていることを確認します。
コントローラコントローラ疥癬は、レプリケーション・コントローラ、名前空間として、種々の構成しました
コントローラ、エンドポイントコントローラ
4.etcd
クラスタ構成情報の保存や各種ステータス情報を担います
5.podのネットワーク
ポッドの間で通信する必要があるが、ネットワークは、ポッドを展開する必要があります。一つの解決策は、フランネルです
1.2ノードのノード:
1.kublet
kubletは、エージェントのノードであるノードポッド、ポッド意志で実行した場合、スケジューラは判断し
特定の設定情報(画像、ボリューム、等)は、ノードをkublet、作成した情報内容に応じて実行kublet
、マスターの動作状態への報告
2.kubeプロキシ
KUBE-プロキシサービスは、バックエンドのポッドコンポーネントに転送され、KUBE-プロキシロードバランシングは、転送され、それはiptablesのルールによって動作しますが、バックエンドポッドへ
3.podのネットワーク
ポッドは、互いに通信する、ネットワークは、ポッドを展開する必要があります。
二、K8Sの実装プロセス
2.1 k8s 集群概述
我们现在采用的是阿里云的托管版 k8s 集群,master 节点是由阿里云进行管理,三个
worker 节点由我们自己管理,通过不同的 namespace 来隔离不同的资源。
2.2 数据库层
数据库采用的是自建的 mysql 和 mongo 主从架构。
2.3 中间件层
1.redis-cluster
我们现在有 6 套环境,redis-cluster 是可以共用的。所以 redis-cluster 放在一台 ecs 上(深圳可用 E 区 10.111.0.0/16 网段,可以于 k8s 网络互通)
2. Zookeeper
Zookeeper 作为注册中心是不能公用的,所以在每个 namespace 里面都跑了一个注册中心,各个环境不相互干扰
3. Rocketmq
Rocketmq 作为消息队列也是不能公用的,所以需要放在不通的 namespace 中。
2.4 应用层
1.usercenter
先跑了user-center,这就涉及到怎么访问公用的redis-cluster,相互隔离的zookeeper,rocketmq 的问题了。
(1) 我们首先在 private-zone 里面定义了 rediscluster1[sk.rediscluster1].mg.addr .. 的域名,然后把这个 private-zone 关联到 k8s
集群所在的 vpc 网络就可以对整个集群生效 了。
(2) zookeeper 和 rocketmq 因 为 是 隔 离 的 , 如 果 在 采 用 private-zone 的 方 式 zk.mg.addr 自能解析到一个地址,这显然是
无法满足不同的不用 namespace 需要不同的 zk.mg.addr 的。那怎么来解决这个问题呢?
答案是: serviceName
原理是这样的:
user-center 应 用 程 序 运 行 在 area-b(namespace) 中 , 首 先 会 去 读 mogu-user-center-server-dubbo.properties 的 dubbo-mg-addr, 我 们 把 area-b 中 zookeeper 的 serviceName 定义成dubbo-mg-addr,这样应用访问 serviceName 就可 以访问到 zookeeper 的 service 的 clusterip【底层是通过coreDNS来实现的】,clusterip 底层通过 iptables 规则负载均衡的 把请求调度到后端的每一个 pod。
2.hqclient
hqclient 的配置文件修改和 usercenter 同理。
3.financial-shop
Financial-shop 这个服务是需要被公网访问的,所以他的 service 需要配置成
LoadBalance 类型,然后关联阿里云的 slb 即可实现公网访问
2.5 前端层
1. Slb
Slb 所在区域是深圳可用 E 区 k8s 集群所在网络(10.111.0.0/16),slb 需要添加的后端服务器 为 financial-svc 调度池中的 node。
2. Nginx
因为 nginx(189)前端服务所在网络是经典网络,需要配置 classlink 才能与 vpc 网络互通, 配置完成后就可以通过 10.111.1.117:6223 调度到 slb,slb 再找到 financial-srv , financial-srv 在找到真正提供服务的后端 pod。至此,蘑菇的 k8s 整条链路就基本跑通了。下面就要介绍怎么通过 jenkins 在 git 上拉取代 码,编译,打包成镜像,上传到镜像仓库,滚动更新的过程。
三、k8s 的应用
3.1 更新应用
1. 更新应用主要是在 git 上拉取代码,编译,编译后的代码打包成镜像,镜像上传到阿里云的远程镜像仓库
2.重置 deployment yaml 文件里面的 image,更新 service 后端 pod。
主要说明:
1.根据 Dockerfile 打包编译好的代码成镜像
docker build -t registry.cn-shenzhen.aliyuncs.com/moguyun/mogutest-b:${tag} . --no-cache
2.把打包好的镜像 push 到远程镜像仓库
docker push registry.cn-shenzhen.aliyuncs.com/moguyun/mogutest-b:${tag}
3. 通过 kubectl set image 修改 deployment 里面的镜像
kubectl set image deployment/${deploymentName}-dpm ${deploymentName}-dpm=registry-vpc.cn-shenzhen.aliyuncs.com/moguyun/mogutest-b:${tag} -n area-b
4. Jenkins 更新地址
https://jenkins.moguyun.com/view/%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A
2%83/job/Test-B%E7%8E%AF%E5%A2%83-119.23.135.6-K8S/
3.2 回滚应用
1. 回滚应用原理是通过切换不同的 yaml 文件来回滚的,可以通过命令来回滚也可以通过阿里云控制台来回滚。
主要说明
1.查看 financial-dpm 这个 deployment 的发布历史
kubectl rollout history deployment financial-dpm -n area-b
2. 回滚到指定版本
kubectl rollout undo deployment user-dpm --to-revision=5 -n area-b
3. 阿里云回滚地址
https://cs.console.aliyun.com/?spm=5176.2020520101.aliyun_sidebar.daliyun_side
bar_csk.697d4df57ZKZhI#/k8s/deployment/detail/cn-shenzhen/cd868c5e9514341
21bb4a868d8194840d/area-b/financial-dpm/history
3.3 弹性扩容
弹性扩容本质是是弹性增加或减少 service 调度池中 pod 的数量。
主要说明:
1.修改 financial-dpm 后端 pod 为 5 个
kubectl scale deployment financial-dpm --replicas=5 -n area-b
2. 阿里云弹性扩容地址
https://cs.console.aliyun.com/?spm=5176.2020520101.aliyun_sidebar.daliyun_side
bar_csk.697d4df57ZKZhI#/k8s/deployment/list
3.4 日志采集
阿里云容器服务 Kubernetes 集群集成了日志服务,可在创建集群时启用日志服务,快速采集 Kubernetes 集群的容器日志
1. 创建应用时配置日志服务
2. 应用日志查看地址
https://sls.console.aliyun.com/next/project/k8s-log-c32a5e3014cc24e9180d5e25e
e366dedf/logsearch/financail-logstore
四、k8s 压测结果
4.1 服务器配置
服务器 |
数量 |
服务器配置 |
部署应用 |
WEB接入 服务器(ECS) |
1 |
OS:Centos7.3 64bit CPU:4核 内存:16GB 硬盘:60GB |
nginx 配置弹性流量带宽,最大100MB |
负载均衡slb服务器 |
1 |
简约型I (slb.s1.small) |
该规格最大可以支持连接数: 5000,新建连接数 (CPS): 3000,每秒查询数 (QPS): 1000 |
Web应用服务器(容器组) |
2 |
OS:Centos7.3 64bit CPU:4核 内存:8GB 硬盘:80GB |
financial-shop-server 蘑菇小店接口(容器Tomcat)
|
中间件服务器(ECS) |
1 |
OS:Centos7.3 64bit CPU:2核 内存:4GB 硬盘:80GB |
Redis-Cluster |
中间件服务器(容器组) |
2 |
OS:Centos7.6 64bit CPU:2核 内存:512M 硬盘:80GB |
Zookeeper MQ-Namesrv 消息服务Namesrv MQ-Broker 消息服务Broker
|
MongoDB(ECS) |
1 |
CPU:4核 内存:16GB 硬盘:200GB |
自建MongoDB 3.4版 |
Mysql(ECS) |
1 |
CPU:4核 内存:16GB 硬盘:200GB |
自建 mysql 5.6版 |
4.2 测试报告
1.查找客户接口在 31000RPS,122181 总请求的压力下,平均响应时间为 185.89ms,出错
率为 1.75%,平均流量为 326.04KB。所以查找用户接口的处理能力为 8000RPS。
2.小店首页接口在 5 分钟、1000RPS、108595 请求的压力下,平均响应时间为 86.49ms,
出错率为 0.01%,平均流量为 209.50KB。所以查找用户接口的处理能力为 1000RPS。
4.3 压测过程
1. 查找客户接口
(1)小店压测需要拿到登录信息,所以需要先访问一个登录接口,拿到用户 cookie,然后拿到这个 cookie 去压测
https://hx168test.moguyun.com/financial-shop-server/intf/h5/userv3/login?mobil
e=13000000000&pwd=a111111&ignoreCsrfToken=1
(2)查找用户接口 url
https://hx168test.moguyun.com/financial-shop-server/intf/h5/shopuser/queryUse
rs?v=1563440531865&pageNo=1&pageSize=10&nickname=&tags=&orderType
=1&ignoreCsrfToken=1
2. 小店首页接口
(1) 小店首页接口 url
https://hx168test.moguyun.com/financial-shop-server/intf/h5/shop/queryShopCo
mponentsByPage?v=1563450528141&type=1&pageNo=1&pageSize=10¬Sho
wActivity=&ignoreCsrfToken=1