3. 环境准备:云原生基础设施的搭建与配置
本章聚焦于构建弹性伸缩运营任务编排与 CI/CD 流水线所需的底层云原生基础设施。我们将依次搭建 Kubernetes 集群、私有 Docker Registry、GitLab 代码仓库以及 Jenkins 持续集成引擎,并完成核心配置。这些组件构成了后续所有自动化流程的“底座”。
3.1 整体架构概览
下图展示了四个核心基础设施组件之间的逻辑关系与数据流。Kubernetes 作为容器编排平台,承载应用运行;Docker Registry 存储镜像;GitLab 管理代码与触发流水线;Jenkins 负责执行 CI/CD 任务。
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
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 基础设施连通性验证
完成所有组件部署后,执行以下验证步骤确保基础设施正常工作:
- Kubernetes 集群验证:
kubectl get nodes显示所有节点 Ready;kubectl get pods -A查看系统组件运行正常。 - Docker Registry 验证:在任意节点执行
curl -k https://registry.devops.local:5000/v2/_catalog返回{}。 - GitLab 验证:浏览器访问
http://gitlab.devops.local,能正常登录并创建项目。 - Jenkins 验证:浏览器访问
http://jenkins.devops.local,使用 admin/devops123 登录,能看到系统信息。 - 端到端验证:在 GitLab 中推送代码,触发 Jenkins Pipeline,Pipeline 成功构建镜像并推送到 Registry。
jenkins-values.yaml 中的 serviceAccount 权限配置。确保 Jenkins 的 ServiceAccount 具有创建 Pod 的权限。