3. 环境准备:云原生基础设施的搭建与配置

本章聚焦于构建弹性伸缩运营任务编排与 CI/CD 流水线所需的底层云原生基础设施。我们将依次搭建 Kubernetes 集群、私有 Docker Registry、GitLab 代码仓库以及 Jenkins 持续集成引擎,并完成核心配置。这些组件构成了后续所有自动化流程的“底座”。

3.1 整体架构概览

下图展示了四个核心基础设施组件之间的逻辑关系与数据流。Kubernetes 作为容器编排平台,承载应用运行;Docker Registry 存储镜像;GitLab 管理代码与触发流水线;Jenkins 负责执行 CI/CD 任务。

云原生基础设施组件关系图 Kubernetes 集群 容器编排与弹性伸缩 Docker Registry 镜像存储与分发 GitLab 代码仓库与 Webhook Jenkins CI/CD 流水线引擎 箭头方向表示数据流或触发关系;虚线表示回调/状态反馈
部署顺序建议:先搭建 Kubernetes 集群,再部署 Docker Registry,然后安装 GitLab,最后部署 Jenkins。Jenkins 的配置需要依赖前三个组件的地址与凭证。

3.2 Kubernetes 集群搭建

我们使用 kubeadm 工具部署一个高可用的 Kubernetes 集群,版本选择 v1.28.x。集群包含 1 个控制平面节点和 2 个工作节点。

3.2.1 节点规格与操作系统

角色 主机名 CPU 内存 磁盘 操作系统
控制平面 k8s-master 4 核 8 GB 50 GB Ubuntu 22.04 LTS
工作节点 1 k8s-node1 4 核 8 GB 50 GB Ubuntu 22.04 LTS
工作节点 2 k8s-node2 4 核 8 GB 50 GB Ubuntu 22.04 LTS

3.2.2 初始化控制平面

在所有节点上执行基础配置后,在 master 节点上运行初始化命令:

# 所有节点执行:关闭 swap、安装 containerd、配置内核参数
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 安装 kubeadm、kubelet、kubectl(版本锁定)
sudo apt-get update
sudo apt-get install -y kubelet=1.28.0-00 kubeadm=1.28.0-00 kubectl=1.28.0-00
sudo apt-mark hold kubelet kubeadm kubectl

# 在 master 节点初始化
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

# 配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

3.2.3 安装 CNI 网络插件

选择 Flannel 作为容器网络接口(CNI)插件:

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

3.2.4 加入工作节点

在 master 节点上获取加入令牌,然后在 node1 和 node2 上执行:

# 在 master 上获取 join 命令
kubeadm  create --print-join-command

# 输出示例:
# kubeadm join 192.168.1.100:6443 -- abcdef.1234567890abcdef --discovery--ca-cert-hash sha256:xxxxxxxx

# 在 node1 和 node2 上执行上述命令
sudo kubeadm join 192.168.1.100:6443 -- abcdef.1234567890abcdef --discovery--ca-cert-hash sha256:xxxxxxxx
验证集群状态:在 master 上执行 kubectl get nodes,应看到所有节点状态为 Ready。

3.3 Docker Registry 部署

部署私有 Docker Registry 用于存储 CI/CD 流水线构建的镜像。我们使用 Docker 官方镜像,并挂载持久化存储。

3.3.1 使用 Docker Compose 部署

# 创建目录结构
mkdir -p /opt/registry/{data,auth,certs}

# 生成自签名证书(生产环境建议使用 Let's Encrypt)
openssl req -newkey rsa:4096 -nodes -sha256 -keyout /opt/registry/certs/domain.key \
  -x509 -days 365 -out /opt/registry/certs/domain.crt \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=registry.devops.local"

# docker-compose.yml 内容
version: '3.8'
services:
  registry:
    image: registry:2.8.3
    container_name: docker-registry
    restart: always
    ports:
      - "5000:5000"
    environment:
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
      REGISTRY_HTTP_TLS_KEY: /certs/domain.key
      REGISTRY_STORAGE_DELETE_ENABLED: "true"
    volumes:
      - /opt/registry/data:/var/lib/registry
      - /opt/registry/certs:/certs

# 启动
docker-compose up -d

3.3.2 配置 Kubernetes 节点信任证书

所有 Kubernetes 节点需要信任 Registry 的证书,才能拉取镜像:

# 在每个节点上执行
sudo cp /opt/registry/certs/domain.crt /usr/local/share/ca-certificates/registry.crt
sudo update-ca-certificates
sudo systemctl restart containerd

3.4 GitLab 安装与配置

GitLab 作为代码仓库和 Webhook 触发器,是流水线的起点。我们使用 Docker 方式部署 GitLab CE 版本。

