【基于 RHEL 9.3 的 K8s + GitLab 全自动化部署环境搭建第二篇】

二、搭建 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 标签方法
  1. 打开 GitLab 项目 → Settings → CI/CD → Runners
  2. 找到带 shared 标签的 Runner,点击 Edit
  3. 标签栏追加:shared,docker,k8s
  4. 保存配置即可

三、前置环境信息汇总

  1. Harbor 仓库信息
  • 地址:192.168.223.200
  • 项目:k8s-project
  • 账号:admin 密码:Harbor12345
  1. K8s 集群:集群正常运行,Runner 节点可连通并操作 K8s 集群

  2. 前端代码:纯静态 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

六、查看流水线部署进度

  1. 进入 GitLab 项目主页
  2. 左侧菜单选择 Build → Jobs
  3. 绿色对勾代表部署成功,红色报错可点击日志排查问题

七、验证部署结果

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 发布流程

整套环境贴近企业真实生产架构,部署步骤完整、命令可直接复用,不仅实现前端项目一键自动上线,也可无缝迁移适配后端微服务项目容器化发布。

相关推荐
AC赳赳老秦3 小时前
全链路自动化巡检:用 OpenClaw 实现服务器 - 应用 - 数据库全链路巡检,自动生成报告与整改建议
服务器·数据库·人工智能·深度学习·自动化·deepseek·openclaw
黄昏回响4 小时前
信息系统基础知识(六):办公自动化系统(OAS)详解
计算机网络·程序人生·面试·自动化·改行学it
半导体守望者5 小时前
MKS elite 300 600 750W RF Plasma Generator 射频电源 OPERATIONMANUAL
经验分享·笔记·机器人·自动化·制造
晚风烟火5 小时前
【无标题】
自动化·rpa
Agent手记5 小时前
空运智能装箱规划自动化、落地方法与合规适配:2026年Agent矩阵驱动的技术演进与实操指引
运维·人工智能·ai·矩阵·自动化
脑子加油站5 小时前
K8S-RBAC认证中心
云原生·容器·kubernetes·rbac认证
Cat_Rocky5 小时前
K8s RBAC认证 简单讲
java·docker·kubernetes
半导体守望者5 小时前
MKS ACG-3 XL RF Power Generator OPERATION MANUAL RF 射频电源
学习·机器人·自动化·制造·模块测试
zhangfeng11335 小时前
Remotion 渲染视频脚本 ,自动化编辑视频 Node.js 层面是“单线程 JS”,但在实际渲染时是“高度并行”的。
node.js·自动化·音视频