Gitlab+Jenkins+Docker+Harbor+K8s+Rancher集群搭建CICD平台
原文链接
一、软硬件环境
| 角色 | 主机名 | IP地址 | 备注 |
|---|---|---|---|
| master | k8s-master | 192.168.1.81 | |
| node | k8s-node1 | 192.168.1.82 | |
| node | k8s-node2 | 192.168.1.83 | |
| gitlab | k8s-gitlab | 192.168.1.84 | |
| jenkins+docker | k8s-jenkins | 192.168.1.85 | |
| harbor | k8s-harbor | 192.168.1.86 | |
| rancher | k8s-rancher | 192.168.1.87 |
二、环境准备
在所有节点操作
2.1 关闭NetworkManager
NetworkManager会和network启动是发生冲突,导致network启动失败,不能远程访问虚拟机;
systemctl stop NetworkManager #临时关闭 systemctl disable NetworkManager #永久关闭网络管理命令 systemctl start network.service #开启网络服务
2.2 设置静态ip
2.2.1查看网络配置
ifconfig #查看网络配置 或 ip addr show
2.2.2 修改网络配置文件
vi /etc/sysconfig/network-scripts/ifcfg-ens33
1)选择动态分配或者静态分配
BOOTPROTO=static #dhcp:自动分配ip ,static:静态ip
2)开启自动打开网卡
ONBOOT=yes #开启启动必须是yes
TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static #dhcp:自动分配ip ,static:静态ip DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=9c922cc8-b3ed-419a-88bd-6fd756e04880 DEVICE=ens33 ONBOOT=yes #开启启动必须是yes IPADDR=192.168.1.81 #静态ip NETMASK=255.255.255.0 # GATEWAY=192.168.1.1 #网关 DNS1=8.8.8.8 #DNS DNS2=4.4.4.4
2.2.3重启服务
systemctl restart network
2.2.4查看网络状态
systemctl status network.service
2.3 修改主机名
hostnamectl set-hostname k8s-master #k8s-master 为主机名称
2.4 所有机器关闭防火墙
systemctl stop firewalld #关闭systemctl disable firewalld #开机不自启systemctl status firewalld #查看状态
2.5 所有机器关闭selinux
swapoff -a # 临时关闭sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭swapon -s #查看swapon分区
2.6 所有机器关闭swap
swapoff -a # 临时关闭sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭swapon -s #查看swapon分区
2.7 所有节点安装docker
yum install wget.x86_64 -y rm -rf /etc/yum.repos.d/* wget -O /etc/yum.repos.d/centos7.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install docker-ce-26.1.4 -y systemctl start docker systemctl enable docker docker version
配置docker加速器
mkdir -p /etc/dockertee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://2tefyfv7.mirror.aliyuncs.com"]
}
EOFsystemctl daemon-reloadsystemctl restart docker
三、部署k8s集群
3.1 添加主机名与ip的对应关系(k8s-master、k8s-node1、k8s-node2)
cat >> /etc/hosts << EOF 192.168.1.81 k8s-master 192.168.1.82 k8s-node1 192.168.1.83 k8s-node2 EOF
source /etc/profile
3.2 将桥接的ipv4流量传递到iptables的链(k8s-master、k8s-node1、k8s-node2)
cat >> /etc/sysctl.d/k8s.conf << EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1 EOF
3.3 安装kubeadm、kubelet、kubectl(k8s-master、k8s-node1、k8s-node2)
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF yum install kubelet-1.22.2 kubeadm-1.22.2 kubectl-1.22.2 -y systemctl enable kubelet && systemctl start kubelet kubectl version
3.4 修改docker的配置(k8s-master、k8s-node1、k8s-node2)
#镜像加速 registry-mirrors
cat > /etc/docker/daemon.json <<EOF
{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://2tefyfv7.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker.service
systemctl restart kubelet.service
systemctl status kubelet.service
这里从节点的kubelet.service状态报code=exited, status=1/FAILURE是正常的 集群没有初始化导致的
3.5 部署master节点(主节点k8s-master)
3.5.1 集群初始化
kubeadm init \ --apiserver-advertise-address=192.168.163.151 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.22.2 \ --control-plane-endpoint k8s-master \ --service-cidr=172.16.0.0/16 \ --pod-network-cidr=10.244.0.0/16
这段命令是用于将一个工作节点(worker node)加入到已存在的 Kubernetes 集群中的过程。 kubeadm init 是用来初始化 Kubernetes 集群的命令。下面是一些常用的参数及其说明: --apiserver-advertise-address: 指定用于通告的 API 服务器的 IP 地址。 --apiserver-bind-port: 指定 API 服务器绑定的端口。 --control-plane-endpoint: 指定控制平面的端口。 --image-repository: 设置 Kubernetes 镜像仓库的地址。 --kubernetes-version: 设置 Kubernetes 版本。 --pod-network-cidr: 设置 Pod 网络的 CIDR 范围。 --service-cidr: 设置服务的 CIDR 范围。
1).遇到报错:
Here is one example how you may list all Kubernetes containers running in docker:- 'docker ps -a | grep kube | grep -v pause'Once you have found the failing container, you can inspect its logs with:- 'docker logs CONTAINERID'error execution phase wait-control-plane: couldn't initialize a Kubernetes cluster To see the stack trace of this error execute with --v=5 or higher
2).解决办法:
rm -rf /etc/containerd/config.toml systemctl restart containerd
如果初始化失败,可以重新初始化
kubeadm reset
此命令将删除当前集群的状态信息,并使其回到初始状态
初始化成功记下提示以及最后的信息,添加节点时需要

3.5.2 按照提示执行
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.5.3 查看kubelet.service状态
systemctl status kubelet.service
3.5.4 查看节点状态
kubectl get nodes
3.5.5 安装网络插件
# 最好手动提前拉取所需镜像 docker pull quay.io/coreos/flannel:v0.14.0 wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f kube-flannel.yml kubectl get pods --all-namespaces
3.5.6 添加node节点
在k8s-node1和k8s-node1节点执行
docker pull quay.io/coreos/flannel:v0.14.0 ## 按照master节点初始化最后的提示信息执行 kubeadm join k8s-master:6443 --token yt11th.b5wzq4lkjxcsljpg \--discovery-token-ca-cert-hash sha256:f36824a14f1acb9413246e8f5f0cdf5f6060066f7e4eec6d27edd69004499f9f
四、部署Gitlab
4.1 配置docker加速器
mkdir -p /etc/dockertee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://2tefyfv7.mirror.aliyuncs.com"]
}
EOFsystemctl daemon-reloadsystemctl restart docker
4.2 安装并配置Gitlab
docker pull beginor/gitlab-ce
4.2.1 创建共享卷目录
mkdir -p /data/gitlab/etc/ /data/gitlab/log/ /data/gitlab/data chmod 777 /data/gitlab/etc/ /data/gitlab/log/ /data/gitlab/data/
4.2.2 创建 gitlab 容器
docker run -itd --name=gitlab --restart=always --privileged=true -p 8443:443 -p 80:80 -p 222:22 -v /data/gitlab/etc:/etc/gitlab -v /data/gitlab/log:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab beginor/gitlab-ce docker ps
4.2.3 关闭容器修改配置文件
docker stop gitlab
external_url ‘http://192.168.1.84’
cat /data/gitlab/etc/gitlab.rb |grep external_url sed -i "/external_url 'GENERATED_EXTERNAL_URL'/a external_url\t'http://192.168.1.84' " /data/gitlab/etc/gitlab.rb cat /data/gitlab/etc/gitlab.rb |grep external_url
gitlab_rails[‘gitlab_ssh_host’] = ‘192.168.1.84’’
cat /data/gitlab/etc/gitlab.rb |grep gitlab_ssh_host sed -i "/gitlab_ssh_host/a gitlab_rails['gitlab_ssh_host'] = '192.168.1.84' " /data/gitlab/etc/gitlab.rb cat /data/gitlab/etc/gitlab.rb |grep gitlab_ssh_host
gitlab_rails[gitlab_shell_ssh_port] = 222
cat /data/gitlab/etc/gitlab.rb | grep gitlab_shell_ssh sed -i "/gitlab_shell_ssh_port/a gitlab_rails['gitlab_shell_ssh_port'] = 222" /data/gitlab/etc/gitlab.rb cat /data/gitlab/etc/gitlab.rb | grep gitlab_shell_ssh vim /data/gitlab/data/gitlab-rails/etc/gitlab.yml
4.2.4 修改完配置文件之后。直接启动容器
docker start gitlab docker ps
初次登录会自动跳转到修改密码(root用户),密码要满足一定的复杂性,否则会报500错误。
4.2.5 新建SSH密钥
1.进入gitlab容器
docker exec -it gitlab /bin/sh
2.生成密钥
ssh-keygen
完成 创建SSH 密钥,可以看到 ~/.ssh目录下生成了 id_rsa 和 id_rsa.pub 两个文件
3.查看密钥
cat ~/.ssh/id_rsa.pub
4.gitlab配置密钥
在gitlab界面找到ssh密钥菜单,增加ssh密钥。
五、部署harbor
5.1 安装docker-compose
yum install -y docker-compose
配置docker加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://2tefyfv7.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
5.2 使用安装包安装 harbor
harbor安装包:harbor
下载harbor:harbor-offline-installer-v2.13.0.tgz
解压安装harbor
tar -zxvf harbor-offline-installer-v2.0.6.tgz docker load -i harbor/harbor.v2.0.6.tar.gz
5.3 修改配置文件
cd harbor/ cp harbor.yml.tmpl harbor.yml vim harbor.yml
设置IP和用户名密码,注释掉https

5.4 执行./prepare && ./install.sh 初始化harbor
./prepare ./install.sh
5.5 查看相关镜像
docker ps
5.6 访问测试
http://192.168.1.86
5.7 CI服务器的docker配置(jenkins:192.168.1.85)
这里因为我们要在192.168.1.85(CI服务器)上push镜像到192.168.1.86(私仓),需要修改CI服务器上的Docker配置。
vim /etc/docker/daemon.json
{"registry-mirrors": ["https://2tefyfv7.mirror.aliyuncs.com"],"insecure-registries": ["192.168.1.86"]
}
systemctl daemon-reload systemctl restart docker
CI机器简单测试一下
docker login 192.168.1.86 用户名admin,密码Harbor12345
测试上传镜像
docker tag beginor/gitlab-ce 192.168.1.86/library/gitlab-ce #beginor/gitlab-ce为本地镜像 可以自定义 docker images docker push 192.168.1.86/library/gitlab-ce
5.8 CD服务器的docker配置(k8s-master、k8s-node1、k8s-node2)
vim /etc/docker/daemon.json
{"registry-mirrors": ["https://2tefyfv7.mirror.aliyuncs.com"],"insecure-registries": ["192.168.1.86"]
}
systemctl daemon-reload systemctl restart docker
CD机器登录测试
docker login 192.168.1.86 用户名admin,密码Harbor12345
5.9 harbor开机启动
vim /lib/systemd/system/harbor.service
[Unit] Description=Harbor After=network.service docker.service systemd-networkd.service systemd-resolved.service Requires=docker.service Documentation=http://github.com/vmware/harbor[Service] Type=simple Restart=on-failure RestartSec=5 ExecStart=/usr/bin/docker-compose -f /root/harbor/docker-compose.yml up ExecStop=/usr/bin/docker-compose -f /root/harbor/docker-compose.yml down[Install] WantedBy=multi-user.target
重载配置
chmod 755 /lib/systemd/system/harbor.service systemctl restart harbor systemctl status harbor systemctl enable harbor
六、安装jenkins,并配置jdk、node和maven
6.1 镜像jenkins拉取
docker pull jenkins/jenkins:2.507
6.2 二次打包jenkins
创建一个文件夹,用于二次打包jenkins镜像
mkdir -p /data/jenkins cd /data/jenkins
提前准备好jdk、maven、node,并放到/data/jenkins下
由于3.8.x以上版本的maven只支持https协议,我们需要覆盖原有的settings.xml,让它支持http
准备settings.xml,文件内容如下
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd"> </settings>
我们需要将镜像进行二次打包,把我们所需要的东西都加进去,新建Dockerfile
FROM jenkins/jenkins:2.507 EXPOSE 8080 # 将maven和jdk添加到容器中 # tar.gz添加进去后会自动解压,无需手动解压 ADD apache-maven-3.9.9-bin.tar.gz /usr/local ADD jdk-8u441-linux-x64.tar.gz /usr/local ADD node-v18.19.0-linux-x64.tar.gz /usr/local # 覆盖容器里的settings.xml ADD settings.xml /usr/local/apache-maven-3.9.9/conf/ # 配置环境变量 ENV TZ=Asia/Shanghai ENV M2_HOME=/usr/local/apache-maven-3.9.9 ENV NODE_HOME=/usr/local/node-v18.19.0-linux-x64 # 配置maven、node的环境变量 # jdk环境变量不可在这里配,会影响jenkins的运行 ENV PATH=$M2_HOME/bin:$NODE_HOME/bin:$PATH
提前创建好jenkins_home,并授予最高权限
mkdir jenkins_home chmod +777 jenkins_home
现在/data/jenkins下就会有这么几个文件
-rw-r--r--. 1 root root 9102945 8月 18 2024 apache-maven-3.9.9-bin.tar.gz -rw-r--r-- 1 root root 637 4月 29 10:25 Dockerfile -rw-r--r-- 1 root root 148447944 4月 29 10:17 jdk-8u441-linux-x64.tar.gz drwxrwxrwx 20 root root 4096 5月 5 09:44 jenkins_home -rw-r--r-- 1 root root 44694523 4月 29 10:18 node-v18.19.0-linux-x64.tar.gz -rw-r--r-- 1 root root 291 4月 29 10:18 settings.xml
进行二次打包
docker build -t jenkins .
打包后,就能看到我们打包后的镜像
授予docker.sock权限,因为一会儿进入jenkins容器的时候要用docker命令
chmod +777 /var/run/docker.sock
6.3 运行容器
docker run -d --name jenkins \ -p 0.0.0.0:8080:8080 \ -v /data/jenkins/jenkins_home:/var/jenkins_home \ -v /etc/localtime:/etc/localtime \ -v /run/docker.sock:/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker \ jenkins
等待一两分钟,访问访问你的ip地址:8080即可看到jenkins的首页
获取密码
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
安装推荐的插件即可,完成后会弹出以下页面,使用admin账户登陆就可以了,进入Jenkins后要先修改密码,否则之后就进不去了,右上角,进入Security
刚刚Dockerfile,我们并没有配置jdk的环境变量,所以这边要手动配置一下
进入工具配置Manage Jenkins->Tools:
新增JDK->别名(JDK8)->JAVA_HOME(/usr/local/jdk1.8.0_441可以进入容器内查看:docker exec -it jenkins bash)->保存
测试:
新建项目->流水线(Pipeline script)脚本:勾选“使用Grppvy沙盒”
pipeline {agent anytools {// 刚刚配置jdk的名称jdk 'jdk8'}stages {stage('test') {steps {script {sh """docker -vjava -versionmvn -vnode -vnpm -v"""}}}}
}
点击立即构建
6.4 配置 jenkins容器到其他服务的ssh免密登录
jenkins执行构建命令时,需要ssh访问jenkins容器所在服务器(192.168.1.85)和k8s主节点服务器(192.168.1.81),所以需要配置ssh免密登录
在jenkins容器所在服务器(192.168.1.85)上进入jenkins容器
docker exec -it jenkins bash
生成密钥
ssh-keygen -t rsa
将公钥复制到jenkins容器所在服务器(192.168.1.85)
ssh-copy-id root@192.168.1.85
将公钥复制到k8s主节点服务器(192.168.1.81)
ssh-copy-id root@192.168.1.81
6.5 k8s 创建私有镜像仓库Secret(k8s主节点服务器192.168.1.81)
k8s需要从harbor私有进行仓库拉取镜像时,需要创建Secret,配置harbor私有镜像仓库地址、账号密码
#docker-registry是关键字 harbor-registry是自定义的名称与demo.yaml中的imagePullSecrets.name值一致 kubectl -n default create secret docker-registry harbor-registry --docker-email=baidu.com@example --docker-username=admin --docker-password=Harbor12345 --docker-server=192.168.1.86
kubectl get secret harbor-registry #查看secret
Jenkins WAR 文件下载地址:https://www.jenkins.io/zh/download/(未使用)
七、Jenkins整合Docker实现CICD自动化部署(若依项目)
1、安装mysql
docker run -d \ --name mysql \ -p 0.0.0.0:3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 \ --restart=always \ mysql:8.0.39
2、安装redis
docker run -d \ --name redis \ -p 0.0.0.0:6379:6379 \ --restart=always \ redis:7.4.1
3、jenkins安装gitlab插件
进入系统管理,插件管理,搜索gitlab插件进行安装
4、开始部署
拉取若依项目前后端分离版,根目录有个ruoyi-ui,这是前端项目,我们把它移动到外层,分成2个项目部署
4.1、部署后端项目
将两个sql文件导入到数据库中,到application-druid.yml中修改数据库的连接信息,到application.yml中修改redis的连接信息
根目录新建Dockerfile
# 若依需要用jdk8来运行 FROM openjdk:8u342 # 解决时区问题 ENV TZ=Asia/Shanghai # 将jar包添加到容器中 ADD ruoyi-admin/target/ruoyi-admin.jar app.jar # 运行容器时应该执行的命令 ENTRYPOINT ["java", "-jar", "app.jar"]
根目录新建Jenkinsfile
pipeline {
// docker stop $APP_NAME || true
// docker rm $APP_NAME || true
// docker run -d --name $APP_NAME \
// -p 0.0.0.0:$APP_PORT:$APP_PORT \
// --restart=always \
// $APP_NAME \
// --server.port=$APP_PORT
// docker login -u $DOCKER_USER -p $DOCKER_PASS 192.168.1.86// 任意节点都可以执行Jenkins流水线agent anytools {// 刚刚配置的java环境jdk 'jdk8'}// 环境变量environment {// 项目名称APP_NAME = 'ruoyi-server'// 端口
// APP_PORT = 9800DOCKER_USER = 'admin'DOCKER_PASS = 'Harbor12345'}// 流水线阶段stages {// 构建阶段stage('build') {// 步骤steps {// 可以写流水线脚本,groovy语法script {// 执行shell命令sh 'mvn clean package -DskipTests=true'}}}// 部署阶段stage('deploy') {steps {script {sh """docker rmi $APP_NAME || truedocker rmi 192.168.1.86/ruoyi-vue/$APP_NAME || truedocker build -t $APP_NAME .docker tag $APP_NAME 192.168.1.86/ruoyi-vue/$APP_NAMEdocker logout 192.168.1.86 || truessh -tt root@192.168.1.85 'docker login -u $DOCKER_USER -p $DOCKER_PASS 192.168.1.86docker push 192.168.1.86/ruoyi-vue/$APP_NAME'scp /var/jenkins_home/workspace/ruoyi-server/ruoyi-vue.yaml root@192.168.1.81:/ssh -tt root@192.168.1.81 '/usr/bin/kubectl delete -f /ruoyi-vue.yaml' || truessh -tt root@192.168.1.81 '/usr/bin/kubectl apply -f /ruoyi-vue.yaml'"""}}}}
}
根目录新建.dockerignore,为了提高docker的构建速度,把不必要的文件屏蔽起来
.git ruoyi-admin/src ruoyi-admin/target/classes ruoyi-admin/target/generated-sources ruoyi-admin/target/maven-archiver ruoyi-admin/target/maven-status ruoyi-common ruoyi-framework ruoyi-generator ruoyi-quartz ruoyi-system ruoyi-ui sql
根目录创建ruoyi-vue.yaml
apiVersion: apps/v1 kind: Deployment metadata:name: ruoyi-vuelabels:app: ruoyi-vue spec:replicas: 1selector:matchLabels:app: ruoyi-vuetemplate:metadata:labels:app: ruoyi-vuespec:imagePullSecrets: #使用imagePullSecrets参数指定镜像拉取秘钥- name: harbor-registry #使用我们的secret,即harbor-registrycontainers:- name: ruoyi-vueimage: 192.168.1.86/ruoyi-vue/ruoyi-server:latestports:- containerPort: 8080 #修改成你项目的端口imagePullPolicy: IfNotPresent #镜像拉取策略:每次都拉去最新的镜像# Always#1.描述:无论本地是否存在该镜像,总是尝试从远程仓库拉取最新的镜像。#2.使用场景:#开发或测试环境,需要确保每次启动容器时都使用最新的镜像。#持续集成和持续部署(CI/CD)流程中,需要频繁更新镜像。#3.注意事项:使用 latest 标签时,默认策略为 Always。这可能导致镜像版本不一致或潜在的不稳定,因此在生产环境中应谨慎使用。# IfNotPresent#1.描述:如果本地没有该镜像,则从远程仓库拉取;如果本地已经存在同名的镜像,则直接使用本地镜像,不会尝试拉取更新。#2.使用场景:#生产环境,减少网络流量,提升启动速度。#镜像版本稳定,不需要频繁更新。#3.注意事项:这是 Kubernetes 的默认拉取策略。对于带有明确版本标签(如 v1.0)的镜像,推荐使用此策略。# Never#1.描述:永远不会尝试从远程仓库拉取镜像,总是使用本地镜像。如果本地没有该镜像,容器创建将失败。#2.使用场景:#离线环境,所有镜像都已提前下载。#确保容器使用的是本地已有的镜像,避免自动升级。#3.注意事项:使用此策略时,需要确保所有节点上都有所需的镜像。# OnFailure(Kubernetes 1.19 引入,Beta 特性)#1.描述:如果本地镜像存在,首先尝试使用本地镜像启动容器。如果容器启动失败(例如,因为镜像损坏或不兼容),则尝试从远程仓库拉取镜像。#2.使用场景:希望减少网络请求,但同时希望在本地镜像存在问题时能够回退到远程镜像。# 默认策略#1.如果省略了 imagePullPolicy 字段:#容器镜像的标签是 latest 时,默认策略为 Always。#容器镜像的标签是非 latest 时,默认策略为 IfNotPresent。 --- apiVersion: v1 kind: Service metadata:name: ruoyi-vuelabels:app: ruoyi-vue spec:ports:- name: httpport: 8080 #修改成你项目的端口nodePort: 30001 ##容器暴露的访问端口,要确定无冲突,否则需修改type: NodePortselector:app: ruoyi-vue
检查项目中是否已经有了这几个文件
.dockerignore Dockerfile Jenkinsfile ruoyi-vue.yaml
将项目提交到gitlab
Jenkins中新建任务
任务名称:ruoyi-server,流水线,Pipeline Script from SCM,选择Git,Repository URL粘贴git项目的ssh地址
ssh://git@192.168.1.84:222/root/ruoyi-vue.git

保存
进入Jenkins容器
docker exec -it jenkins bash
生产ssh密钥
ssh-keygen # 然后3个回车
将公钥配置到gitlab中
cat ~/.ssh/id_rsa.pub
复制粘贴到gitlab到新增ssh Keys中
进行一次ssh通信,然后将信息保存下来,这步仍然是在jenkins容器中操作的
# 192.168.1.84是gitlab的地址,222是gitlab的ssh端口 ssh-keyscan -p 222 192.168.1.84 >> ~/.ssh/known_hosts
查看一下.ssh目录下的文件
ls -l ~/.ssh
-rw------- 1 jenkins jenkins 2610 Apr 29 14:05 id_rsa -rw-r--r-- 1 jenkins jenkins 574 Apr 29 14:05 id_rsa.pub -rw------- 1 jenkins jenkins 1772 Apr 29 15:03 known_hosts
勾选构建触发器

展开高级,找到Secret token,点击Generate生成,就会生成一串token,这串token一会儿到gitlab中会用上

到gitlab中Settings中有一个Webhooks,添加一个webhook

如果出现“Invalid url given”错误,说明github没有开启webhook,到管理员设置中,找到Network,找到Allow requests to the local network from webhooks and integrations,勾上

模拟一次push事件,Jenkins应该在构建了
4.2部署前端项目
添加nginx.conf
server {# 前端访问端口listen 9801;
# 前端location / {# 前端页面路径root /usr/share/nginx/html;# 尝试着从$uri寻找静态资源,找不到就到$uri/找,如果还是找不到就找/index.htmltry_files $uri $uri/ /index.html;}
# 后端location /prod-api {# 去掉/prot-api开头rewrite ^/prod-api/(.*)$ /$1 break;# 真实的后端地址,根据实际情况修改proxy_pass http://192.168.1.81:30001;}
}
添加Dockerfile
# 使用nginx镜像来部署 FROM nginx:1.26.2 # 解决文件名乱码问题 ENV LC_ALL=C.UTF-8 # 删除默认的配置文件 RUN rm -rf /etc/nginx/conf.d/default.conf # 将nginx配置文件添加到容器 ADD nginx.conf /etc/nginx/conf.d # 前端打包后,将dist下的文件复制到容器里 COPY dist/ /usr/share/nginx/html/
添加.dockerignore
node_modules src
添加Jenkinsfile
pipeline {agent anyenvironment {// 项目名称APP_NAME = 'ruoyi-ui'// 端口APP_PORT = 9801}stages {stage('build') {steps {script {// 进行打包sh """npm installnpm run build:prod"""}}}stage('deploy') {steps {script {sh """docker stop $APP_NAME || truedocker rm $APP_NAME || truedocker rmi $APP_NAME || truedocker rmi 192.168.1.86/ruoyi-vue/$APP_NAME || truedocker build -t $APP_NAME .docker tag $APP_NAME 192.168.1.86/ruoyi-vue/$APP_NAMEdocker logout 192.168.1.86 || truessh -tt root@192.168.1.85 'docker login 192.168.1.86docker push 192.168.1.86/ruoyi-vue/$APP_NAME'scp /var/jenkins_home/workspace/ruoyi-ui/ruoyi-ui.yaml root@192.168.1.81:/ssh -tt root@192.168.1.81 '/usr/bin/kubectl delete -f /ruoyi-ui.yaml' || truessh -tt root@192.168.1.81 '/usr/bin/kubectl apply -f /ruoyi-ui.yaml'"""}}}}
}
// docker run -d --name $APP_NAME \
// -p 0.0.0.0:$APP_PORT:$APP_PORT \
// --restart=always \
// $APP_NAME
添加ruoyi-ui.yaml
apiVersion: apps/v1 kind: Deployment metadata:name: ruoyi-uilabels:app: ruoyi-ui spec:replicas: 1selector:matchLabels:app: ruoyi-uitemplate:metadata:labels:app: ruoyi-uispec:imagePullSecrets: #使用imagePullSecrets参数指定镜像拉取秘钥- name: harbor-registry #使用我们的secret,即harbor-registrycontainers:- name: ruoyi-uiimage: 192.168.1.86/ruoyi-vue/ruoyi-ui:latestports:- containerPort: 9801 #修改成你项目的端口imagePullPolicy: Always #镜像拉取策略:每次都拉去最新的镜像 --- apiVersion: v1 kind: Service metadata:name: ruoyi-uilabels:app: ruoyi-ui spec:ports:- name: httpport: 9801 #修改成你项目的端口nodePort: 30002 ##容器暴露的访问端口,要确定无冲突,否则需修改type: NodePortselector:app: ruoyi-ui
检查一下有没有这几个文件
.dockerignore Dockerfile Jenkinsfile nginx.conf ruoyi-ui.yaml
提交代码到gitlab
Jenkins再新建一个项目
任务名称:ruoyi-server,流水线,Pipeline Script from SCM,选择Git



gitlab中webhooks配置

然后push代码,等待Jenkins构建
八、部署Rancher
1、选择 Rancher 版本
| 标签 | 描述 |
|---|---|
rancher/rancher:latest | 最新的开发版本。这些版本通过了我们的 CI 自动化验证。不推荐在生产环境使用这些版本。 |
rancher/rancher:stable | 最新的稳定版本。推荐将此标签用于生产环境。 |
rancher/rancher:<v2.X.X> | 你可以使用以前版本中的标签来指定要安装的 Rancher 版本。访问 DockerHub 查看可用的版本。 |
docker run -d --privileged -p 80:80 -p 443:443 -v /data/rancher:/var/lib/rancher --restart=always --name rancher rancher/rancher:stable
2、docker安装Rancher
(1)创建Rancher挂载目录
mkdir -p /data/rancher/k3s/agent/images/
(2)复制容器中的镜像tar包,防止挂载之后镜像包丢失导致创建集群报错
避免:Internal error occurred: failed calling webhook "default.cluster.cluster.x-k8s.io"
docker run --rm --entrypoint "" -v $(pwd):/output registry.cn-hangzhou.aliyuncs.com/rancher/rancher:v2.9.0 cp /var/lib/rancher/k3s/agent/images/k3s-airgap-images.tar /output/k3s-airgap-images.tar
(3)复制镜像包到挂载目录下
cp k3s-airgap-images.tar /data/rancher/k3s/agent/images/
(4)启动容器
docker run -d --privileged --restart=unless-stopped -p 80:80 -p 443:443 -e CATTLE_SYSTEM_DEFAULT_REGISTRY=registry.cn-hangzhou.aliyuncs.com -e CATTLE_BOOTSTRAP_PASSWORD=rancher -v /data/rancher:/var/lib/rancher --name rancher registry.cn-hangzhou.aliyuncs.com/rancher/rancher:v2.9.0
注意:设置镜像仓库为阿里云镜像仓库:
registry.cn-hangzhou.aliyuncs.com
