本篇将不再使用Minikube,而是在一个多节点的Kubernetes环境之中部署应用
本地情况
我本地的Kubernetes有三个节点,全部运行在本地的虚拟机中,相关的信息如下
关于如何搭建集群在这里就不详细论述了
我本机存在的问题
调度到节点host1上的pod经常会报出 disk pressure
的问题
集群一开始使用的是weave作为网络插件,但是一些pod之间无法正常通信,所以最后就又换成了Kubernetes官方提供的flannel
修改部分Docker镜像并重新打包
MySQL部署
由于本地的Minikube环境中的不存在字符串编码的问题,但是我在实际部署到集群中时出现了编码的问题,所以就需要事先对MySQL做相关的配置,重新打包。
创建文件夹 mysql-docker-deploy
,结构如下
1 | mysql-docker-deploy |
可以运行一下MySQL镜像,登录到容器中查看它配置文件的组织形式,就会发现它就会读取 /etc/mysql/conf.d/
和 /etc/mysql/mysql.conf.d/
下所有以 .cnf
结尾的配置文件,所以在Dockerfile中可以这样书写,将我们自己写的 mysql.cnf
加入进去
1 | FROM mysql:5.6 |
而 mysql.cnf
的具体内容如下,几乎全部都是这是字符编码相关的配置
1 | [mysql] |
之后执行打包命令,打上最新的tag,推送至自己的私有仓库
当然,为了免去后面还要登录运行容器导入数据等麻烦,可以像第二节中介绍的那样,编写如下的Dockerfile
1 | FROM mysql:5.6 |
将所有要加载的配置和导入的数据写到 mysql.sql
文件中
前端静态文件部署
首先,将renren-fast-vue的前端文件 static/config/index-prod.js
中对于后端服务器地址的部分修改为主节点的ip地址,重新运行 npm run build
打包
其次,为了防止字符编码问题的出现,需要对nginx的配置文件做如下的修改
1 | server { |
修改完成后,重新打包Docker镜像,打上最新的tag,并推送至自己的私有仓库
部署
我的做法是将yaml的配置文件全部上传至主节点,然后执行 kubectl apply -f
,相关细节和之前介绍的单节点部署相同,但是还是有几处不同的
MySQL 部署
由于还是使用的hostpath,所以为了保证数据不丢失,我希望每次MySQL的Pod实例都是存在于同一个节点上,这个可以使用为节点打label实现,例如此处,我希望使用host2节点,就执行如下操作
1 | kubectl label nodes host2 db=mysql |
这样,在MySQL的Deployment配置文件中,就需要使用 nodeSelector
对节点进行选择,部分代码如下
1 | template: |
对于数据库初始化数据的导入,我是将文件上传至相应的pod中的,使用 kubectl cp
即可,就和 scp
的使用方式相同,例如
1 | kubectl cp mysql.sql mysql-demo-946688857-978tf:/tmp/ |
后端部署
由于SpringBoot非常耗性能,所以我希望它可以调度到任意适合的节点,当然包括主节点,但是在集群中主节点一般不允许有pod被调度到它那边,如果describe一下master节点的信息就会有如下的输出(部分)
1 | Taints: node-role.kubernetes.io/master:NoSchedule |
所以对其deployment的配置文件可以做如下修改
1 | template: |
实用技巧
批量删除 evicted 状态的Pod
1 | kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod |
去除taint
例如去除节点host2的 node.kubernetes.io/disk-pressure:NoSchedule
,指令如下
1 | kubectl taint nodes host2 node.kubernetes.io/disk-pressure:NoSchedule- |