持续部署

这里以最简单的方式进行部署,不涉及到pod的弹性升级、回滚等,也不涉及ingress统一api放行等操作

前置知识点:(都是基本的搭建和简单的使用)
jenkins的搭建
harbor的搭建
linux的免密登录
gitlab+jenkins的持续集成和构建

一、环境准备

全部环境就放在四台服务器上面,k8s一主两从,然后所有环境放在同一台上面

1. K8S环境

这里是已经搭建好了的k8s集群,下次写一篇

hostnameip
k8s-m-t1192.168.109.11
k8s-s1-t1192.168.109.12
k8s-s2-t1192.168.109.13
2. 其他环境

这里我将所有环境放在一台机器上面了

其分别对应的域名(在宿主机和该环境所在的机器进行hosts域名解析):

192.168.109.123 test.nexus.cn(这个目前不需要)
192.168.109.123 test.harbor.cn
192.168.109.123 test.jenkins.cn
192.168.109.123 test.gitlab.cn

上面这些环境都是用nginx做的反向代理(这个之后可以用宝塔写个教程很简单!)

看看环境:
域名解析
关于其他环境的搭建:
jenkins的搭建
harbor的搭建
linux的免密登录
gitlab+jenkins的持续集成和构建
可以先看看上面几篇文章,熟悉一下基本环境的搭建!!

二、jenkins的配置

1. java项目和dockerfile文件

下载下面勾选的插件,用来构建镜像的(第一、二个可以不选择,安装出错也不要紧):
jenkins插件
下载完成后说说这个插件的作用:
他可以帮我们根据dockerfile构建一个镜像推送到指定的docker-harbor仓库!!
注意Dockerfile 一定要和代码放在同一处(当前目录最顶层),这样docker build and publish 插件才能生效

项目地址:gitee项目

dockerfile:

FROM adoptopenjdk/openjdk8-openj9:alpine-slim
# 端口可以改一下
EXPOSE 9999
MAINTAINER itman_cx@163.com
WORKDIR /app
# 项目名称改一下
ADD ./target/test-jenkins-latest.jar /app/app.jar
ENTRYPOINT ["java","-jar","/app/app.jar"]

文件dockerfile

2. jenkins上的配置

tips: 下面的配置是基于之前的环境做的,所以需要看下:gitlab+jenkins的持续集成和构建,之后考虑放到一篇文章当中进行书写,最近没啥时间(之后还需要忙着给毕业生或者秋招的学弟们准备八股文)
在这里插入图片描述
给harbor所在主机,即除k8s外的那台服务器(192.168.109.123)上面的docker配置:

# 修改权限
chmod 777 /var/run/docker.sock

上面是打包镜像推送到haobor上,之后k8s需要从这里进行拉取

继续往下走,配置构建镜像后的操作,去执行shell脚本部署项目:
配置

# 这里已经配置了免密,如果不会免密的,可以参考上面文章
ssh 192.168.109.11 "cd /data/jenkins/k8s/ && sh deploy.sh ${BUILD_NUMBER}"

目前jenkins上面的环境已经配置好了,接下来就看下脚本了:

3. k8s部署脚本

k8s部署脚本

配置k8s登录harbor的秘钥(下面部署pod的时候会用到):

kubectl create secret docker-registry harbor-login --docker-server=test.harbor.cn --docker-username=admin --docker-password=Harbor12345

这里记得配置一下允许http登录:
docker登录

首先是k8s_delpoyment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  # pod部署名称
  name: testjenkins
  namespace: default
spec:
  minReadySeconds: 5
  strategy:
  # indicate which strategy we want for rolling update
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 10
      maxUnavailable: 10
  replicas: 2
  selector:
    matchLabels:
      app: testjenkins
  template:
    metadata:
      labels:
        app: testjenkins
    spec:
      imagePullSecrets:
      # 这里使用了秘钥登录
      - name: harbor-login
      terminationGracePeriodSeconds: 10
      containers:
      - name: testjenkins
      # 这里是镜像地址 + 项目名 + 镜像名 + tag
        image: test.harbor.cn/test-jenkins/test-jenkins:20
        imagePullPolicy: IfNotPresent
        ports:
        # 外部访问端口
        - containerPort: 9999                
          name: web
          protocol: TCP
        livenessProbe:
          httpGet:
          # 项目请求路径
            path: /sayHello
            port: 9999
          # 容器初始化完成后,等待60秒进行探针检查
          initialDelaySeconds: 60          
          timeoutSeconds: 5
          failureThreshold: 12         
        readinessProbe:
          httpGet:
            path: /sayHello
            port: 9999
          initialDelaySeconds: 60
          timeoutSeconds: 5
          failureThreshold: 12

然后是部署service暴露服务,使用nodePort的方式:k8s_svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: testjenkins
  namespace: default
  labels:
    app: testjenkins
spec:
  selector:
    app: testjenkins
  type: NodePort
  ports:
  - name: web
    port: 9999
    targetPort: 9999
    nodePort: 31111

目前就先不部署ingress!!
上面这些文件都有了之后,就差最后一个了:deploy.sh

#!/bin/bash
workdir="/data/jenkins/k8s"
project="k8s"
job_number=$(date +%s)
cd ${workdir}
oldversion=$(cat ${project}_delpoyment.yaml | grep "image:" | awk -F ':' '{print $NF}')
newversion=$1
 
echo "old version is: "${oldversion}
echo "new version is: "${newversion}
 
##tihuan jingxiangbanben
sed -i.bak${job_number} 's/'test-jenkins:"${oldversion}"'/'test-jenkins:"${newversion}"'/g' ${project}_delpoyment.yaml

# 停止之前的service
kubectl delete -f ${project}_svc.yaml 

# 删除之前的pod,不做回滚
kubectl delete -f ${project}_delpoyment.yaml

# zhixing shengjibanben
kubectl apply -f ${project}_delpoyment.yaml --record=true

# 暴露服务
kubectl apply -f ${project}_svc.yaml

上面的内容就不解释了,有不懂的可以留言问问,这是shell知识,不细讲了,然后就是,上面两个yaml文件需要与这个脚本放在同一个文件夹下面,也就是 jenkins配置需要cd进入的那个目录下面

环境准备好了,开始测试!!!

三、测试

k8s部署第一次
这是之前部署过一次的:
测试

1. 修改代码

测试

这里只需要push就行,然后就会完成自动构建:
在这里插入图片描述
看效果:
结果
部署成功!!!

总结


感谢大家阅读、互相学习;
有问题评论或者发邮箱;
gitee:很多代码仓库;
1449697757@qq.com

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