一、背景
公司需要提供Saas服務給客戶經理通過企業微信進行獲客展業,所以需要在企業微信上構建一套營銷助手,用於客戶經理推銷自己的產品。
二、定製鏡像
SpringMVC應用跑在tomcat容器上,tomcat封裝在docker容器裏面,docker容器受K8S管理;所以需要在K8S上構建SpringMVC應用,首先要自定義tomcat容器,然後再把程序放到自定義的容器裏面,最後打成業務應用鏡像在K8S上運行。
2.1 定製tomcat基礎鏡像
2.1.1 編寫Dockerfile
- 把解壓並優化過的tomcat拷貝到centos7.6下的/opt/tomcat
- 拷貝pinpoint agent到centos7.6,下載好的pinpoint-agent已經修改pinpoint.config配置文件中配置爲profiler.collector.ip=pp.mg.addr,在宿主機/etc/hosts或阿里雲K8S所在專有網絡的private zone定義pinpoint服務端地址就可以完成pinpoint客戶端上報數據到服務端
- 拷貝arthas-boot.jar到centos7.6,arthas是一款優秀的調試工具,可以很清晰看到指定方法的入參和出參
- CMD爲默認執行的命令,如果docker run沒有指定任何的執行命令或者dockerfile裏面也沒有entrypoint,那麼就會使用cmd指定的默認的執行命令執行,同時也從側面說明了entrypoint的含義,entrypoint纔是真正的容器啓動以後要執行命令,文中的CMD爲執行定義好的sysinit.sh腳本,接收位置參數$1,$2。
] # vim Dockerfile
FROM registry.moguyun.com/centos:7.6
ENV CATALINA_HOME /opt/tomcat
ENV TOMCAT_VERSION apache-tomcat-9.0.26
ENV PINPOINT_VERSION pinpoint-agent-1.7.4
ENV RUN_OPTION "-server -Xms256m -Xmx1g -Duser.timezone=GMT+08"
ENV PNAME "AppName"
ENV USER tomcat
RUN rm -f /bin/sysinit.sh
ADD $TOMCAT_VERSION $CATALINA_HOME
ADD $PINPOINT_VERSION /opt/$PINPOINT_VERSION
COPY sysinit.v6.sh /bin/sysinit.sh
COPY arthas-boot.jar /opt/arthas-boot.jar
RUN groupadd -g 1050 $USER && useradd -s /sbin/nologin -d /opt/$USER -M -u 1050
-g $USER $USER && chown -R $USER:$USER /opt
WORKDIR $CATALINA_HOME
EXPOSE 8080
CMD ["sh", "-c", "/bin/sysinit.sh \"$RUN_OPTION\" \"$PNAME\""]
2.1.2 編寫sysinit.v6.sh
- 因爲CATALINA_OPTS會被JVM加載,所以我們需要重新定義這個參數
- 定義時區爲東八區,接收運行時參數$1,添加pinpoint-agent客戶端配置,接收agentId,應用名稱$2
- 判斷$HOST_FILE是否存在,因爲騰訊雲是沒有K8S集羣所在專有網段私有DNS的,所以需要自己寫hosts文件然後追加到容器的/etc/hosts文件後面
- 把重定義好的CATALINA_OPTS設置爲環境變量,啓動tomcat容器
] # vim sysinit.v6.sh
#!/bin/sh
CATALINA_OPTS=/opt/tomcat
AGENT_JAR=pinpoint-bootstrap-1.7.4.jar
PINPOINT_VERSION=pinpoint-agent-1.7.4
AGENT_PATH=/opt/pinpoint-agent-1.7.4
HOST_FILE=/opt/qwhosts
echo "RUN_OPTION=\"${1}\" PNAME=\"${2}\""
hname=`hostname`;
agentId=${hname:0-10};
CATALINA_OPTS="-server -Duser.timezone=GMT+08 ${1} "
if [ "AppName" != "${2}" ]; then
CATALINA_OPTS="$CATALINA_OPTS -javaagent:'$AGENT_PATH'/'$AGENT_JAR' -
Dpinpoint.agentId=app-${agentId} -Dpinpoint.applicationName=${2}"
fi
echo CATALINA_OPTS="$CATALINA_OPTS"
if [ -f "$HOST_FILE" ]; then
cat $HOST_FILE >> /etc/hosts
fi
cat /bin/sysinit.sh
chown -R tomcat:tomcat /opt
su tomcat -s /bin/bash -c "export CATALINA_OPTS=\"$CATALINA_OPTS\" && cd
$CATALINA_HOME/bin && ./catalina.sh run 2>&1 | tee ../logs/catalina.out"
2.1.3 製作推送鏡像
- 用準備好的Dockerfile在當前目錄製作鏡像
docker build -t registry.moguyun.com/tomcat-jdk8:v6 .
- 提送鏡像到遠程倉庫
docker push registry.moguyun.com/tomcat-jdk8:v6
2.2 定製SpringMVC業務應用鏡像
2.2.1 編寫業務應用Dockerfile
- 由於程序使用AES加密時,當密鑰大於128時程序會報錯,需要替換jre下的policy文件,把下載好的policy覆蓋tomcat容器裏面的policy文件
- 拷貝企業微信小店專有的hosts文件到/opt/目錄下
- 拷貝編譯好的代碼到tomcat容器的webapps目錄下
] # vim Dockerfile
FROM registry.moguyun.com/tomcat-jdk8:v4
MAINTAINER lijun moguyun.com
ENV SOURCEPATH ./financial-shop-server
ENV TARGETPATH /opt/tomcat/webapps/financial-shop-server
ENV RUN_OPTION "-Xms1g -Xmx4g -Xmn256m -Dfile.encoding=UTF-8"
ENV PNAME financial-d
ENV limitedPATH /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.el7_7.x86_64/jre/lib/security/policy/limited/
ENV unlimitedPATH /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.el7_7.x86_64/jre/lib/security/policy/unlimited/
ADD *.jar $limitedPATH
ADD *.jar $unlimitedPATH
ADD qwhosts /opt/
ADD $SOURCEPATH $TARGETPATH
EXPOSE 8080
ENTRYPOINT ["sh","-c","/bin/sysinit.sh \"$RUN_OPTION\" \"$PNAME\""]
2.2.2 編寫定製化qwhosts
- SpringMVC業務應用會用到MySQL,MongoDB,Redis數據庫,在程序中已經定義好別名,在hosts中定義好了實際服務地址
- pinpoint-agent會用到pinpoint服務端別名,在hosts中也已經定義好服務端具體地址
] # vim qwhosts
10.10.8.8 jdbc.mg.addr
10.10.8.9 mongo.mg.addr
10.10.8.9 mongo.readonly.mg.addr
10.10.8.17 redis.mg.addr
10.10.8.10 pp.mg.addr
2.2.3 編寫製作推送鏡像腳本
- 把項目名稱,項目分支,當前時間三個參數作爲業務鏡像的tag用來標識K8S線上環境的鏡像唯一性,方便回滾和確認分支
- 通過docker build將當前目錄下的Dockerfile打成鏡像並通過docker push推動鏡像到遠程倉庫供K8S線上環境使用
] # vim docker.sh
#!/bin/bash
currentTime=`date "+%Y%m%d%H%M%S"`
echo $currentTime
projectName=$1
branch=$2
echo ${projectName}_${branch}_${currentTime}
tag=${projectName}_${branch}_${currentTime}
#docker build -t ccr.***.tencentyun.com/work-weixin/moguyun:${tag} . --no-cache
docker build -t ccr.***.tencentyun.com/work-weixin/moguyun:${tag} .
docker push ccr.***.tencentyun.com/work-weixin/moguyun:${tag}
三、運行鏡像
3.1 創建deployment
3.1.1 定義數據卷
- 定義本機路徑用來做容器內日誌文件的存儲,當然也可以不定義,如果不指定數據卷做存儲,默認分配主機的臨時目錄掛載到容器的掛載點
3.1.2 定義實例內容器
- 選擇已經做好的SpringMVC鏡像和版本,勾選拉取策略【默認使用本地鏡像,本地沒有則拉取】
- 配置容器內的掛載點【即掛載那個目錄到宿主機的目錄】,配置CPU/內存限制
- 可以看出,這些環境變量都是在製作鏡像的自定義的環境變量,可以修改RUN_OPTION參數動態的修改CATALINA_OPTS參數,實現自定義配置JVM啓動時會加載的環境變量CATALINA_OPTS
- Dockerfile裏面定義的WORKDIR也被識別出來了,它指定了容器運行後的工作目錄
3.2 驗證deployment
3.2.1 查看deployment
- 我們的financial deployment跑了6個實例,每個實例下面都對應一個容器組,我們的每個容器組裏面跑了一個實例,當然也可以根據業務場景在一個容器組裏面跑多個容器
3.2.2 查看服務啓動之後的日誌
- 查看日誌可知自動任務weChatTokenJob已經跑起來了,說明服務啓動成功
四、蘑菇雲微營銷Saas平臺展示
- 部分模塊:首頁、我的