持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚

目录

一、实验

1.环境

2.GitLab新建项目存放K8S部署文件

[3.Jenkins手动测试前端项目CD 流水线代码(下载部署文件)](#3.Jenkins手动测试前端项目CD 流水线代码(下载部署文件))

[4. 将K8S master节点配置为jenkins从节点](#4. 将K8S master节点配置为jenkins从节点)

[5.K8S 手动回滚前端项目版本](#5.K8S 手动回滚前端项目版本)

[6.Jenkins手动测试前端项目CD 流水线代码(发布应用)](#6.Jenkins手动测试前端项目CD 流水线代码(发布应用))

[7.Jenkins手动测试前端项目CD 流水线代码(添加选择回滚功能)](#7.Jenkins手动测试前端项目CD 流水线代码(添加选择回滚功能))

[8. Jenkins创建前端项目CD流水线](#8. Jenkins创建前端项目CD流水线)

[9. GitLab修改代码](#9. GitLab修改代码)

[10. Jenkins手动构建前端项目CI流水线](#10. Jenkins手动构建前端项目CI流水线)

[11. K8S node节点连接Harbor拉取镜像](#11. K8S node节点连接Harbor拉取镜像)

12.Jenkins通过GitLab共享库实现前端项目在K8S自动发布应用

二、问题

[1. jenkins从节点配置页面显示端口被禁用](#1. jenkins从节点配置页面显示端口被禁用)

[2.将K8S master节点配置为jenkins从节点报错](#2.将K8S master节点配置为jenkins从节点报错)


一、实验

1.环境

(1)主机

表1 主机

|---------|--------------|----------|---------------------|---------------------|
| 主机 | 架构 | 版本 | IP | 备注 |
| master1 | K8S master节点 | 1.20.6 | 192.168.204.180 | jenkins slave (从节点) |
| node1 | K8S node节点 | 1.20.6 | 192.168.204.181 | |
| node2 | K8S node节点 | 1.20.6 | 192.168.204.182 | |
| jenkins | jenkins主节点 | 2.414.2 | 192.168.204.15:8080 | gitlab runner (从节点) |
| | harbor私有仓库 | 1.2.2 | 192.168.204.15 | |
| gitlab | gitlab 主节点 | 12.10.14 | 192.168.204.8:82 | jenkins slave (从节点) |
| | sonarqube | 9.6 | 192.168.204.8:9000 | |

2.GitLab新建项目存放K8S部署文件

(1)新建项目

(2)K8S查看节点及部署文件

bash 复制代码
# kubectl get nodes

# cat devops03-devops-ui.yaml

(3)将部署文件复制到GitLab项目

(4)完成提交

(5)查看项目编号为22

3.Jenkins手动测试前端项目CD 流水线代码(下载部署文件)

(1)在回放中运行测试代码

bash 复制代码
@Library("mylib@master") _
import org.devops.*

def gitlabbutil = new Gitlab()

pipeline {
    agent { label "build"}
    options {
        skipDefaultCheckout true
    }
    stages{
        stage("GetDeployFile"){
            steps{
                script {
                    println("GetCode")
                    fileData = gitlabbutil.GetRepoFile(22,"deployment.yaml", "master")
                    println(fileData)
                }
            }
        }
    }
}

(2)成功

(3)生成流水线脚本实现写入文件

(4)回放中运行代码测试代码

bash 复制代码
@Library("mylib@master") _
import org.devops.*

def gitlabbutil = new Gitlab()
pipeline {
    agent { label "build"}
    options {
        skipDefaultCheckout true
    }
    stages{
        stage("GetDeployFile"){
            steps{
                script {
                    println("GetCode")
                    fileData = gitlabbutil.GetRepoFile(22,"deployment.yaml", "master")
                    println(fileData)

                    writeFile file: 'deployment.yaml', text: fileData

                    sh "ls -l; cat deployment.yaml"
                }
            }
        }
    }
}

(2)成功

4. 将K8S master节点配置为jenkins从节点

(1)Jenkins添加节点

(2)设置

(3)配置界面

(4)K8S master节点创建目录下载jar包

bash 复制代码
# mkdir /tmp/jenkinsagent

# cd /tmp/jenkinsagent

#  wget http://192.168.204.15:8080/jnlpJars/agent.jar

选择第3种方式进行安装

运或者运行脚本

(5)成功添加

(6)查看节点列表

K8S 集群关闭了Swap Space

5.K8S 手动回滚前端项目版本

(1)查看历史

# kubectl rollout history deployment/devops03-devops-ui -n devops03

(2)查看具体某一个历史版本信息

bash 复制代码
# kubectl rollout history deployment/devops03-devops-ui --revision=3 -n devops03
 
# kubectl rollout history deployment/devops03-devops-ui --revision=4 -n devops03

(3) 另开一个终端用watch命令观察pod变化

# watch -n 1 "kubectl get pod -n devops03"

(4)外部测试访问(当前版本为1.1.6)

bash 复制代码
# curl http://devops03-devops-ui.devops.com:31291

(5)回滚指定版本

bash 复制代码
# kubectl rollout undo deployment/devops03-devops-ui --to-revision=3 -n devops03


(6)观察pod变化

(7)外部测试访问(回滚版本为1.1.5)

bash 复制代码
#  curl http://devops03-devops-ui.devops.com:31291

6.Jenkins手动测试前端项目CD 流水线代码(发布应用)

(1)回放中运行代码测试代码

bash 复制代码
@Library("mylib@master") _
import org.devops.*

def gitlabbutil = new Gitlab()
env.groupName = "${JOB_NAME}".split("/")[0]
env.projectName ="${JOB_NAME}".split("/")[-1].split("_")[0]

pipeline {
    agent { label "k8s"}

    options {
        skipDefaultCheckout true
    }
    stages{
        stage("GetDeployFile"){
            steps{
                script {
                    println("GetCode")
                    fileData = gitlabbutil.GetRepoFile(22,"deployment.yaml", "master")
                    //println(fileData)
                    sh "rm -fr deployment.yaml"
                    writeFile file: 'deployment.yaml', text: fileData
                    //sh "ls -l; cat deployment.yaml"
                    sh "ls -l "
                }
            }
        }
        stage("DeployAPP"){
            steps{
                script{
                    namespace = "${env.groupName}"
                    appName = "${env.projectName}"
                    sh """
                        ## 发布应用
                        kubectl apply -f deployment.yaml -n ${namespace}
                    """

                    // 获取应用状态
                    5.times{
                        sh "sleep 2; kubectl -n ${namespace}  get pod | grep ${appName} "
                    }
                }
            }
        }
    }
}

(2)成功

(3)观察pod变化

(4)外部测试访问(版本升级为1.1.6)

bash 复制代码
#  curl http://devops03-devops-ui.devops.com:31291

7.Jenkins手动测试前端项目CD 流水线代码(添加选择回滚功能)

(1)先手动回滚为1.1.5

bash 复制代码
# kubectl rollout undo deployment/devops03-devops-ui -n devops03
deployment.apps/devops03-devops-ui rolled back

(2)观察pod变化

(3) 外部测试访问(当前版本回滚为为1.1.5)

bash 复制代码
# curl http://devops03-devops-ui.devops.com:31291

(4)回放中运行代码测试代码

bash 复制代码
@Library("mylib@master") _
import org.devops.*

def gitlabbutil = new Gitlab()
env.groupName = "${JOB_NAME}".split("/")[0]
env.projectName ="${JOB_NAME}".split("/")[-1].split("_")[0]

pipeline {
    agent { label "k8s"}

    options {
        skipDefaultCheckout true
    }
    stages{
        stage("GetDeployFile"){
            steps{
                script {
                    println("GetCode")
                    fileData = gitlabbutil.GetRepoFile(22,"deployment.yaml", "master")
                    //println(fileData)
                    sh "rm -fr deployment.yaml"
                    writeFile file: 'deployment.yaml', text: fileData
                    //sh "ls -l; cat deployment.yaml"
                    sh "ls -l "

                }
            }
        }

        stage("DeployAPP"){
            steps{
                script{
                    env.namespace = "${env.groupName}"
                    env.appName = "${env.projectName}"
                    sh """
                        ## 发布应用
                        kubectl apply -f deployment.yaml -n ${env.namespace}
                    """

                    // 获取应用状态
                    5.times{
                        sh "sleep 2; kubectl -n ${env.namespace}  get pod | grep ${env.appName} "
                    }
                }
            }
        }

        stage("RollOut"){
            input {
                message "是否进行回滚"
                ok "提交"
                submitter "david,aa"
                parameters {
                    choice(choices: ['yes','no'], name: 'opts')
                }

            }

            steps{
                script{
                    switch ("${opts}"){
                        case "yes":
                            sh " kubectl rollout undo deployment/${env.appName} -n ${env.namespace}"
                            break

                        case "no":
                            break
                    }
                }
            }
        }
    }
}

(5)观察pod变化

(6) 外部测试访问(当前版本为1.1.6)

bash 复制代码
# curl http://devops03-devops-ui.devops.com:31291

(6)Blue Ocean弹出选项,选择yes

(7) 观察pod变化

(8)外部测试访问(当前版本回滚为1.1.5)

bash 复制代码
# curl http://devops03-devops-ui.devops.com:31291

8. Jenkins创建前端项目CD流水线

(1)Jenins新建前端项目CD流水线

(2)去除其他参数,修改脚本路径

9. GitLab修改代码

(1)GitLab共享库新建K8S CD流水线

(2)将之前测试成功的代码复制过来

(3)GitLab前端项目新建分支RELEASE-1.1.7

10. Jenkins手动构建前端项目CI流水线

(1)Jenkins手动构建,分支输入RELEASE-1.1.7

(2)Jenkins添加视图

(3)查看CI和CD视图

(4)成功

(5)Blue Ocean 查看

(6)Harbor查看镜像

bash 复制代码
192.168.204.15/devops03/devops03-devops-ui:RELEASE-1.1.7

(7)Build Now 直接构建

(8)观察pod变化

(9) 外部测试访问(版本升级为1.1.6)

bash 复制代码
#  curl http://devops03-devops-ui.devops.com:31291

11. K8S node节点连接Harbor拉取镜像

(1)拉取镜像

bash 复制代码
# docker login -u admin -p Harbor12345 192.168.204.15
 
# docker pull 192.168.204.15/devops03/devops03-devops-ui:RELEASE-1.1.7
 
# docker logout 192.168.204.15

(2)node1 节点

(3)node2节点

12.Jenkins通过GitLab共享库实现前端项目在K8S自动发布应用

(1)GitLab修改部署文件

修改前:

修改后:

(2)Build Now 直接构建

(3)观察pod变化

(4) 外部测试访问(当前版本为1.1.7)

bash 复制代码
# curl http://devops03-devops-ui.devops.com:31291

(5)Blue Ocean弹出界面,选择no (不进行回滚)

(6) 完成

二、问题

1. jenkins从节点配置页面显示端口被禁用

(1)报错

(2)原因分析

未启用WebSocket

(3) 解决方法

启用WebSocket

2.将K8S master节点配置为jenkins从节点报错

(1)报错

(2)原因分析

bash 复制代码
根据报错信息可以得知,报错的原因是由于编译这份java代码的版本和当前用于运行的java版本并不一致。并且编译的版本仅支持52.0或以上的运行版本。从而可以得知,当前用于运行的java版本低于52.0。

而首先需要了解,什么是编译的版本,什么是运行的版本。需要区分开jre和jdk。

在安装java环境的时候,一个版本会分别对应两个文件夹,分别是jre和jdk。而jre表示的是java runtime environment ,即java的运行环境,而jdk表示的是Java SE Development kit(JDK),即java的编译环境。

java -version查看的是jre的版本(运行环境)。
javac -version查看的是jdk的版本(编译环境)。

(3)解决方法

bash 复制代码
在查看版本后发现不一致,那么就去重新配置一下环境,保证版本一致后重新编译运行即可。

需要说明的是,我这里这份代码并不是我编写的,并且也只拿到了编译完成后的class文件,因此只能通过解决更换运行的java版本解决这个问题。

而从报错信息中可以知道,这份代码在编译后,仅支持用52.0及以上的java版本的jre环境运行,即使不知道52.0的版本对应的是哪个java版本,但肯定是需要高于1.8.0的。并且为了避免以后产生问题,我计划直接更新整个java的版本,即将jdk和jre换成一个新的版本,也考虑到以后可能还需要用到1.8.0的版本,因此并不会把1.8.0的版本删除。

① 查询java版本

bash 复制代码
# java -version

②本机自带jdk 先卸载jdk

bash 复制代码
# rpm -qa|grep java 
 
# rpm -e --nodeps xxxxx

查询

删除

再次查询

③ 新版的Jenkins需要安装JDK11的JAVA环境,所以我们首先要配置JDK

Java Archive Downloads - Java SE 11 | Oracle 中国

bash 复制代码
#下载完之后拖到opt目录下
cd /opt
 
#安装JDK11
rpm -ivh jdk-11.0.15.1_linux-x64_bin.rpm

#配置环境变量
vim /etc/profile
export JAVA_HOME=/usr/java/jdk-11.0.15.1
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin

#刷新配置
source /etc/profile

#查看java版本
java -version 

④ ssh-copy-id 被控端IP 需要输入对应主节的root密码

bash 复制代码
# ssh-copy-id root@192.168.204.180

⑤ 运行脚本

⑥ 成功添加

相关推荐
AKA小徐20 分钟前
Debian12使用RKE2离线部署3master2node三主两从的k8s集群详细教程
kubernetes·rancher·rke2
Simp1e_a6 小时前
最大转矩电流比(MTPA)
科技·自动化·硬件工程·能源·制造
PieroPc10 小时前
Python 自动化 打开网站 填表登陆 例子
运维·python·自动化
VinciYan10 小时前
基于Jenkins+Docker的自动化部署实践——整合Git与Python脚本实现远程部署
python·ubuntu·docker·自动化·jenkins·.net·运维开发
一条测试老狗12 小时前
【UI自动化】从WebDriver看Selenium与Appium的底层关联
selenium·appium·自动化
Linux运维技术栈13 小时前
Ansible(自动化运维)环境搭建及ansible-vault加密配置
运维·自动化·ansible
花晓木15 小时前
k8s etcd 数据损坏处理方式
容器·kubernetes·etcd
运维&陈同学15 小时前
【模块一】kubernetes容器编排进阶实战之基于velero及minio实现etcd数据备份与恢复
数据库·后端·云原生·容器·kubernetes·etcd·minio·velero
花晓木15 小时前
k8s备份 ETCD , 使用velero工具进行备份
容器·kubernetes·etcd
liuxuzxx18 小时前
Istio-2:流量治理之简单负载均衡
云原生·kubernetes·istio