DEVOPS-在K8S生產集羣上構建SpringMVC應用

一、背景

公司需要提供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平臺展示

  • 部分模塊:首頁、我的

 

 
發佈了172 篇原創文章 · 獲贊 40 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章