当前位置: 首页 > news >正文

Gitlab+Jenkins+Docker+Harbor+K8s+Rancher集群搭建CICD平台

原文链接
一、软硬件环境
角色主机名IP地址备注
masterk8s-master192.168.1.81
nodek8s-node1192.168.1.82
nodek8s-node2192.168.1.83
gitlabk8s-gitlab192.168.1.84
jenkins+dockerk8s-jenkins192.168.1.85
harbork8s-harbor192.168.1.86
rancherk8s-rancher192.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

此命令将删除当前集群的状态信息,并使其回到初始状态

初始化成功记下提示以及最后的信息,添加节点时需要

img

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_rsaid_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

img

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

image-20250505154550396

保存

进入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

勾选构建触发器

image-20250505154212829

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

image-20250505154424290

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

image-20250505154810553

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

image-20250505155429368

模拟一次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

image-20250505160353469

image-20250505160505472

image-20250505160704525

gitlab中webhooks配置

image-20250505160831858

然后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
http://www.dtcms.com/a/572821.html

相关文章:

  • Linux服务器安装jdk和maven详解
  • 回归、预测、分类三者关系
  • 微信平台微网站开发乙肝能治好吗
  • Skill 与 Workflow:让自动化更“聪明”的系统架构
  • AI+Python近红外光谱分析机器学习与深度学习实战,覆盖提示词撰写、数据预处理、回归/神经网络/集成学习/迁移学习/可解释性可视化等
  • ESP8266植入程序实现MQTT控制
  • 突击宝典:pytorch面试高频考点精析
  • 建设公司网站的背景意义上海网站开发设计培训
  • 电子商务网站的建设和流程就业培训机构有哪些
  • ICML 2025|基于大语言模型的多比特文本水印方法
  • 在 iOS 18 自动填充密码失败,如何排查?
  • Facebook海外推广:什么样的Facebook账号更好爆量?
  • vue 使用vueCli 搭建vue2.x开发环境,并且指定ts 和less
  • 在 iOS 18 离线徒步地图,如何存储和调用?
  • 【iOS】UICollectionView
  • 广东电白建设集团有限公司网站宫免费网站
  • 混淆 iOS 类名与变量名的实战指南,多工具组合把混淆做成工程能力(混淆 iOS 类名变量名/IPA 成品混淆Ipa/Guard CLI 实操)
  • sysstat 概览与使用:sar/iostat/mpstat/pidstat(含基础原理)
  • 纯flex布局来写瀑布流
  • 智能网联汽车与低空经济‌:结合5G技术拓展新兴产业
  • RDD的特点、算子与创建方法
  • 删除小目标 cocojson
  • 汽车EDI:基于知行之桥的 Gnotec EDI解决方案
  • 垂直行业门户网站建设方案自己做的网站被黑了怎么办
  • 地图可视化实践录:leaflet学习之综合示例工程设计
  • 《Python工匠》第二章 数值与字符串 关键知识摘录与梳理
  • QuickSSO 与 ECreator 实操应用案例手册
  • Flutter Android Kotlin 插件编译错误完整解决方案
  • 网站设计问题网站开发包含的项目和分工
  • FPGA—ZYNQ学习UART环回(五)