利用configmap覆盖tomcat项目数据库配置文件
一、需求背景及问题引入
这个实验之前本来是做一个k8s jenkins发布tomcat项目的,想实现k8s的滚动升级:通过改pod 镜像名来触发系统完成deployment运行pod的滚动升级操作。(这个问题解决之后,后续会补充一篇结合jenkins发布整个流程的)
大致交代下这篇文章的实验背景:测试项目来源于公司的一个线上举报违规项目,我特意在gitlab上克隆了一个专门做测试。数据库连接配置文件写的是天翼内网ip,线上项目也是部署在天翼云的机器上,也就是这个项目是通过内网方式连接数据库跑起来的。
实验环境:基于公司个人办公电脑开的的vmware,开了4台虚拟机做的k8s集群(版本:v1.15.2),其中k8s-1,k8s-2既是工作节点也是master节点。
所以要想把项目在pod上成功跑起来,肯定是不能用这个天翼内网ip去连数据库的,要把项目运行起来就要通过公网去连线上的数据库(包括mongo+mysql)
数据库内网ip:10.0.0.x; 外网ip:14.x.x.235
二、实验尝试及报错
实现环境说明:k8s已经部署好jenkins的pod(用的是blueocean的官方镜像),maven和jenkins通过nfs网络存储做了持久化,节点机器都已经挂载好对应的持久化目录。
jenkins的持久化目录为:/data/nfs-volume/jenkins_home
镜像tomcat1:v8.5.51事先从官方网站下载,上传到自己搭建的harbor仓库里(k8s-4),下载下来的tomcat镜像的工作目录默认在 /usr/local/tomcat/ 上。jenkins发布,pipeline脚本会把jenkins workspaces下maven编译好的项目war包(下图的 ./target/xx.war)复制到tomcat1:v8.5.51的镜像里面,形成需要跑应用项目的新镜像:tomcat-deploy:v1。最后通过交付给k8s资源文件把tomcat项目跑起来。
这里我只发个tomcat项目的deployment.yaml的文件(这样子挂载上去是不认的),test-conf(spec.template.spec.volumes.name)引入的是configmap.yaml的配置文件内容
1 kind: Deployment 2 apiVersion: extensions/v1beta1 3 metadata: 4 name: tomcat 5 namespace: public 6 labels: 7 name: tomcat 8 spec: 9 replicas: 1 10 selector: 11 matchLabels: 12 name: tomcat 13 template: 14 metadata: 15 labels: 16 app: tomcat 17 name: tomcat 18 spec: 19 volumes: 20 - name: test-conf 21 items: 22 - key: application-pro.properties 23 path: application-pro.properties 24 containers: 25 - name: tomcat 26 image: harbor.odljy.com/infra/tomcat-deploy:v1 27 ports: 28 - containerPort: 8080 29 protocol: TCP 30 volumeMounts: 31 - name: test 32 mountPath: /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/config/application-pro.properties 33 subpath: application-pro.properties 34