[kubernetes]7-1/2/3/4/5 cicd实践

 

7-1 kubernetes与cicd

没什么花头

 

7-2 cicd实践(1)

构建成功

 

7-3 cicd实践(2)

定义环境变量

 

 

上传代码到git

 

pipline script如下

node {
    env.BUILD_DIR = "/root/build-workspace/"
    env.MODULE = "web-demo"
   stage('Preparation') { // for display purposes
      // Get some code from a GitHub repository
      git credentialsId: 'e379aaee-d144-42b5-8d82-7d25382269b5', url: 'https://gitee.com/PanDaWangLuoKeJi_hugo_xu/mooc-demo.git'
      // Get the Maven tool.
      // ** NOTE: This 'M3' Maven tool must be configured
      // **       in the global configuration.           
   }
   stage('Maven Build') {
       sh "mvn -pl ${MODULE} -am clean package"
   }
   stage('Build image') {
       sh "/root/script/build-image-web.sh"
   }
   stage('Deploy') {
       sh "/root/script/deploy.sh"
   }
}

 

创建构建脚本/root/script/build-image-web.sh

#!/bin/bash


if [ "${BUILD_DIR}" == "" ];then
    echo "env 'BUILD_DIR' is not set"
    exit 1
fi
DOCKER_DIR=${BUILD_DIR}/${JOB_NAME}


if [ ! -d ${DOCKER_DIR} ];then
    mkdir -p ${DOCKER_DIR}
fi


echo "docker workspace: ${DOCKER_DIR}"


JENKINS_DIR=${WORKSPACE}/${MODULE}


echo "jenkins workspace: ${JENKINS_DIR}"


if [ ! -f ${JENKINS_DIR}/target/*.war ];then
    echo "target war file not found ${JENKINS_DIR}/target/*.war"
    exit 1
fi


cd ${DOCKER_DIR}
echo BUILD_DIR: ${BUILD_DIR} DOCKER_DIR: ${DOCKER_DIR} JENKINS_DIR: ${JENKINS_DIR}
rm -rf *
unzip -oq ${JENKINS_DIR}/target/*.war -d ./ROOT


mv ${JENKINS_DIR}/Dockerfile .
if [ -d ${JENKINS_DIR}/dockerfiles ];then
    mv ${JENKINS_DIR}/dockerfiles .
fi


VERSION=$(date +%Y%m%d%H%M%S)
IMAGE_NAME=harbor.pdabc.com/kubernetes/${JOB_NAME}:${VERSION}


echo "${IMAGE_NAME}" > ${WORKSPACE}/IMAGE


echo "docker build -t  $IMAGE_NAME "
docker build -t  $IMAGE_NAME .


echo "docker push ${IMAGE_NAME}"
docker push ${I

 

增加执行权限

chmod +x /root/script/build-image-web.sh

 

需要在jenkins的机子上修改/etc/hosts 添加harbor地址 以及登录harbor

 

 

7-4 cicd实践(3)

创建kubernetes的模板/root/script/template/web.yaml

#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{name}}
spec:
  selector:
    matchLabels:
      app: {{name}}
  replicas: 1
  template:
    metadata:
      labels:
        app: {{name}}
    spec:
      containers:
      - name: {{name}}
        image: {{image}}
        ports:
        - containerPort: 8080
---
#service
apiVersion: v1
kind: Service
metadata:
  name: {{name}}
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: {{name}}
  type: ClusterIP


---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{name}}
spec:
  rules:
  - host: {{host}}
    http:
      paths:
      - path: /
        backend:
          serviceName: {{name}}
          servicePort: 80

 

创建/root/script/deploy.sh

#!/bin/bash


name=${{JOB_NAME}}
image=$(cat ${WORKSPACE}/IMAGE)
host=${HOST}


echo "deploying ... name: ${name}, image: ${image}, host: ${host}"


rm -f web.yaml


cp $(dirname "${BASH_SOURCE[0]}")/template/web.yaml .


sed -i "s,{{name}},${name},g" web.yaml
sed -i "s,{{image}},${image},g" web.yaml
sed -i "s,{{host}},${host},g" web.yaml


kubectl apply -f web.yaml


cat web.

 

7-5 cicd实践(4)

修改deploy.sh如下 添加监控检查,注意[]中的空格 否则会报错/root/script/deploy.sh: line 37: [: missing `]' 从而导致健康检查失败.

#!/bin/bash


name=${JOB_NAME}
image=$(cat ${WORKSPACE}/IMAGE)
host=${HOST}


echo "deploying ... name: ${name}, image: ${image}, host: ${host}"


rm -f web.yaml


cp $(dirname "${BASH_SOURCE[0]}")/template/web.yaml .
echo "copy success"




sed -i "s,{{name}},${name},g" web.yaml
sed -i "s,{{image}},${image},g" web.yaml
sed -i "s,{{host}},${host},g" web.yaml


echo "ready to apply"
kubectl apply -f web.yaml
echo "apply ok "


cat web.yaml


# health check
success=0
count=60
# fen ge de shi hou zi dong sheng cheng su zhu 
IFS=","
sleep 5


while [ ${count} -gt 0 ]
do
    replicas=$(kubectl get deploy ${name}  -o go-template='{{.status.replicas}},{{.status.updatedReplicas}},{{.status.readyReplicas}},{{.status.availableReplicas}}')
    echo "replicas: ${replicas}"
    arr=(${replicas})
    if [ "${arr[0]}" == "${arr[1]}" -a "${arr[1]}" == "${arr[2]}" -a "${arr[2]}" == "${arr[3]}" ];then
        echo "health check success!"
        success=1
        break
    fi
    ((count--))
    sleep 2 
done


if [ ${success} -ne 1 ];then
    echo "health check failed!"
    e

8080 jenkins端口 可能会被master误认为是api的端口 默认是访问本地的8080.

需要同步一下.kube/config

由于master01上没有安装jenkins 就复制一下生成的web.yaml文件 测试一下最后一条启动命令了

 

web.yaml

#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pipline-step2
spec:
  selector:
    matchLabels:
      app: pipline-step2
  replicas: 1
  template:
    metadata:
      labels:
        app: pipline-step2
    spec:
      containers:
      - name: pipline-step2
        image: harbor.pdabc.com/kubernetes/pipline-step2:20191221004921
        ports:
        - containerPort: 8080
---
#service
apiVersion: v1
kind: Service
metadata:
  name: pipline-step2
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: pipline-step2
  type: ClusterIP


---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: pipline-step2
spec:
  rules:
  - host: k8s-web.pdabc.com
    http:
      paths:
      - path: /
        backend:
          serviceName: pipline-step2
          servicePort: 80

kubectl apply -f web.yaml

 

kubectl get pods

kubectl get deploy

 

查看启动pod的yaml文件

kubectl get deploy pipline-step2 -o yaml

镜像没问题

 

获取replicas的状态

 

 kubectl get deploy pipline-step2  -o go-template='{{.status.replicas}},{{.status.updatedReplicas}},{{.status.readyReplicas}},{{.status.availableReplicas}}'

 

 

可以通过deployment.kubernetes.io/revision的值 判断是否进行更新

 

在master01上起了8081的jenkins 并测试

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爷来辣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值