使用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
"

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值