3.4.1 Docker 部署 GitLab

# 创建持久化目录
mkdir -p /opt/gitlab/{config,logs,data}

# 启动 GitLab 容器
docker run --detach \
  --hostname gitlab.devops.local \
  --publish 443:443 --publish 80:80 --publish 2222:22 \
  --name gitlab \
  --restart always \
  --volume /opt/gitlab/config:/etc/gitlab \
  --volume /opt/gitlab/logs:/var/log/gitlab \
  --volume /opt/gitlab/data:/var/opt/gitlab \
  --shm-size 256m \
  gitlab/gitlab-ce:16.6.0-ce.0

3.4.2 初始配置

首次访问需要设置 root 密码,然后创建项目组和项目:

# 查看初始 root 密码
docker exec -it gitlab cat /etc/gitlab/initial_root_password

# 访问 http://gitlab.devops.local 使用 root 登录
# 创建组:devops-team
# 创建项目:elastic-scaling-app
# 在项目设置中配置 Webhook,指向 Jenkins

3.5 Jenkins 部署与配置

Jenkins 作为 CI/CD 引擎,需要与 Kubernetes、Docker Registry 和 GitLab 集成。

3.5.1 使用 Helm 部署 Jenkins

在 Kubernetes 集群中部署 Jenkins,便于动态扩展 Agent:

# 添加 Helm 仓库
helm repo add jenkins https://charts.jenkins.io
helm repo update

# 创建命名空间
kubectl create namespace jenkins

# 创建 values.yaml 配置文件
cat <<EOF > jenkins-values.yaml
controller:
  adminUser: admin
  adminPassword: devops123
  ingress:
    enabled: true
    hostName: jenkins.devops.local
  installPlugins:
    - kubernetes:1.31.3
    - workflow-aggregator:2.6
    - git:4.12.1
    - configuration-as-code:1.55
    - docker-workflow:1.29
    - gitlab-plugin:1.6.0
  JCasC:
    enabled: true
    configScripts:
      welcome-message: |
        jenkins:
          systemMessage: "弹性伸缩运营任务编排 CI/CD 流水线"
persistence:
  size: 10Gi
agent:
  enabled: true
  image: jenkins/inbound-agent:4.13-2
  resources:
    requests:
      cpu: "500m"
      memory: "512Mi"
EOF

# 部署 Jenkins
helm install jenkins jenkins/jenkins -n jenkins -f jenkins-values.yaml

3.5.2 配置 Jenkins 与 GitLab 集成

在 Jenkins 系统配置中添加 GitLab 连接:

配置项 值 说明
Connection name gitlab-connection 连接名称
GitLab host URL http://gitlab.devops.local GitLab 服务地址
Credentials GitLab API 在 GitLab 中生成 Personal Access
Webhook URL http://jenkins.devops.local/gitlab-webhook/post 自动生成,用于 GitLab 推送事件

3.5.3 配置 Jenkins 与 Docker Registry 集成

在 Jenkins 凭据中添加 Docker Registry 认证信息:

# 在 Jenkins 中执行 Pipeline 时使用 withCredentials 块
pipeline {
    agent any
    environment {
        REGISTRY_URL = 'registry.devops.local:5000'
    }
    stages {
        stage('Build & Push Image') {
            steps {
                script {
                    docker.withRegistry("https://${REGISTRY_URL}", 'docker-registry-credentials') {
                        def customImage = docker.build("${REGISTRY_URL}/elastic-scaling-app:${env.BUILD_ID}")
                        customImage.push()
                    }
                }
            }
        }
    }
}

3.6 基础设施连通性验证

完成所有组件部署后,执行以下验证步骤确保基础设施正常工作:

  1. Kubernetes 集群验证:kubectl get nodes 显示所有节点 Ready;kubectl get pods -A 查看系统组件运行正常。
  2. Docker Registry 验证:在任意节点执行 curl -k https://registry.devops.local:5000/v2/_catalog 返回 {}。
  3. GitLab 验证:浏览器访问 http://gitlab.devops.local,能正常登录并创建项目。
  4. Jenkins 验证:浏览器访问 http://jenkins.devops.local,使用 admin/devops123 登录,能看到系统信息。
  5. 端到端验证:在 GitLab 中推送代码,触发 Jenkins Pipeline,Pipeline 成功构建镜像并推送到 Registry。
常见问题:如果 Jenkins Agent 无法连接到 Kubernetes 集群,请检查 jenkins-values.yaml 中的 serviceAccount 权限配置。确保 Jenkins 的 ServiceAccount 具有创建 Pod 的权限。