首頁>技術>

前言

本文的一鍵部署,其實就是將部署流程化的命令轉成shell指令碼,當然,因為是釋出到k8s叢集上,所以釋出的命令和需要的東西會有些不一樣。本文的一鍵部署指令碼是基於 打造一款適合自己的快速開發框架-持續部署之一鍵釋出指令碼設計與實現這篇文章進行改造的。所以建議大家先把該篇文章先看一篇。

知識準備關於基礎映象製作

基礎映象一般可以直接使用openjdk: 8u212-jdk-alpine,但是直接使用的話,其功能還是不夠,所以我們需要在其基礎上進行加工。加入一些必要安裝包。以及進行一些初始化工作。

修改源地址安裝時tzdata-時區相關的包ttf-dejavu和fontconfig,圖片驗證碼需要該庫curl-簡單的安裝一個curl工具tini- 正確註冊了訊號處理程式(比如 pid) ,如果不使用,容器中的服務預設pid都為1ospd-netstat網路診斷工具初始化springboot執行目錄修改一下預設時區arthas 阿里巴巴開源的 Java 診斷工具 ,需要5中的tini配合其他--暫時未考慮,希望大佬回覆建議。
cat <<EOF > /mldong/docker/8u212-jdk-alpine-mldong/Dockerfile# 指定基礎映象FROM openjdk:8u212-jdk-alpine# 維護者資訊MAINTAINER mldong <[email protected]># 修改源地址和安裝一些必要庫RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \\&& apk --update add --no-cache tzdata ttf-dejavu fontconfig curl tini ospd-netstat && rm -rf /var/cache/apk/* \\&& mkdir -p /app && mkdir -p /app/config \\ && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \\ && echo "Asia/Shanghai" > /etc/timezone# 安裝arthas-這裡是從另一個映象複製過來,小技巧COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthasEOF複製程式碼

build

docker build -f /mldong/docker/8u212-jdk-alpine-mldong/Dockerfile -t registry-vpc.cn-zhangjiakou.aliyuncs.com/mldong/java/8u212-jdk-alpine-mldong:1.0 .複製程式碼

login

docker login -u _username -p password registry-vpc.cn-zhangjiakou.aliyuncs.com複製程式碼

push

docker push registry-vpc.cn-zhangjiakou.aliyuncs.com/mldong/java/8u212-jdk-alpine-mldong:1.0複製程式碼
關於服務映象製作映象製作使用Dockerfile檔案定義使用 openjdk: 8u212-jdk-alpine做為基礎映象將jar包複製到容器將配置檔案複製到容器定義外部訪問埠定義容器啟動後執行命令(可不定義,由k8s的yaml的command去定義即可)關於映象版本號

映象版本號建議使用當前時間+git版本

關於模板模板變數

模板變數最主要的是映象版本,不過為了做成通用模板,建議模板變數為:

引數 說明 APP_NAME 應用名 NAMESPACE 名稱空間 PROFILES 環境定義(prod->生產,test->測試) IMAGE_URL 映象地址 IMAGE_TAG 映象版本 PORT 對外埠

模板引擎

這裡可能了不能叫做模板引擎吧,其實就簡單將上述的變數替換一下,這裡有兩個方案。

方案一:使用sed

使用說明:

sed 's#模板變數1#值1#g;s#模板變數2#值2#g' 模板檔案 > 生成的新檔案複製程式碼

例:

檔案內容如下:

cat << EOF > test.tplapiVersion: v1kind: Namespacemetadata: name: {{APP_NAME}}-nodeport namespace: {{NAMESPACE}}-{{PROFILES}} EOF複製程式碼

生成模板

sed -e 's#{{APP_NAME}}#mldong-admin#g;s#{{NAMESPACE}}#mldong#g;s#{{PROFILES}}#test#g' test.tpl > test.yaml複製程式碼

方案二:使用envsubst

