3. 开发环境与基础设施搭建

采购合同智能系统的部署质量,直接取决于底层基础设施的健壮性与自动化水平。本章聚焦于搭建一套完整的容器化交付环境,涵盖容器运行时、集群编排、持续集成流水线、制品管理及镜像仓库五大核心组件。以下按“环境准备 → 集群初始化 → 流水线配置 → 制品仓库搭建”的顺序展开。

3.1 基础设施全景架构

在动手操作之前,先明确各组件之间的协作关系。下图展示了开发环境的基础设施拓扑:

开发环境基础设施拓扑 开发者 GitLab GitLab Runner Nexus 私服 Harbor 仓库 K8s Master K8s Worker 说明:开发者提交代码至 GitLab,触发 Runner 执行 CI/CD 流水线;构建产物上传 Nexus,镜像推送至 Harbor;最终由 K8s 集群拉取镜像完成部署。
部署原则:所有组件均采用 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 推送:

  1. 登录 Harbor Web 控制台
  2. 进入 项目 → 新建项目 → 项目名称:contract-system,访问级别:私有
  3. 进入 系统管理 → 机器人账户 → 新建机器人
    • 名称:gitlab-ci-push
    • 权限:选择 contract-system 项目,赋予 推送 和 拉取 权限
    • 保存后复制生成的
安全提醒:机器人 仅在创建时显示一次,务必立即保存到 GitLab CI/CD Variables 中。Harbor 建议启用 HTTPS,生产环境需配置证书。

3.5 基础设施验证与集成测试

所有组件部署完成后,执行端到端验证:

  1. Docker 验证:docker run hello-world 确认容器运行时正常
  2. K8s 验证:部署一个 Nginx 测试 Pod,确认跨节点通信正常
  3. Nexus 验证:在本地 Maven 项目执行 mvn clean install,确认依赖从 Nexus 下载
  4. Harbor 验证:手动构建一个测试镜像并推送至 Harbor,确认存储正常
  5. CI/CD 验证:在 GitLab 中推送代码,观察流水线是否完整执行并完成 K8s 部署
基础设施集成验证流程 Docker 验证 K8s 验证 Nexus 验证 Harbor 验证 CI/CD 验证 验证通过标准: 1. Docker: hello-world 容器正常启动并退出 2. K8s: Nginx Pod 状态为 Running,跨节点访问正常 3. Nexus: Maven 构建成功,依赖从私服获取 4. Harbor: 镜像推送/拉取成功,Web UI 可见 5. CI/CD: 流水线全绿,K8s 服务自动更新
交付物清单:完成本章搭建后,团队应获得以下可复用资产:Docker 基础镜像(含 JDK 17)、K8s 集群 kubeadm 配置文件、GitLab CI/CD 模板、Nexus 仓库配置快照、Harbor 项目与机器人账户配置。建议将上述配置纳入版本管理,形成基础设施即代码(IaC)资产库。