网站项目部署案例与Jenkins自动化发布项目(CI/CD)

艺帆风顺 发布于 2025-04-02 23 次阅读


网站项目部署案例与Jenkins自动化发布项目(CI/CD)

         

在K8s平台部署项目流程

         

         

在K8s平台部署Java网站项目

         

制作镜像流程

         

第一步:制作镜像

使用镜像仓库(私有仓库、公共仓库):

1、配置可信任(如果仓库是HTTPS访问不用配置)

# vi /etc/docker/daemon.json

{

"insecure-registries": ["192.168.31.90"]

}

2、 将镜像仓库认证凭据保存在K8s Secret中

kubectl create secret docker-registry registry-auth

--docker-username=admin

--docker-password=Harbor12345

--docker-server=192.168.31.90

3、在yaml中使用这个认证凭据

imagePullSecrets:

- name: registry-auth

第二步:使用控制器部署镜像

模板

Pod主要配置启动容器属性:

• 变量

• 资源配额

• 健康检查

• 卷挂载点

案例:

第三步:部署数据库

1、使用deployment部署一个mysql实例, service暴露访

kubectl apply -f mysql.yaml

kubectl get pod,svc

2、测试mysql实例是否可以访问

kubectl run mysql-client --rm -it --image=mysql:5.7.30 – bash

/# mysql -h10.106.166.31 -uroot -p'123456' #10.106.166.31为mysql ClusterIP

mysql> show databases;

3、导入项目sql文件

kubectl cp db/tables_ly_tomcat.sql mysql-client:/ # 将sql文件拷贝到mysql客户端容器中

/# mysql -h10.106.166.31 -uroot -p'123456'

mysql> create database test;

mysql> use test;

mysql> source /tables_ly_tomcat.sql;

mysql> show tables; # 只有一个user表

         

第四步:对外暴露应用

第五步:增加公网负载均衡器

Jenkins自动化发布项目(CI/CD)

发布流程设计

使用 Gitlab 作为代码仓库 & 使用 Harbor 作为镜像仓库

Harbor 镜像仓库

项目地址:https://github.com/goharbor/harbor

         

部署步骤:

# tar zxvf harbor-offline-installer-v2.0.0.tgz

# cd harbor

# cp harbor.yml.tmpl harbor.yml

         

# vi harbor.yml

         

hostname: 192.168.31.90

https: # 先注释https相关配置

harbor_admin_password: Harbor12345

         

# ./prepare

# ./install.sh

# docker-compose ps

Gitlab代码仓库

Jenkins发布系统部署

Jenkins是一款开源 CI&CD 系统,用于自动化各种任务,包括构建、测试和部署。

Jenkins官方提供了镜像:https://hub.docker.com/r/jenkins/jenkins使用Deployment来部署这个镜像,会暴露两个端口:8080 Web访问端口, 50000 Slave通信端口,容器启动后Jenkins数据存储在/var/jenkins_home目录,所以需要将该目录使用PV持久化存储。

         

先安装后面所需的插件:

Jenkins下载插件默认服务器在国外,会比较慢,建议修改国内源:

# 进入到nfs共享目录

cd /ifs/kubernetes/ops-jenkins-pvc-xxx

sed -i 's/https://updates.jenkins.io/download/https://mirrors.tuna.tsinghua.edu.cn/jenkins/g' default.json &&

sed -i 's/http://www.google.com/https://www.baidu.com/g' default.json

# 重建Jenkins

http://NodeIP:30008/restart

管理Jenkins->系统配置-->管理插件-->分别搜索Git Parameter/Git/Pipeline/kubernetes/Config File Provider,选中点击安装。

• Git:拉取代码

• Git Parameter:Git参数化构建

• Pipeline:流水线

• kubernetes:连接Kubernetes动态创建Slave代理

• Config File Provider:存储配置文件

• Extended Choice Parameter:扩展选择框参数,支持多选

Jenkins主从架构

当触发Jenkins任务时, Jenkins会调用Kubernetes API创建Slave Pod, Pod启动后会连接Jenkins,接受任务并处理。

         

Kubernetes插件配置

Kubernetes插件:用于Jenkins在Kubernetes集群中运行动态代理

插件介绍:https://github.com/jenkinsci/kubernetes-plugin

配置插件:管理Jenkins->管理Nodes和云->管理云->添加Kubernetes

自定义Jenkins-Slave镜像

构建Slave镜像Dockerfile(结合项目环境)

FROM centos:7

LABEL maintainer lizhenliang

RUN yum install -y java-1.8.0-openjdk maven git libtool-ltdl-devel &&

yum clean all &&

rm -rf /var/cache/yum/* &&

mkdir -p /usr/share/jenkins

COPY slave.jar /usr/share/jenkins/slave.jar

COPY jenkins-slave /usr/bin/jenkins-slave

COPY settings.xml /etc/maven/settings.xml

RUN chmod +x /usr/bin/jenkins-slave

COPY kubectl /usr/bin/

ENTRYPOINT ["jenkins-slave"]

测试主从架构是否正常

         

Jenkins Pipeline(流水线)

Jenkins Pipeline是一套运行工作流框架,将原本独立运行单个或者多个节点的任务链接起来,实现单个任务难以完成的复杂流程编排和可视化。

Jenkins Pipeline是一套插件,支持在Jenkins中实现持续集成和持续交付;

• Pipeline通过特定语法对简单到复杂的传输管道进行建模;

• Jenkins Pipeline的定义被写入一个文本文件,称为Jenkinsfile。

Jenkins Pipeline 语法

Stages 是 Pipeline 中最主要的组成部分, Jenkins 将会按照 Stages 中描述的顺序从上往下的执行。

• Stage:阶段,一个 Pipeline 可以划分为若干个 Stage,每个 Stage 代表一组操作,

比如:Build、 Test、 Deploy

• Steps:步骤, Steps 是最基本的操作单元,可以是打印一句话,也可以是构建一个 Docker 镜像,由各类 Jenkins 插件提供,比如命令:sh ‘mvn',就相当于我们平时 shell 终端中执行 mvn命令一样

Jenkins 流水线自动发布项目

思路-项目部署流程

在实际工作中,会维护多个项目,如果每个服务都创建一个item,势必给运维维护成本增加很大, 因此需要编写一个通用Pipeline脚本,将这些项目部署差异化部分使用Jenkins参数化,人工交互确认发布的分支、副本数、命名空间等。

部署到K8s平台-思路

将部署项目yaml文件提交到项目代码仓库里,在Slave容器里使用kubectl apply部署。

由于kubectl使用kubeconfig配置文件连接k8s集群,还需要通过Config File Provider插件将kubeconfig配置文件存储到Jenkins,然后再挂载到Slave容器中, 这样就有权限部署了(kubectl apply deploy.yaml --kubeconfig=config)

注:为提高安全性, kubeconfig文件应分配权限

         

除了上述方式,还可以使用Kubernetes Continuous Deploy插件, 将资源配置(YAML) 部署到Kubernetes,这种不

是很灵活性

         

流水线脚本与源代码一起版本管理

Jenkinsfile文件建议与源代码一起版本管理,实现流水线即代码(Pipeline as Code)。

这样做的好处:

• 自动为所有分支创建流水线脚本

• 方便流水线代码复查、追踪、迭代

• 可被项目成员查看和编辑

Jenkins从Git仓库中读取Jenkinsfile

         

k8s容器云平台架构