Bootstrap

kubesphere DevOps 流水线拉取GIT代码部署springboot 项目

   准备工作:

一个简单springboot工程,只有1个接口,返回“helloworld”,如下:

1、配置maven镜像加速

  • 由于流水线自带的maven是默认下载依赖链接,会导致maven打包时间几十分钟,若K8S资源不足,会导致整个集群瘫痪
1.1、定位到ks-devops-agent

进入:平台管理-集群管理-配置中心-配置,搜索定位到ks-devops-agent

1.2、修改配置

1.3、编辑“MavenSetting

在mirrors标签中,添加阿里云镜像加速

<mirror>
  <id>alimaven</id>
  <name>aliyun maven</name>
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  <mirrorOf>central</mirrorOf>
</mirror>

如下:

至此,maven配置完成

2、创建DevOps工程

  • 进入:平台管理-访问控制-DevOps工程
  • 点击创建按钮

我创建了一个shuizhu-persong工程

3、创建流水线

  • 进入步骤2中创建的DevOps工程
  • 进入后,点击创建按钮,创建流水线

这里可以填写代码仓库地址,也可以后面在流水线的具体步骤中进行配置,本文在后面步骤中进行配置

  • 保留构建的天数:流水线构建的制品需要保留多久
  • 保留构建的最大个数:流水线历史记录展示的个数,如设置5,列表只展示近5条
  • 其他配置默认即可,点击确定创建完成

4、编辑流水线

进入步骤3中创建的流水线,如下

注意:

上图中,如果没有编辑流水线功能,好像是kubesphere本身的bug,解决方法:

  • 创建新的用户并授权,加入到上面创建的devops中,并授予管理权限
  • 删除上面的流水线
  • 退出当前用户,登陆新用户
  • 重新创建流水线即可
4.1、编辑流水线

kubesphere平台提供了流水线模板,运维这不需要关注jenkins文件如果编写,这里我选择自定义流水线

4.2、配置代理
  • 由于我的流水线的“产品”是Springboot程序,这里我的代理label选择maven

4.3、添加【GIT代码拉取】流水线阶段

4.3.1、初始化流水线阶段信息
  • 名称:任意填写
  • 代理:选择none方式

4.3.2、指定容器

所有的构建步骤建议在容器中进行,防止确认各种工具

4.3.3、添加Git代码拉取步骤

注意:以下的步骤都是在指定容器下,进行的嵌套步骤:

填写Git信息:

注意:如果仓库是私有的,需要新增凭证即可,如下

4.3.4、maven编译代码

添加嵌套步骤---shell

添加脚本内容如下

echo '项目结构如下:'
ls
echo 'mvn clean package -Dmaven.test.skip=true start ...'
mvn clean package -Dmaven.test.skip=true
echo 'mvn clean package -Dmaven.test.skip=true end ...'
echo 'maven编译后的项目结构如下:'
ls
echo 'target目录如下:'
ls target/
4.4、添加【镜像制作】流水线阶段
4.4.1、初始化流水线阶段信息
4.4.2、指定为maven容器

4.4.3、制作docker镜像
docker build -t hello-word:v1.0 .
4.5、镜像推送
4.5.1、初始化流水线阶段信息

4.5.2、指定为maven容器

4.5.3、添加私有harbor仓库
#指定私有harbor
mkdir /etc/docker
ls /etc/docker/
touch /etc/docker/daemon.json
echo '{ "live-restore": true,"insecure-registries":["111.230.19.178:80"] }' > /etc/docker/daemon.json
4.5.4、推送镜像
docker login 111.230.19.178 -u admin -p xxxx

echo '开始推送'
docker tag hello-word:v1.0 111.230.19.178/shuizhu/hello-word-2024:v1.0
docker push 111.230.19.178/shuizhu/hello-word-2024:v1.0

4.6、发布
4.6.1、初始化流水线

4.6.2、指定为maven容器

4.6.3、创建deploy文件
  • 添加嵌入步骤
  • 选择shell,输入以下内容
touch hello-word.yaml
echo​​ '​​apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: hello-word-2024
  name: hello-word-2024
  namespace: shuizhu # 正常创建的项目空间名称,这里是我的项目
spec:
  progressDeadlineSeconds: 600
  replicas: 3
  strategy:
    type: RollingUpdate # Recreate:在创建新Pods之前,所有现有的Pods会被杀死 RollingUpdate:滚动升级,逐步替换的策略,同时滚动升级时,支持更多的附加参数
    rollingUpdate:
      maxSurge: 1  #maxSurge:1 表示滚动升级时会先启动1个pod
      maxUnavailable: 0 #maxUnavailable:1 表示滚动升级时允许的最大Unavailable的pod个数,也可以填写比例,maxUnavailable=50%
  selector:
    matchLabels:
      app: hello-word-2024
  template:
    metadata:
      labels:
        app: hello-word-2024
    spec:
      containers:
        - env:
            - name: CACHE_IGNORE
              value: js|html
          image: 111.230.19.178/shuizhu/hello-word-2024:v1.0   #需要部署的镜像名称及版本
          #注释下面代码,取消健康探测
          #readinessProbe:
          #  httpGet:
          #    path: /
          #    port: 8080
          #  timeoutSeconds: 10
          #  failureThreshold: 30
          #  periodSeconds: 5
          imagePullPolicy: Always
          name: hello-word-2024
          ports:
            - containerPort: 8080
              protocol: TCP
          resources:
            limits:
              cpu: 300m
              memory: 600Mi
            requests:
              cpu: 100m
              memory: 100Mi
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
      imagePullSecrets:
        - name: shuizhu-harbor
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      terminationGracePeriodSeconds: 30

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: hello-word-2024-service
  name: hello-word-2024-service
  namespace: shuizhu # 正常创建的项目空间名称
spec:
  ports:
    - name: http
      port: 8080
      protocol: TCP
      targetPort: 8080
  selector:
    app: hello-word-2024
  sessionAffinity: None
  type: NodePort
' >hello-word.yaml
4.6.4、kubectl发布
kubectl apply -f hello-word.yaml

5、运行流水线

  • 运行流水线

  • 运行成功

6、查看发布后的部署工程及service

  • 查看pod数量

  • 查看service

我的service对外暴露的端口为30171,可以通过K8S集群中,任意的节点IP+30171访问流水线创建的项目

7、访问流水线部署的工程

开头说了,springboot工程只有一个hello的接口,原访问的URL为:

http://127.0.0.1:8080/hello

K8S为我们暴露的端口为30171,因此,我们通过K8S任意节点IP访问即可,访问格式如下:

http://8.138.89.146:30171/hello

;