3. 开发环境与基础设施搭建
采购合同智能系统的部署质量,直接取决于底层基础设施的健壮性与自动化水平。本章聚焦于搭建一套完整的容器化交付环境,涵盖容器运行时、集群编排、持续集成流水线、制品管理及镜像仓库五大核心组件。以下按“环境准备 → 集群初始化 → 流水线配置 → 制品仓库搭建”的顺序展开。
3.1 基础设施全景架构
在动手操作之前,先明确各组件之间的协作关系。下图展示了开发环境的基础设施拓扑:
部署原则:所有组件均采用 Docker 容器化部署,Kubernetes 集群使用 kubeadm 初始化,确保环境可复现、可迁移。生产环境建议将 Nexus 与 Harbor 分别部署在独立节点上,避免资源争抢。
3.2 Docker 与 Kubernetes 集群初始化
3.2.1 Docker 安装与配置
所有节点(包括 Master 和 Worker)均需安装 Docker。推荐使用官方脚本安装,并配置国内镜像加速器。
# 安装 Docker(Ubuntu 22.04)
curl -fsSL https://get.docker.com | bash -s docker
# 配置 daemon.json
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
EOF
# 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
关键检查点:务必确认 cgroup driver 为 systemd,否则 kubelet 启动时会报 cgroup 驱动不匹配错误。使用
docker info | grep -i cgroup 验证。
3.2.2 Kubernetes 集群初始化(kubeadm)
集群版本选择 v1.28.x(稳定版),以下为 Master 节点初始化步骤:
# 安装 kubeadm、kubelet、kubectl
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet=1.28.10-1.1 kubeadm=1.28.10-1.1 kubectl=1.28.10-1.1
sudo apt-mark hold kubelet kubeadm kubectl
# 初始化 Master 节点
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.1.100 \
--kubernetes-version=v1.28.10
# 配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 安装 Flannel 网络插件
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
Worker 节点加入集群只需执行 Master 初始化后输出的 kubeadm join 命令:
# Worker 节点加入(示例)
sudo kubeadm join 192.168.1.100:6443 -- xxxxxx.xxxxxxxxxxxx \
--discovery--ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
3.2.3 集群验证清单
| 验证项 | 命令 | 预期结果 |
|---|---|---|
| 节点状态 | kubectl get nodes |
所有节点状态为 Ready |
| Pod 网络 | kubectl get pods -n kube-flannel |
flannel Pod 均为 Running |
| CoreDNS | kubectl get pods -n kube-system | grep coredns |
CoreDNS Pod 状态为 Running |
| 控制面组件 | kubectl get pods -n kube-system |
etcd、kube-apiserver、kube-controller-manager、kube-scheduler 均正常 |
经验提示:如果 Worker 节点加入后状态为 NotReady,优先检查
journalctl -u kubelet -f 日志,常见原因为网络插件未安装或 cgroup 驱动不一致。
3.3 GitLab CI/CD 流水线配置
3.3.1 Runner 注册与配置
GitLab Runner 采用 Docker executor,注册到 GitLab 实例:
# 安装 GitLab Runner(以 Ubuntu 为例)
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
sudo apt-get install gitlab-runner
# 注册 Runner
sudo gitlab-runner register \
--non-interactive \
--url "https://gitlab.example.com" \
--registration- "YOUR_REGISTRATION_" \
--executor "docker" \
--docker-image "docker:24.0.7" \
--docker-volumes "/var/run/docker.sock:/var/run/docker.sock" \
--description "k8s-runner" \
--tag-list "k8s,deploy" \
--run-untagged="true" \
--locked="false"
3.3.2 流水线阶段定义
采购合同智能系统的 CI/CD 流水线包含 5 个阶段:
| 阶段 | 作业名称 | 说明 |
|---|---|---|
| build | maven-build | Maven 编译打包,生成 JAR 包 |
| test | unit-test / integration-test | 单元测试 + 集成测试(含契约测试) |
| package | docker-build | 构建 Docker 镜像并推送至 Harbor |
| deploy | k8s-deploy | 通过 kubectl 更新 K8s Deployment |
| verify | health-check | 验证服务健康状态与接口可用性 |
3.3.3 .gitlab-ci.yml 核心片段
stages:
- build
- test
- package
- deploy
- verify
variables:
MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository"
DOCKER_IMAGE: "$HARBOR_URL/contract-system/$CI_PROJECT_NAME:$CI_COMMIT_SHORT_SHA"
maven-build:
stage: build
image: maven:3.9.6-eclipse-temurin-17
script:
- mvn clean compile -DskipTests
artifacts:
paths:
- target/*.jar
expire_in: 1 hour
docker-build:
stage: package
image: docker:24.0.7
services:
- docker:24.0.7-dind
script:
- docker build -t $DOCKER_IMAGE .
- docker login $HARBOR_URL -u $HARBOR_USER -p $HARBOR_PASS
- docker push $DOCKER_IMAGE
only:
- main
k8s-deploy:
stage: deploy
image: bitnami/kubectl:1.28
script:
- kubectl set image deployment/contract-service contract-service=$DOCKER_IMAGE -n contract-system
- kubectl rollout status deployment/contract-service -n contract-system
only:
- main
安全实践:Harbor 凭证通过 GitLab CI/CD 的 Variables 注入,禁止明文写在代码中。变量类型选择 Masked 和 Protected,仅保护分支可用。
3.4 Nexus 私服与 Harbor 镜像仓库搭建
3.4.1 Nexus Repository Manager 部署
Nexus 用于托管 Maven 构建产物(JAR、POM),减少公网依赖下载,提升构建速度。使用 Docker 部署:
# 创建持久化目录
mkdir -p /data/nexus-data
chown -R 200 /data/nexus-data
# 启动 Nexus
docker run -d \
--name nexus \
--restart always \
-p 8081:8081 \
-v /data/nexus-data:/nexus-data \
sonatype/nexus3:3.67.1
部署完成后,访问 http://<服务器IP>:8081,默认管理员密码位于容器内 /nexus-data/admin.password 文件中。
3.4.2 Nexus 仓库类型配置
| 仓库类型 | 格式 | 用途 |
|---|---|---|
| maven-central | proxy | 代理 Maven Central,缓存依赖 |
| maven-releases | hosted | 存放正式发布版本,不允许覆盖 |
| maven-snapshots | hosted | 存放快照版本,允许重复发布 |
| maven-public | group | 聚合上述三个仓库,供 Maven 客户端使用 |
在 Maven 项目的 settings.xml 中配置 Nexus 镜像:
<mirrors>
<mirror>
<id>nexus-public</id>
<mirrorOf>*</mirrorOf>
<url>http://192.168.1.100:8081/repository/maven-public/</url>
</mirror>
</mirrors>
3.4.3 Harbor 镜像仓库部署
Harbor 提供镜像存储、漏洞扫描、访问控制等能力。推荐使用离线安装包:
# 下载并解压 Harbor 离线包
wget https://github.com/goharbor/harbor/releases/download/v2.10.2/harbor-offline-installer-v2.10.2.tgz
tar xzf harbor-offline-installer-v2.10.2.tgz
cd harbor
# 复制并修改配置文件
cp harbor.yml.tmpl harbor.yml
# 修改以下关键项:
# hostname: 192.168.1.100
# harbor_admin_password: YourStrongPassword
# 如果使用 HTTP,注释掉 https 相关配置
# 执行安装
sudo ./install.sh
安装完成后,访问 http://192.168.1.100,默认管理员账号 admin,密码为配置文件中设置的密码。
3.4.4 项目与机器人账户配置
在 Harbor 中创建项目 contract-system,并创建机器人账户用于 CI/CD 推送:
- 登录 Harbor Web 控制台
- 进入 项目 → 新建项目 → 项目名称:
contract-system,访问级别:私有 - 进入 系统管理 → 机器人账户 → 新建机器人
- 名称:
gitlab-ci-push - 权限:选择
contract-system项目,赋予 推送 和 拉取 权限 - 保存后复制生成的
- 名称:
安全提醒:机器人 仅在创建时显示一次,务必立即保存到 GitLab CI/CD Variables 中。Harbor 建议启用 HTTPS,生产环境需配置证书。
3.5 基础设施验证与集成测试
所有组件部署完成后,执行端到端验证:
- Docker 验证:
docker run hello-world确认容器运行时正常 - K8s 验证:部署一个 Nginx 测试 Pod,确认跨节点通信正常
- Nexus 验证:在本地 Maven 项目执行
mvn clean install,确认依赖从 Nexus 下载 - Harbor 验证:手动构建一个测试镜像并推送至 Harbor,确认存储正常
- CI/CD 验证:在 GitLab 中推送代码,观察流水线是否完整执行并完成 K8s 部署
交付物清单:完成本章搭建后,团队应获得以下可复用资产:Docker 基础镜像(含 JDK 17)、K8s 集群 kubeadm 配置文件、GitLab CI/CD 模板、Nexus 仓库配置快照、Harbor 项目与机器人账户配置。建议将上述配置纳入版本管理,形成基础设施即代码(IaC)资产库。