基于GitLab CI/CD + Kubernetes的自动化部署平台搭建

📅 2026/7/13 16:44:59
基于GitLab CI/CD + Kubernetes的自动化部署平台搭建
一、系统架构主机名IP地址角色软件harbor172.25.254.200harbordockerharbork8s-master172.25.254.20masterkubeadm, kubelet, kubectl, etcdapi-servercontroller-managerschedulerk8s-node 1172.25.254.21node 1kubeletkube-proxydockerk8s-node 2172.25.254.22node 2kubeletkube-proxydockergitlab-server172.25.254.23serverdocker, gitlabgitlab-runner172.25.254.24runnerdocker, gitlab-runner二、初始化环境所有主机2.1 关闭防火墙和SELinux# 关闭防火墙 [rootharbor ~]# systemctl stop firewalld [rootharbor ~]# systemctl disable firewalld # 关闭SELinux [rootharbor ~]# setenforce 0 [rootharbor ~]# sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config2.2 配置本地YUM源# 挂载光盘 [rootharbor ~]# mount /dev/sr0 /mnt # 创建本地yum源 [rootharbor ~]# cat /etc/yum.repos.d/local.repo EOF [base01] namebase baseurl/mnt/BaseOS enable1 gpgcheck0 [base02] nameapp baseurl/mnt/AppStream enable1 gpgcheck0 EOF # 安装工具依赖 [rootharbor ~]# yum install vim net-tools tree zip git -y2.3 配置主机名[rootharbor ~]# cat /etc/hosts EOF 172.25.254.20 k8s-master master 172.25.254.21 k8s-node1 node1 172.25.254.22 k8s-node2 node2 EOF2.4 关闭swap[rootharbor ~]# sed /swap/s/^/#/g -i /etc/fstab [rootharbor ~]# swapoff -a [rootharbor ~]# swapon -s #没有显示才是对的2.5 内核参数配置缺失会导致CRI通信失败# 添加内核参数 [rootharbor ~]# cat /etc/sysctl.d/k8s.conf EOF net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 EOF # 生效参数 [rootharbor ~]# sysctl --system # 加载 br_netfilter 模块 [rootharbor ~]# modprobe br_netfilter [rootharbor ~]# modprobe vxlan [rootharbor ~]# echo br_netfilter /etc/modules-load.d/k8s.conf [rootharbor ~]# echo vxlan /etc/modules-load.d/k8s.conf [rootharbor ~]# lsmod | grep br_netfilter # 有输出则正确2.6 部署Docker# 安装依赖 [rootharbor ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加Docker阿里云镜像源 [rootharbor ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装Docker指定版本 [rootharbor ~]# yum install -y docker-ce # 启动Docker [rootharbor ~]# systemctl enable docker [rootharbor ~]# systemctl start docker2.7 配置Docker阿里云镜像加速器# 创建docker配置目录 [rootharbor ~]# mkdir -p /etc/docker # 配置镜像加速器 [rootharbor ~]# cat /etc/docker/daemon.json EOF { registry-mirrors: [ https://docker.1ms.run, https://p1umdw8d.mirror.aliyuncs.com, https://docker.xuanyuan.cn, https://registry.docker-cn.com, https://mirror.ccs.tencentyun.com ], insecure-registries: [172.25.254.200] } EOF # 重启Docker [rootharbor ~]# systemctl daemon-reload [rootharbor ~]# systemctl restart docker # 验证加速器是否生效 [rootharbor ~]# docker info | grep -A 10 Registry Mirrors三、部署Harbor3.1 获取docker-compose文件[rootharbor ~]# wget https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64 # 查看文件 [rootharbor ~]# ls docker-compose-linux-x86_64 # 移动位置 [rootharbor ~]# mv docker-compose-linux-x86_64 /usr/bin/docker-compose # 添加执行权限 [rootharbor ~]# chmod x /usr/bin/docker-compose # 查看版本 [rootharbor ~]# docker-compose version Docker Compose version v2.2.33.2 版本Harbor 2.10.2# 下载Harbor选择需要的版本 [rootharbor ~]# wget https://github.com/goharbor/harbor/releases/download/v2.4.1/harbor-offline-installer-v2.4.1.tgz # 解压 [rootharbor ~]# tar -zxf harbor-offline-installer-v2.14.0.tgz [rootharbor ~]# cd harbor # 复制配置文件 [rootharbor harbor]# cp harbor.yml.tmpl harbor.yml # 修改配置 [rootharbor harbor]# vim harbor.yml # 第5行hostname改为服务器IP hostname: 172.25.254.200 #https: 注释 #https port for harbor, default is 443 #port: 443 注释 #The path of cert and key files for nginx #certificate: /your/certificate/path 注释 #private_key: /your/private/key/path 注释3.3 启动Harbor# 运行安装脚本 [rootharbor harbor]# ./install.sh # 启动Harbor后台运行 [rootharbor harbor]# docker-compose up -d # 查看状态 [rootharbor harbor]# docker-compose ps3.4 Harbor页面配置第一步访问Harbor打开浏览器输入http://172.25.254.200用户名admin密码Harbor12345点击Log in第二步创建项目1. 登录后点击Projects项目2. 点击New Project新建项目3. 填写Project Name项目名k8sAccess Level访问级别选择Public公开4. 点击“OK”四、部署K8S4.1 安装cri-docerdmaster/node节点中安装[rootmaster ~]# ls anaconda-ks.cfg cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm [rootmaster ~]# rpm -ivh *.rpm [rootmaster ~]# vim /lib/systemd/system/cri-docker.service ExecStart/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugincni --pod-infra-container-image172.25.254.200/k8s/pause:3.10.1 [rootmaster ~]# systemctl daemon-reload [rootmaster ~]# systemctl enable --now cri-docker [rootmaster ~]# systemctl status cri-docker [rootmaster ~]# docker login 172.25.254.200 -u admin -p Harbor12345 [rootnode1 ~]# docker login 172.25.254.200 -u admin -p Harbor12345 [rootnode2 ~]# docker login 172.25.254.200 -u admin -p Harbor12345 # 所有主机配置kubernetes安装源 [rootmaster ~]# vim /etc/yum.repos.d/kubernetes.repo [kubernetes] name kubernetes baseurl https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm/ gpgcheck 04.2 安装构建kubernetes集群所需软件[rootmaster ~]# dnf install kubelet kubeadm kubectl -y [rootmaster ~]# systemctl enable --now kubelet.service # 所有节点执行配置 kubelet 默认使用 cri-dockerd 套接字 [rootmaster ~]# cat /etc/sysconfig/kubelet EOF KUBELET_EXTRA_ARGS--container-runtime-endpointunix:///var/run/cri-dockerd.sock --runtime-request-timeout15m EOF # 重启 kubelet 生效 [rootmaster ~]# systemctl daemon-reload [rootmaster ~]# systemctl restart kubeletmaster节点中 kubectl 和kubeadm 补齐[rootmaster ~]# echo source (kubectl completion bash) ~/.bashrc [rootmaster ~]# echo source (kubeadm completion bash) ~/.bashrc [rootmaster ~]# source ~/.bashrc4.3 下载kubernetes集群所需镜像下载镜像[rootmaster ~]# kubeadm config images pull \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.35.3 \ --cri-socketunix:///var/run/cri-dockerd.sock上传到本地harbor[rootmaster ~]# docker login 172.25.254.200 -u admin -p Harbor12345 [rootmaster ~]# docker images --format {{.Repository}}:{{.Tag}} | awk -F / /google_containers/{system(docker tag $0 172.25.254.200/k8s/$3)} [rootmaster ~]# docker images --format {{.Repository}}:{{.Tag}} | awk -F / /172.25.254.200/{system(docker push $0)}4.4 在master中初始化kubernetes集群在master中完成集群初始化[rootmaster ~]# kubeadm init --pod-network-cidr10.244.0.0/16 \ --image-repository 172.25.254.200/k8s \ --kubernetes-version v1.35.3 \ --cri-socketunix:///var/run/cri-dockerd.sock 。。。 [rootmaster ~]# mkdir -p $HOME/.kube [rootmaster ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [rootmaster ~]# chown $(id -u):$(id -g) $HOME/.kube/config [rootmaster ~]# echo export KUBECONFIG/etc/kubernetes/admin.conf ~/.bash_profile [rootmaster ~]# source ~/.bash_profile 在node1\node2上执行 #每个人不一样其他主机加入本集群的凭证 [rootnode1/node2 ~]# kubeadm join 172.25.254.20:6443 --token 5myaaa.bivwm2319b1be73i \ --discovery-token-ca-cert-hash sha256:789e1df79316e434e3864a2e243f3488f6652ebd5cf48885bdfdd83ef73cd9a5 \ --cri-socket unix:///var/run/cri-dockerd.sock [rootmaster ~]# kubectl get nodes4.5 安装网络插件4.5.1 加载离线镜像# 加载离线镜像 [rootmaster ~]# ls 172.25.254.200-flannel-io-flannel-cni-plugin-v1.9.0-flannel1.tar 172.25.254.200-flannel-io-flannel-v0.28.1.tar # 推送到私有仓库 [rootmaster ~]# docker load -i 172.25.254.200-flannel-io-flannel-v0.28.1.tar [rootmaster ~]# docker load -i 172.25.254.200-flannel-io-flannel-cni-plugin-v1.9.0-flannel1.tar4.5.2 打标签[rootmaster ~]# docker tag 172.25.254.200/flannel-io/flannel:v0.28.1 172.25.254.200/flannel-io/flannel:v0.28.1 [rootmaster ~]# docker tag 172.25.254.200/flannel-io/flannel-cni-plugin:v1.9.0-flannel1 172.25.254.200/flannel-io/flannel-cni-plugin:v1.9.0-flannel14.5.3 推送到私有仓库[rootmaster ~]# docker push 172.25.254.200/flannel-io/flannel:v0.28.1 [rootmaster ~]# docker push 172.25.254.200/flannel-io/flannel-cni-plugin:v1.9.0-flannel14.5.4 修改kube-flannel.yml[rootmaster ~]# vim kube-flannel.yml三个修改的地方4.6 应用网络插件[rootmaster ~]# kubectl apply -f kube-flannel.yml4.7 测试五、搭建CI/CD环境5.1 部署GitLab代码仓库5.1.1 在gitlab-server服务器执行如下命令来创建挂载卷[rootgitlab-server ~]# docker volume create gitlab-etc [rootgitlab-server ~]# docker volume create gitlab-log [rootgitlab-server ~]# docker volume create gitlab-opt5.1.2 修改systcl.conf文件防止后续运行是报错信息[rootgitlab-server ~]# cat /etc/sysctl.conf -EOF kernel.perf_event_max_sample_rate79000 vm.max_map_count262144 EOF sysctl -p5.1.3 执行如下命令来安装gitlab服务容器[rootgitlab-server ~]# docker run --detach \ --hostname 172.25.254.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 [rootgitlab-server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE gitlab/gitlab-ce 17.3.1-ce.0 b3c3467dc55c 5 weeks ago 3.03GB [rootgitlab-server ~]# docker psGitlab 服务器的登录密码可通过如下命令来查看[rootgitlab-server ~]# docker exec -it gitlab grep Password: /etc/gitlab/initial_root_password Password: oJhP0nKx3SniZWHzgYckL7aYqxpMHabsrTwQ6n7YU05.2 初始化GitLab打开浏览器输入http://172.25.254.23后输入root用户名以及前面查询到的密码点击登录按钮后进入到界面点击左上角的圆形图片进入到User链接后点击Preferences再点击Password便能修改密码5.3 部署GitLab Runner# 执行如下命令下载GitLab提供的YUM安装源 [rootgitlab-runner local]# curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash # 查看仓库源 [rootgitlab-runner local]# ls /etc/yum.repos.d/ base.repo docker-ce.repo kubernetes.repo redhat.repo runner_gitlab-runner.repo # 执行如下命令安装GItLab-Runner [rootgitlab-runner local]# yum install -y gitlab-runner-17.3.1 # 接下来再执行如下命令查看所有用户 [rootgitlab-runner local]# cut -d: -f1 /etc/passwd # 我们直接使用 root 用户来操作执行如下命令来卸载原始信息 [rootgitlab-runner local]# sudo gitlab-runner uninstall # 然后执行如下命令安装并设置 root 用户为操作用户 [rootgitlab-runner local]# gitlab-runner install --working-directory /home/gitlab-runner --user root Runtime platform archamd64 oslinux pid20348 revision66269445 version17.3.1 # 接下执行如下命令来重新加载 [rootgitlab-runner local]# systemctl daemon-reload # 然后启动 gitlab-runner 并设置为开机自启 [rootgitlab-runner local]# systemctl enable --now gitlab-runner # 为了验证我们可查看当前 runner 用户 [rootgitlab-runner local]# ps aux | grep gitlab-runner [rootgitlab-runner local]# git config --system --add safe.directory * [rootgitlab-runner local]# chmod -R 777 /home/gitlab-runner [rootgitlab-runner local]# systemctl restart gitlab-runner5.4 注册Runner回到 Gitlab 服务管理界面并点击界面左下角的 Admin 按钮点击后再点击左右菜单中的 CI/CD 链接下的 Runners 链接然后点击上图中的New instance runner按钮填写好一个标签后其它都不选也不用输入。然后点击界面下的Create runner按钮在这个界面中选择好操作系统后复制上图指定的代码然后在 gitlab-runner 主机上运行这段复制的代码[rootgitlab-runner local]#gitlab-runner register --url http://172.25.254.23 --token glrt-no-xtLxm8Hq1XgxLKoi_就会生成一个配置文件路径为 /etc/gitlab-runner/config.toml。操作完成后在 Gitlab 服务管理界面中就 Runner 面板中就会看到如下图所示的配置六、项目文件结构在Gitlab上创建项目七、核心配置文件把代码放到 GitLab 仓库根目录只需要 1 个配置文件系统自动生成其他文件[rootmaster ~]# mkdir /root/k8s/deploy -p [rootmaster ~]# cd /root/k8s/deploy/ [rootmaster deploy]# mkdir my-page [rootmaster deploy]# cd my-page [rootmaster my-page]# echo hello,CICD index.html配置 K8s 集群访问权限# 1. 从K8s Master节点192.168.223.20拷贝config文件 # 先在Master节点执行 [rootmaster ~]# cat ~/.kube/config 复制内容 # 在Runner节点执行 [rootgitlab-runner ~]# mkdir -p ~/.kube [rootgitlab-runner ~]# vim ~/.kube/config # 粘贴Master节点的config内容确保内容完整包含集群、用户、上下文信息 [rootgitlab-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 [rootgitlab-runner ~]# yum install kubectl -y # 2. 验证kubectl权限 [rootmaster ~]# kubectl get nodes -n default # 若报错需检查 # - Master节点的API Server地址是否可访问6443端口 # - config文件中的证书/令牌是否有效 # - Runner节点与Master节点的网络连通性在项目根目录新建文件.gitlab-ci.yml复制以下全部内容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} . # 推送镜像 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 # 部署完美无错版 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} --timeout120s # 清理异常Pod - kubectl delete pod -l appmy-page -n ${NAMESPACE} --field-selectorstatus.phase!Running 2/dev/null || true - rm -f rendered.yaml - echo ✅ 部署成功 - kubectl get pods -n ${NAMESPACE}八、一键自动化部署场景 1首次部署代码没上传过1、创建项目仓库2、把前端代码.gitlab-ci.yml放到项目根目录[rootmaster my-page]# yum install git -y git config --global user.name Administrator git config --global user.email gitlab_admin_dc9ff2example.com [rootmaster deploy]# cd my-page [rootmaster deploy]# git init --initial-branchmain [rootmaster deploy]# git remote add origin http://172.25.254.23/root/my-page.git [rootmaster deploy]# git add . [rootmaster deploy]# git commit -m Initial commit [rootmaster deploy]# git push --set-upstream origin main3、打开终端执行 3 条命令[rootmaster ~]# git add . [rootmaster ~]# git commit -m 首次部署前端项目 [rootmaster ~]# git push4、全自动运行GitLab 自动构建镜像 → 推送到 Harbor → 部署到 K8s场景 2修改代码后自动更新1、 直接修改你的前端代码比如index.html2、 执行 3 条命令触发自动更新[rootmaster ~]# git add . [rootmaster ~]# git commit -m 修改前端页面 [rootmaster ~]# git push3、 等待 1~2 分钟刷新浏览器就是最新页面九、查看部署进度打开你的 GitLab 项目页面左侧菜单栏 → 点击Build → Jobs看到绿色对勾 ✅ 部署成功红色 ❌ 失败看下面常见问题十、验证部署成果方法一浏览器访问打开浏览器输入地址http://172.25.254.20:30083方法二命令行检查查看pod状态[rootmaster my-page]# kubectl get pods -n default | grep my-page my-page-c45f78574-nh6c4 1/1 Running 0 97s [rootmaster my-page]# kubectl get svc -n default | grep my-page my-page-svc NodePort 10.97.86.56 none 80:30083/TCP 5m22s [rootmaster my-page]# kubectl logs -f $(kubectl get pods -n default | grep my-page | awk {print $1}) -n default基于 CI/CD K8s 环境部署 Java 项目整体思路Java 项目需要先编译打包Maven → 构建 Docker 镜像 → 推送 Harbor → 部署 K8s核心是用 Docker 镜像封装 Java 运行环境避免 Runner 装 Maven/JDK【第一步】创建 Java 项目目录和前端项目同级# 回到部署根目录 [rootmaster ~]# cd /root/k8s/deploy # 创建java项目目录 [rootmaster ~]# mkdir java-demo [rootmaster ~]# cd java-demo【第二步】编写 4 个核心文件直接复制1. Java 源代码SpringBoot 最简 Web 项目生成正确的HelloController.java(java-demo 版)[rootmaster ~]# mkdir -p src/main/java/com/demo [rootmaster ~]# cat src/main/java/com/demo/HelloController.java EOF package com.demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; RestController public class HelloController { GetMapping(/) public String hello() { return Java-Demo 部署成功K8s GitLab CI 正常运行; } } EOF生成启动类DemoApplication.java(war 包必备)[rootmaster ~]# cat src/main/java/com/demo/DemoApplication.java EOF package com.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; SpringBootApplication public class DemoApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(DemoApplication.class); } } EOF2. Maven 配置文件pom.xml[rootmaster ~]# cat pom.xml EOF ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.demo/groupId artifactIdjava-demo/artifactId version1.0-SNAPSHOT/version !-- 固定为 war 包适配 Tomcat -- packagingwar/packaging !-- 统一 JDK 11 编译版本避免版本不兼容 -- properties maven.compiler.source11/maven.compiler.source maven.compiler.target11/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding /properties !-- SpringBoot 父依赖2.7.15 适配 JDK 11 Tomcat 9 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.15/version relativePath/ /parent dependencies !-- Web 核心依赖排除内置 Tomcat用外部 Tomcat -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId exclusions exclusion groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId /exclusion /exclusions /dependency !-- Tomcat 9 适配的 Servlet API固定版本 -- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency /dependencies build !-- 固定 WAR 包名称为 ROOT避免访问路径加项目名 -- finalNameROOT/finalName plugins !-- SpringBoot 打包插件固定 -- plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId version2.7.15/version /plugin /plugins /build /project EOF3. Dockerfile[rootnode1 ~]# docker load -i tomcat-9.0-jdk11.tar Loaded image: tomcat:9.0-jdk11 [rootnode1 ~]# docker tag tomcat:9.0-jdk11 172.25.254.200/k8s-project/tomcat:9.0-jdk11 [rootnode1 ~]# docker push 172.25.254.200/k8s-project/tomcat:9.0-jdk11 [rootnode1 ~]# cat Dockerfile FROM 172.25.254.200/k8s-project/tomcat:9.0-jdk11 WORKDIR /usr/local/tomcat RUN rm -rf webapps/* COPY target/ROOT.war webapps/ROOT.war EXPOSE 8080 CMD [catalina.sh, run]4. K8s 部署文件java.yamlapiVersion: apps/v1 kind: Deployment metadata: name: java-demo spec: replicas: 1 selector: matchLabels: app: java-demo template: metadata: labels: app: java-demo spec: containers: - name: java-demo image: $IMAGE imagePullPolicy: Always ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: java-demo-svc spec: type: NodePort ports: - port: 8080 targetPort: 8080 nodePort: 30084 selector: app: java-demo5. 在【Master gitlab-runner节点】安装 MavenJDK11避免 Runner 拉取镜像报错# 安装 JDK Maven编译环境 # 1. 上传 jdk-11.tar.gz 到 /root 目录执行解压 [rootgitlab-runner ~]# tar -zxf jdk-11_linux-x64_bin.tar.gz [rootgitlab-runner ~]# mv jdk-11 jdk11 # 2. 配置全局环境变量永久生效 [rootgitlab-runner ~]# cat /etc/profile.d/jdk.sh EOF export JAVA_HOME/root/jdk11 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib EOF # 3. 生效并验证 [rootgitlab-runner ~]# source /etc/profile.d/jdk.sh [rootgitlab-runner ~]# java -version # 输出JDK版本即成功 # 再gitlab-runner部署 # 1. 下载 Maven 3.9.6适配JDK 11 [rootgitlab-runner ~]# cd /root [rootgitlab-runner ~]# wget https://archive.apache.org/dist/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.gz # 2. 解压并重命名 [rootgitlab-runner ~]# tar -zxf apache-maven-3.9.14-bin.tar.gz [rootgitlab-runner ~]# mv apache-maven-3.9.14 maven # 3. 配置全局环境变量 [rootgitlab-runner ~]# cat /etc/profile.d/maven.sh EOF export MAVEN_HOME/root/maven export PATH$MAVEN_HOME/bin:$PATH EOF [rootgitlab-runner ~]# source /etc/profile.d/maven.sh [rootgitlab-runner ~]# mvn -version # 输出Maven版本即成功 [rootgitlab-runner package]# vim /root/maven/conf/settings.xml ..... mirror idtencentmaven/id mirrorOfcentral/mirrorOf urlhttps://maven.aliyun.com/repository/public//url /mirror .... # 3. 进入 java-demo 项目目录本地编译 [rootgitlab-runner package]# cd /root/k8s/deploy/java-demo [rootgitlab-runner package]# mvn clean package -DskipTests【第三步】编写 GitLab CI/CD 配置.gitlab-ci.yml[rootmaster ~]# vim .gitlab-ci.yml stages: - build - push - deploy variables: HARBOR_REGISTRY: 172.25.254.200 HARBOR_PROJECT: k8s-project IMAGE_NAME: java-demo TAG: $CI_COMMIT_SHORT_SHA NAMESPACE: default build: stage: build tags: - shared script: - echo 编译打包 - mvn clean package -DskipTests - docker build -t ${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${IMAGE_NAME}:${TAG} . - docker tag ${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${IMAGE_NAME}:${TAG} ${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${IMAGE_NAME}:latest push: stage: push tags: - shared script: - docker login ${HARBOR_REGISTRY} -u admin -p Harbor12345 - docker push ${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${IMAGE_NAME}:${TAG} - docker push ${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${IMAGE_NAME}:latest deploy: stage: deploy tags: - shared script: - export IMAGE${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${IMAGE_NAME}:${TAG} - envsubst $IMAGE java.yaml java-deploy.yaml - kubectl apply -f java-deploy.yaml - kubectl rollout status deployment java-demo -n ${NAMESPACE} --timeout120s - rm -f java-deploy.yaml - kubectl get pods -n ${NAMESPACE}【第四步】推送到 GitLab 仓库触发自动部署# 初始化Git仓库 [rootmaster ~]# git init # 添加所有文件 [rootmaster ~]# git add . # 提交 [rootmaster ~]# git commit -m init java demo: hello CICD, i am java # 添加远程仓库替换成你的GitLab地址 [rootmaster ~]# git remote add origin http://192.168.223.23/root/java-demo.git # 推送 [rootmaster ~]# git push -u origin main【第五步】验证部署结果1. 查看 CI/CD 流水线打开 GitLab → 项目 → CI/CD → Pipelines确认build/push/deploy三个阶段都显示绿色 ✅。2. 查看 K8s Pod 状态[rootmaster ~]# kubectl get pods -n default | grep java-demo # 正常输出java-demo-xxxxxx-xxxx 1/1 Running 0 10s3. 访问 Java 页面http://172.25.254.20:30084