​ 通常我們需要獲取某一個或者幾個環境去替換系統中的某些變數,這種情況下我們只需使用sed去簡單的替換掉即可,在這種場景中,sed就可以滿足我們的需求,但是如果我們需要修改的變數較多,envsubst就排上用場了。

使用說明:

envsubst < 模板檔案 > 生成的新檔案複製程式碼

例:

檔案內容如下:

cat << EOF > test2.tplapiVersion: v1kind: Namespacemetadata: name: ${APP_NAME}-nodeport namespace: ${NAMESPACE}-${PROFILES} EOF複製程式碼

先定義環境變數

export APP_NAME=mldong-adminexport NAMESPACE=mldongexport PROFILES=test複製程式碼

再執行envsubst命令生成模板

envsubst < test2.tpl > test2.yaml複製程式碼

本文中使用的是sed的方式。

開始編碼目錄結構
├── /java_projects 管理端介面 ├── mldong-admin \t├── config \t\t└── application-test.yml \t├── app.jar\tjar包 \t├── k8s.tpl\tk8s釋出模板 \t├── Dockerfile\t映象定義檔案 \t└── buildAndPublish.sh\t重新構建專案併發布專案到k8s叢集 └── source \t├── back  ├── mldong\t\t\t原始碼根目錄 ├──\tmldong-admin  └── pom.xml ├──\tmldong-common  └── pom.xml ├── mldong-generator  └── pom.xml ├── mldong-mapper └── pom.xml複製程式碼
檔案詳解

/java_projects/mldong-admin/config/application-test.yml

測試環境配置(為了簡單起見,這裡暫時不考慮模板中加入mysql,使用的是小A同學上的資料庫)

# jdbc 配置jdbc.driver-class-name: com.mysql.cj.jdbc.Driverjdbc.url: jdbc:mysql://172.26.22.105:3306/mldong?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghaijdbc.username: u_mldongjdbc.password: [email protected]: 10000jdbc.max-wait: 10000jdbc.min-idle: 5複製程式碼

/java_projects/mldong-admin/app.jar

這個jar包由原始碼編譯後複製生成,打包映象時需要在Dockerfile檔案同一目錄下

/java_projects/mldong-admin/Dockerfile

映象定義檔案

# 使用上述製作的基礎映象FROM registry-vpc.cn-zhangjiakou.aliyuncs.com/mldong/java/8u212-jdk-alpine-mldong:1.0# 維護者資訊MAINTAINER mldong <[email protected]># 建立應用目錄# RUN mkdir -p /app && mkdir -p /app/config # 進入工作目錄WORKDIR /app# 複製jarCOPY app.jar .# 配置配置檔案COPY config/* .# EXPOSE 對映埠EXPOSE 8080# ENTRYPOINT 處理pid=1的問題ENTRYPOINT ["/sbin/tini", "--"]# CMD 執行以下命令(如果yaml檔案定義了command會被覆蓋)CMD ["/bin/sh","-c","set -e && java -jar app.jar --spring.profiles.active=dev --server.port=8080"]複製程式碼

/java_projects/mldong-admin/k8s.tpl

k8s服務部署模板

apiVersion: v1kind: Namespacemetadata: name: {{NAMESPACE}}---apiVersion: v1kind: Servicemetadata: name: {{APP_NAME}}-nodeport namespace: {{NAMESPACE}}spec: type: NodePort ports: - port: 8080 targetPort: 8080 selector: app: {{APP_NAME}}---apiVersion: v1kind: Servicemetadata: name: {{APP_NAME}} namespace: {{NAMESPACE}}spec: type: ClusterIP ports: - port: 8080 protocol: TCP targetPort: 8080 selector: app: {{APP_NAME}}---apiVersion: apps/v1kind: Deploymentmetadata: name: {{APP_NAME}} namespace: {{NAMESPACE}}spec: selector: matchLabels: app: {{APP_NAME}} replicas: 1 template: metadata: labels: app: {{APP_NAME}} spec: containers: - name: {{APP_NAME}} image: {{IMAGE_URL}}:{{IMAGE_TAG}} imagePullPolicy: IfNotPresent ports: - containerPort: 8080  name: port  protocol: TCP command: ["/bin/sh"] args: ["-c", "set -e && java -jar app.jar --spring.profiles.active={{PROFILES}} --server.port=8080"]---apiVersion: extensions/v1beta1kind: Ingressmetadata: annotations: name: {{APP_NAME}}-ingress namespace: {{NAMESPACE}}spec: rules: - host: {{HOST}} http: paths: - backend:  serviceName: {{APP_NAME}}  servicePort: 8080 path: /複製程式碼

