将曾经的一个Web应用,React+Nginx,Java+Tomcat,Mysql,MongoDB,部署到k8s上,包括CICD、LB、scaling,并且进行监控和测试。
rke
- 部署k8s,非常轻便简单,另一篇博文有详细介绍。
drone
drone是一个基于容器的ci/cd平台。
1.0.0版本push没有反应,感觉有残留bug。
0.8.5版本正常运行,但界面太丑,描述文件也很冗余。
像maven这种,有一个本地仓库的依赖管理工具,由于drone是容器方式运行,并不会持久化本地仓库,导致每次maven都需要全量下载依赖包,速度会非常慢,可以通过挂载的方式持久化,将本地仓库挂载到宿主机硬盘上。挂载需要trust该仓库,这需要drone admin账户权限,需要在启动drone的参数中设定。
- DRONE_ADMIN=Yourname
docker/plugin就很蠢了,它是docker in docker,问题同上,每次都会重新下载基础镜像,有时候基础镜像很大,ubuntu就接近2G,速度就非常慢,而且还不能通过挂载去持久化这部分,安全和轻便之间有个取舍,希望以后解决办法吧。
React+Nginx
- 使用node镜像build项目。
- 使用nginx镜像,将build文件放到nginx默认目录下,修改nginx.conf,完成镜像打包并推送到dockerhub。
Java+Tomcat
- 使用maven镜像build项目。
- 使用Tomcat镜像,将war文件放到Tomcat webapp下。
Mysql、Mongo
- 使用replica-controller + service就可以启动单实例数据库了。
- Spring Data Jpa只能自动建表,不能建库,需要自己先去mysql中建一个数据库。这个我认为也不太好通过修改镜像的方式去直接达成,因为数据库一般也会持久化的,数据部分是挂载的,外部容易覆盖内部,需要小心对待。
Prometheus、Grafana
- 使用别人写好的部署文件,即可部署node-exporter监控。
- 一个比较好用的grafana k8s监控模板编号为351。
Ingress
- Ingress-controller的部署有些复杂,官网上有例子(所谓复杂其实也就是镜像源需要处理一下)。
- 部署后,写新的ingress规则,将域名转发至服务。没有真域名的时候,随意杜撰,然后在client端修改hosts文件即可。
AutoScaling
- k8s 1.11以后推荐使用metrics-server作为集群中资源信息获取方式,只要将git上的部署文件中镜像替换为阿里云即可,同时还需要增加权限,比较粗暴的就是直接赋给admin权限。
kubectl create clusterrolebinding root-cluster-admin-binding --clusterrole=cluster-admin --serviceaccount=kube-system:metrics-server
- 有了metrics-server,hpa就可以读取pod资源使用率,从而调度replica数量。
- Deployment中可以设置resource的limit,这里的cpu limit是以core数量为标准的,比如1就是指使用1个核。
- hpa中的默认资源临界值是80%,这个比例是相对于limit而言的,假如limit为1,也就是说当cpu占用率为0.8core时就会发生调度。
- 实测发现如果
min=1, max=4
,scale会直接从1个pod变成4个,看起来是少了某种限制,比如我可能期望scale是逐个增长的。两次scale之间是有冷却的,从1到4之后,即使压力很快减小,也不会马上降为1个pod。 - 如果要使用其他资源作为指标,需要自定义,这部分我还未尝试。