使用jenkins做CI/CD發佈到Kubernetes

一、準備工作:

1)安裝好docker,並安裝私有倉庫; 

2)使用docker部署jenkins; 

3)部署好kubernetes; 

二、使用jenkins的maven進行打包,並上傳到docker私有倉庫,腳本如下:

push_docker_registry.sh

#!/bin/sh

echo -----------------------------------------parameter define -----------------------------------------

project_name=oss-gateway    #工程名字,需配置
tag=$BUILD_TAG      #鏡像標籤,自動生成,無需手動配置
sudo docker rmi aigpu.xxxxxxx.com:30143/library/$project_name
set -e
echo $(pwd)
echo "FROM java:8
VOLUME /tmp
ADD $project_name/target/*.jar app.jar
ENTRYPOINT [\"java\",\"-Djava.security.egd=file:/dev/./urandom\",\"-jar\",\"/app.jar\"]" > Dockerfile


echo -------------build image and push it to harbor ---------------------
sudo docker build -t aigpu.xxxxx.com:30143/library/$project_name:$tag -f Dockerfile --rm=true .

sudo docker login -u admin -p Cd12345 aigpu.xxxxx.com:30143

sudo docker push aigpu.xxxxxx.com:30143/library/$project_name:$tag

echo images_url=aigpu.xxxxxxx.com:30143/library/$project_name:$tag > $project_name.txt

echo This is imagesUrl
echo '********************************************************************************************************************'
echo
echo aigpu.xxxxxxx.com:30143/library/$project_name:$tag
echo 
echo '********************************************************************************************************************'

三、從私有倉庫拉包部署到Kubernetes上(使用堡壘機發布)。

實現原理,生成編排文件,存放到master節點上使用kubectl apply -f 進行發佈

sendfileto_k8s.sh

#!/bin/bash

echo -----------------------------------------parameter define -----------------------------------------

project_name=oss-gateway        #工程名稱,唯一,需配置
port=8888                    #容器端口,注意與配置選擇的profile對應,需配置
profile=dev                   #生效的配置文件(spring.profiles.active),需配置
podNum=1                   #需要啓動節點數量,需配置
logPath=/var/log/xxxxxx/oss-gateway                   #日誌路徑,需配置

tag=$BUILD_TAG        #鏡像標籤,自動生成,無需手動配置
#################以下參數由k8s運維人員配置##################
k8s_master_ip='192.168.42.8'
k8s_master_pwd='passwd'
servicePort=9999

target_dir=/root/service/$project_name     #k8s Master 存放yaml的目錄
jump_dir=/opt/user/release/k8s                 #跳板機存放yaml文件的上級目錄


sevice_temp="apiVersion: v1
kind: Namespace
metadata: 
  name: $profile
  labels:
    name: $profile
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: $profile
  name: $project_name-app
  labels:
    app: $project_name-app
spec:
  replicas: $podNum
  selector:
    matchLabels:
      app: $project_name-app
#  minReadySeconds: 60     #滾動升級時60s後認爲該pod就緒
  strategy:
    rollingUpdate:  ##由於replicas爲3,則整個升級,pod個數在2-4個之間
      maxSurge: 1      #滾動升級時會先啓動1個pod
      maxUnavailable: 1 #滾動升級時允許的最大Unavailable的pod個數
  template:
    metadata:
      labels:
        app: $project_name-app
    spec:
      terminationGracePeriodSeconds: 60 ##k8s將會給應用發送SIGTERM信號,可以用來正確、優雅地關閉應用,默認爲30秒
      containers:
      - name: container
        image: aigpu.xxxxxx.com:30143/library/$project_name:$tag
        imagePullPolicy: IfNotPresent
        resources:
          # keep request = limit to keep this container in guaranteed class
          limits:
            cpu: 1000m
            memory: 2000Mi
        env:
          - name: spring.profiles.active
            value: $profile
        ports:
          - containerPort: $port
        volumeMounts:
          - name: app-logs
            mountPath: $logPath
      volumes:
        - name: app-logs
          hostPath:  
            path: $logPath
---
apiVersion: v1
kind: Service
metadata:
  namespace: $profile
  name: ${project_name}-service
  labels:
    app: ${project_name}-app
spec:
  ports:
  - port: $servicePort
    targetPort: $port
    nodePort: 30001
    protocol: TCP
  type: NodePort
  selector:
    app: ${project_name}-app"

mkdir -p $jump_dir/$project_name
cd $jump_dir/$project_name/
echo "$sevice_temp" > ${project_name}-app-s-${profile}.yaml

echo "進入k8s-master創建目錄"
expect -c "
    spawn ssh root@${k8s_master_ip}
    expect {
        \"*assword\" {set timeout 300; send \"${k8s_master_pwd}\r\";}
        \"yes/no\" {send \"yes\r\"; exp_continue;}
    }
    expect "~$"
    send \"mkdir -p $target_dir\r\"
    expect "*$"
    send \"exit \r\"
    expect eof
"
echo "拷貝yaml文件到k8s-master"
expect -c "
    spawn scp ${project_name}-app-s-${profile}.yaml root@${k8s_master_ip}:$target_dir
    expect  {
            \"*assword\" {set timeout 300; send \"${k8s_master_pwd}\r\";} 
            \"yes/no\" {send \"yes\r\";exp_continue}
    }
    expect eof
"

echo "創建ReplicationController和service"
expect -c "
    spawn ssh root@${k8s_master_ip}
    expect {
        \"*assword\" {set timeout 300; send \"${k8s_master_pwd}\r\";}
        \"yes/no\" {send \"yes\r\"; exp_continue;}
    }
    expect "~$"
    send \"kubectl apply -f $target_dir/${project_name}-app-s-${profile}.yaml\r\"
    expect "*$"
    send \"exit \r\"
    expect eof
"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章