/java_projects/mldong-admin/buildAndPublish.sh

流程:

編譯打包構建映象推送到私服使用模板生成釋出yaml釋出
#!/bin/bash# 原始碼存放根目錄source_dir=/java_projects/source/back# 父工程目錄parent_dir=$source_dir/mldong# 需要打包的專案名稱project_name=mldong-admin# 專案部署目錄project_dir=/java_projects/$project_name# git倉庫地址(使用ssh方式的,需要去配置部署公鑰)[email protected]:mldong/mldong.git# 映象倉庫地址registry_url=registry-vpc.cn-zhangjiakou.aliyuncs.com# 映象倉庫空間registry_ns=mldong/java# 映象倉庫使用者名稱registry_username=username# 映象倉庫密碼registry_password=password# 生成的映象地址image_url=$registry_url/$registry_ns/$project_name# 服務繫結的域名host=c.mldong.com# 環境定義profiles=testif [ -d "$source_dir" ]; then echo "原始碼存放根目錄${source_dir}已存在"else echo "原始碼存放根目錄不存在,建立${source_dir}" cp -p $source_dirfiif [ -d "$parent_dir" ]; then echo "原始碼已存在,git pull" cd $parent_dir git pullelse echo "原始碼不存在,git clone" git clone $git_url $parent_dirfigit_version=$(git rev-parse HEAD)echo "當前版本號:${git_version}"image_tag=`date +"%Y%m%d%H%M"_``git describe --tags --always`cd $parent_dirmvn clean package -B# 這裡需要判斷打包是否成功if [ $? -ne 0 ]; then echo "打包失敗"else # 複製jar包 cp -r -f $parent_dir/$project_name/target/$project_name.jar $project_dir/app.jar # 進入專案目錄 cd $project_dir # 構建映象 docker build -t $registry_url/$registry_ns/$project_name:$image_tag . # 登入私服 docker login -u $registry_username -p ${registry_password} $registry_url # 推送到私服 docker push $registry_url/$registry_ns/$project_name:$image_tag sed -e "s#{{APP_NAME}}#$project_name#g;s#{{NAMESPACE}}#$project_name-$profiles#g;s#{{PROFILES}}#$profiles#g;s#{{IMAGE_URL}}#$image_url#g;s#{{IMAGE_TAG}}#$image_tag#g;s#{{HOST}}#$host#g" k8s.tpl > k8s.yaml # 刪除本地映象 docker rmi $registry_url/$registry_ns/$project_name:$image_tag if [ $? -ne 0 ]; then echo "構建映象推送到私服失敗" else cat k8s.yaml  kubectl apply -f k8s.yaml fifi複製程式碼
驗證結果

小結

本文以前段時間開源的快速開發框架為例,將之前的一鍵部署指令碼修改成k8s。其實就之前的指令碼來說,就是新增了打包映象、推送私服、製作模板、釋出的過程。也就是增加多幾個命令而已。當然,真實的部署上可能還會有點小區別,比如可能模板的內容會多一點、也可能將該指令碼轉成jenikns的流水線。不過基本的原理都差不多,流程也大同小異。

原文連結:https://juejin.im/post/5f05da9bf265da22dd7dcce4

  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 使用Kotlin實戰一個Android的HelloWorld