二、搭建 CI/CD 环境(GitLab + GitLab Runner 实操)
在上一篇博客中,我们已经完成了整个架构的底层支撑:Harbor 私有仓库、K8s 集群、Flannel 网络插件均已就绪。现在,我们将开始搭建整个自动化部署的 "大脑"------CI/CD 流水线环境。
在这一篇中,我们将部署:
- GitLab Server:作为代码托管中心和 CI/CD 控制中心
- GitLab Runner:作为流水线执行器,负责拉取代码、构建镜像、推送至 Harbor 并部署到 K8s 集群
这两个组件搭建完成后,我们就可以编写.gitlab-ci.yml文件,实现 "提交代码 → 自动构建镜像 → 推送 Harbor → 自动部署到 K8s" 的全流程自动化,彻底告别手动部署。
1、部署 GitLab 代码仓库
参考官方文档:https://docs.gitlab.com/ee/install/docker/installation.html
首先在 gitlab-server(192.168.223.23)服务器执行以下命令创建挂载卷,用于持久化 GitLab 的配置、日志和数据:
[root@gitlab-server ~]# docker volume create gitlab-etc
gitlab-etc
[root@gitlab-server ~]# docker volume create gitlab-log
gitlab-log
[root@gitlab-server ~]# docker volume create gitlab-opt
gitlab-opt
修改系统参数,防止后续运行报错:
[root@gitlab-server ~]# cat >> /etc/sysctl.conf <<-'EOF'
kernel.perf_event_max_sample_rate=79000
vm.max_map_count=262144
EOF
[root@gitlab-server ~]# sysctl -p
执行以下命令安装 GitLab 服务容器(推荐版本 gitlab/gitlab-ee:17.3.1-ee.0):
[root@gitlab-server ~]# docker run --detach \
--hostname 192.168.223.23 \
-p 443:443 \
-p 80:80 \
--name gitlab \
--restart always \
--volume gitlab-etc:/etc/gitlab \
--volume gitlab-log:/var/log/gitlab \
--volume gitlab-opt:/var/opt/gitlab \
--shm-size 256m \
gitlab/gitlab-ee:17.3.1-ee.0
查看镜像和容器状态:
[root@gitlab-server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gitlab/gitlab-ee 17.3.1-ee.0 b3c3467dc55c 5 weeks ago 3.03GB
[root@gitlab-server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b61e126fee40 gitlab/gitlab-ee:17.3.1-ee.0 "/assets/wrapper" 26 seconds ago Up 25 seconds (health: starting) 0.0.0.0:80->80/tcp, :::80->80/tcp, 22/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp gitlab
查看安装日志,确认启动过程无异常:
[root@gitlab-server ~]# docker logs -f gitlab
查看 GitLab 管理员初始密码:
[root@gitlab-server ~]# docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
Password: oJhP0nKx3SniZWHzgY+ckL7aYqxpMHabsrTwQ6n7YU0=
2、初始化 Gitlab
2.1 首次登录
打开浏览器,访问 http://192.168.223.23,使用以下信息登录:-...
根据这些内容按照上面的方式采用文字夹带代码的形式,进行
二、搭建 CI/CD 环境
2.1 部署 GitLab 代码仓库
官方参考文档:> https://docs.gitlab.com/ee/install/docker/installation.html
首先在 gitlab-server 服务器执行如下命令,创建持久化挂载卷,分别存放配置、日志、程序数据:
[root@gitlab-server ~]# docker volume create gitlab-etc
gitlab-etc
[root@gitlab-server ~]# docker volume create gitlab-log
gitlab-log
[root@gitlab-server ~]# docker volume create gitlab-opt
gitlab-opt
修改 systcl.conf 系统内核参数,避免 GitLab 运行报错:
[root@gitlab-server ~]# cat >> /etc/sysctl.conf <<-'EOF'
kernel.perf_event_max_sample_rate=79000
vm.max_map_count=262144
EOF
[root@gitlab-server ~]# sysctl -p
后台运行 Docker 容器部署 GitLab 服务:
[root@gitlab-server ~]# docker run --detach \
--hostname 192.168.223.23 \
-p 443:443 \
-p 80:80 \
--name gitlab \
--restart always \
--volume gitlab-etc:/etc/gitlab \
--volume gitlab-log:/var/log/gitlab \
--volume gitlab-opt:/var/opt/gitlab \
--shm-size 256m \
gitlab/gitlab-ee:17.3.1-ee.0
查看本地 Docker 镜像与容器运行状态:
[root@gitlab-server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gitlab/gitlab-ce 17.3.1-ce.0 b3c3467dc55c 5 weeks ago 3.03GB
[root@gitlab-server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b61e126fee40 gitlab/gitlab-ce:17.3.1-ce.0 "/assets/wrapper" 26 seconds ago Up 25 seconds (health: starting) 0.0.0.0:80->80/tcp, :::80->80/tcp, 22/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp gitlab
实时查看 GitLab 启动日志,等待服务初始化完成:
[root@gitlab-server ~]# docker logs -f gitlab
获取 GitLab root 管理员初始登录密码:
[root@gitlab-server ~]# docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
Password: oJhP0nKx3SniZWHzgY+ckL7aYqxpMHabsrTwQ6n7YU0=
2.2 初始化 Gitlab
打开浏览器,访问地址 http://192.168.223.23,输入用户名 root 和上面获取的初始密码完成登录。
登录后进入管理界面,依次进入用户管理 Users,点击编辑按钮修改 root 登录密码。
提示:密码需要包含大小写字母、数字,长度 8 位以上。
修改完成后自动跳转登录页,使用新密码重新登录即可。
2.3 部署 GitLab Runner
官方参考文档:> https://docs.gitlab.com/runner/install/linux-repository.html#installing-gitlab-runner
在 gitlab-runner 节点,导入 GitLab 官方 YUM 源:
[root@gitlab-runner local]# curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
查看生成的 YUM 仓库源文件:
[root@gitlab-runner local]# ls /etc/yum.repos.d/
base.repo docker-ce.repo kubernetes.repo redhat.repo runner_gitlab-runner.repo
安装与 GitLab 版本一致的 Runner 版本:
[root@gitlab-runner local]# sudo yum install -y gitlab-runner-17.3.1
注意:安装的版本一定要与 Gitlab 服务器的版本保持一致。
查看系统所有用户,确认自动创建 gitlab-runner 普通用户:
[root@gitlab-runner local]# cut -d: -f1 /etc/passwd
默认 gitlab-runner 权限过低,生产及测试环境改为 root 用户执行,先卸载默认配置:
[root@gitlab-runner local]# sudo gitlab-runner uninstall
重新指定工作目录并以 root 身份运行 Runner:
[root@gitlab-runner local]# gitlab-runner install --working-directory /home/gitlab-runner --user root
说明:
- 指定工作目录,后续流水线代码存放路径
- 指定使用 root 用户执行 CI/CD 任务
重新加载系统服务、设置开机自启并启动服务:
[root@gitlab-runner local]# systemctl daemon-reload
[root@gitlab-runner local]# systemctl enable --now gitlab-runner
查看 Runner 进程运行状态:
[root@gitlab-runner local]# ps aux | grep gitlab-runner
配置 Git 安全目录权限及工作目录权限,重启 Runner 生效:
git config --system --add safe.directory '*'
chmod -R 777 /home/gitlab-runner
systemctl restart gitlab-runner
2.3.1 注册 Runner
进入 GitLab 后台 Admin → CI/CD → Runners,新建实例 Runner,获取注册 URL 和 Token。
在 gitlab-runner 节点执行注册命令:
[root@gitlab-runner local]# gitlab-runner register --url http://192.168.223.23 --token glrt-no-xtLxm8Hq1XgxLKoi_
Runtime platform arch=amd64 os=linux pid=20562 revision=66269445 version=17.3.1
Running in system-mode.
Enter the GitLab instance URL (for example, https://gitlab.com/):
[http://192.168.72.105]:
Verifying runner... is valid runner=i-N5M8JFr
Enter a name for the runner. This is stored only in the local config.toml file:
[gitlab-runner]:
Enter an executor: docker-windows, docker+machine, kubernetes, instance, custom, shell, virtualbox, docker-autoscaler, ssh, parallels, docker:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"
注册完成后,GitLab 后台可看到已激活的 Runner,携带shared标签用于流水线匹配调度。
网页端修改 Runner 标签方法
- 打开 GitLab 项目 → Settings → CI/CD → Runners
- 找到带
shared标签的 Runner,点击 Edit - 标签栏追加:
shared,docker,k8s - 保存配置即可
三、前置环境信息汇总
- Harbor 仓库信息
- 地址:
192.168.223.200 - 项目:
k8s-project - 账号:
admin密码:Harbor12345
-
K8s 集群:集群正常运行,Runner 节点可连通并操作 K8s 集群
-
前端代码:纯静态 HTML/CSS/JS 项目,无需额外编译打包
四、项目文件结构与配置
4.1 本地创建项目基础目录
[root@master ~]# mkdir /root/k8s/deploy -p
[root@master ~]# cd /root/k8s/deploy/
[root@master deploy]# mkdir my-page
[root@master deploy]# cd my-page
[root@master my-page]# echo "hello,CICD" > index.html
4.2 编写 Dockerfile 镜像构建文件
cat > Dockerfile << EOF
FROM nginx:latest
COPY . /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
EOF
4.3 编写 K8s 部署清单 nginx-deploy.yaml
vim nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-page
spec:
replicas: 1
selector:
matchLabels:
app: my-page
template:
metadata:
labels:
app: my-page
spec:
containers:
- name: my-page
image: $IMAGE
imagePullPolicy: Always
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-page-svc
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30083
selector:
app: my-page
4.4 配置 Runner 节点 K8s 访问权限
在 GitLab-Runner 节点配置 kubectl,操作 K8s 集群:
[root@gitlab-runner ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name = kubernetes
baseurl = https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm/
gpgcheck = 0
安装 kubectl 客户端:
[root@gitlab-runner ~]# yum install kubectl -y
从 K8s Master 节点拷贝 .kube/config 到 Runner 节点:
# Runner节点执行
mkdir -p ~/.kube
vim ~/.kube/config
粘贴 Master 节点 /etc/kubernetes/admin.conf 内容保存。
验证集群连通性:
kubectl get nodes -n default
4.5 编写.gitlab-ci.yml 流水线配置
项目根目录新建 .gitlab-ci.yml:
yaml
stages:
- build
- push
- deploy
variables:
HARBOR_REGISTRY: "192.168.223.200"
HARBOR_PROJECT: "k8s-project"
IMAGE_NAME: "my-page"
TAG: "$CI_COMMIT_SHORT_SHA"
NAMESPACE: "default"
# 构建镜像
build:
stage: build
tags:
- shared
script:
- echo "=== 构建镜像 ==="
- docker build -t ${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${IMAGE_NAME}:${TAG} .
# 推送镜像到Harbor
push:
stage: push
tags:
- shared
script:
- echo "=== 登录Harbor并推送镜像 ==="
- docker login ${HARBOR_REGISTRY} -u admin -p Harbor12345
- docker push ${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${IMAGE_NAME}:${TAG}
- docker tag ${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${IMAGE_NAME}:${TAG} ${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${IMAGE_NAME}:latest
- docker push ${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${IMAGE_NAME}:latest
# 部署到K8s集群
deploy:
stage: deploy
tags:
- shared
script:
- echo "=== 开始部署 my-page ==="
- export IMAGE=${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${IMAGE_NAME}:${TAG}
- echo "使用镜像:$IMAGE"
- envsubst '$IMAGE' < nginx-deploy.yaml > rendered.yaml
- kubectl apply -f rendered.yaml
- kubectl rollout status deployment my-page -n ${NAMESPACE} --timeout=120s
- kubectl delete pod -l app=my-page -n ${NAMESPACE} --field-selector=status.phase!=Running 2>/dev/null || true
- rm -f rendered.yaml
- echo "=== ✅ 部署成功 ==="
- kubectl get pods -n ${NAMESPACE}
五、一键自动化部署流程
5.1 首次提交代码到 GitLab
[root@master my-page]# yum install git -y
git config --global user.name "Administrator"
git config --global user.email "gitlab_admin_dc9ff2@example.com"
[root@master deploy]# cd my-page
git init --initial-branch=main
git remote add origin http://192.168.223.23/root/my-page.git
git add .
git commit -m "Initial commit"
git push --set-upstream origin main
5.2 日常更新触发 CI/CD
修改前端代码后,执行以下命令自动触发构建、推送、部署:
git add .
git commit -m "修改前端页面"
git push
六、查看流水线部署进度
- 进入 GitLab 项目主页
- 左侧菜单选择 Build → Jobs
- 绿色对勾代表部署成功,红色报错可点击日志排查问题
七、验证部署结果
7.1 浏览器访问
访问任意 K8s 节点 IP+NodePort 端口:
http://任意K8s节点IP:30083
7.2 命令行查看 Pod 与服务状态
[root@master my-page]# kubectl get pods -n default | grep my-page
my-page-c45f78574-nh6c4 1/1 Running 0 97s
[root@master my-page]# kubectl get svc -n default | grep my-page
my-page-svc NodePort 10.97.86.56 <none> 80:30083/TCP 5m22s
# 查看容器日志
[root@master my-page]# kubectl logs -f $(kubectl get pods -n default | grep my-page | awk '{print $1}') -n d
八、小结
本文完整基于 RHEL 9.3 系统,依次完成了 Harbor 私有镜像仓库、K8s 集群、Flannel 网络插件、GitLab 代码仓库、GitLab Runner 全套环境搭建。
通过容器化方式部署 GitLab,完成初始配置与密码初始化;再部署并注册 GitLab Runner,适配 root 权限运行、安装配置 kubectl,打通 Runner 操作 K8s 集群权限。
同时规范了前端项目目录结构,编写 Dockerfile、K8s 资源清单、.gitlab-ci.yml 流水线配置,定义构建、推送、部署 三大阶段。实现了开发者只需执行 git push 提交代码,即可自动完成镜像构建、推送至 Harbor、滚动部署到 K8s 集群的全自动 CI/CD 发布流程。
整套环境贴近企业真实生产架构,部署步骤完整、命令可直接复用,不仅实现前端项目一键自动上线,也可无缝迁移适配后端微服务项目容器化发布。