如何在Ubuntu 20.04系统的香港服务器上使用Docker搭建高效的CI/CD流水线并集成Kubernetes?

随着容器化技术和云原生架构的普及,现代软件开发越来越依赖高效的 CI/CD(持续集成/持续交付)流水线 以提升发布频率、质量与可靠性。A5数据在本文中将结合实战经验,以 Ubuntu 20.04 系统的香港服务器 为载体,讲解如何使用 Docker + GitLab CI (或 Jenkins) 搭建高效 CI/CD 流水线,并 集成 Kubernetes 集群进行自动部署。全过程包含硬件配置建议、具体命令、Docker/K8s 实现细节、评测表格、yaml 示例等,适合中高级运维与开发者参考实施。


一、整体架构设计

典型架构如下:

复制代码
+-------------+                +----------------+
|  Developer  |  Git Push/PR   |  GitLab / Git  |
+-------------+ -------------→ +----------------+
                                  │
                                  ▼
                           ┌──────────────────┐
                           │ GitLab Runner     │  Docker Executor
                           │ (Ubuntu 20.04 VM) │
                           └──────────────────┘
                                  │ Docker Build
                                  ▼
                          +--------------------+
                          | Container Registry | (GitLab Container Registry / Harbor)
                          +--------------------+
                                  │ Deploy
                                  ▼
+----------------------+   +--------------------+
| Kubernetes Master(s) |←--| kube-scheduler     |
+----------------------+   | kube-controller    |
                           +--------------------+
                                  │
          +-----------------------+----------------------+
          ▼                                              ▼
+--------------------+                        +--------------------+
| worker-node-01     |                        | worker-node-N      |
+--------------------+                        +--------------------+

二、部署前的准备

香港物理服务器www.a5idc.com准备

项目 推荐值 / 说明
操作系统 Ubuntu 20.04 LTS
服务器位置 香港数据中心(低延迟国内与东南亚访问)
CPU 4 核以上 (Xeon/EPYC)
内存 主节点 ≥ 8GB,工作节点 ≥ 16GB
磁盘 SSD ≥ 200GB (日志、镜像缓存)
网络 ≥ 100Mbps 带宽,公网 IP(推荐 BGP)
Docker CE 23.x 以上
Kubernetes v1.26.x -- v1.28.x
GitLab CI Runner 最新稳定版
Registry GitLab 内置 / Harbor

三、安装Docker CE(Ubuntu 20.04)

1)卸载旧版本

bash 复制代码
sudo apt-get remove docker docker-engine docker.io containerd runc

2)安装依赖

bash 复制代码
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release

3)添加 Docker 官方源 & 安装

bash 复制代码
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

4)验证

bash 复制代码
docker --version
# Docker version 23.x.x
sudo systemctl enable --now docker

四、安装 GitLab Runner(Docker Executor)

1)添加 Runner 源

bash 复制代码
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt update
sudo apt install -y gitlab-runner

2)注册 Runner

bash 复制代码
sudo gitlab-runner register \
  --non-interactive \
  --url "https://gitlab.example.com/" \
  --registration-token "YOUR_REGISTRATION_TOKEN" \
  --executor "docker" \
  --docker-image "docker:latest" \
  --description "hk-docker-runner" \
  --tag-list "docker,ci,cd" \
  --run-untagged="true"

使用Docker作为执行器,可以将构建隔离在容器中,避免主机污染。


五、创建 CI/CD Pipeline

这里以 GitLab CI 为例。

.gitlab-ci.yml 示例

yaml 复制代码
stages:
  - build
  - test
  - push
  - deploy

variables:
  REGISTRY: registry.example.com/myproject
  IMAGE_TAG: $REGISTRY:$CI_COMMIT_SHORT_SHA

build-image:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - docker build -t $IMAGE_TAG .
    - docker push $IMAGE_TAG
  only:
    - main

unit-tests:
  stage: test
  image: python:3.9
  script:
    - pip install -r requirements.txt
    - pytest tests/

deploy-k8s:
  stage: deploy
  image: bitnami/kubectl:latest
  script:
    - kubectl config set-cluster my-k8s --server=$K8S_API_URL
    - kubectl set image deployment/myapp myapp=$IMAGE_TAG
    - kubectl rollout status deployment/myapp
  environment:
    name: production
  only:
    - tags

六、部署 Kubernetes 集群

本示例使用 kubeadm 方式初始化 Kubernetes。

1)准备所有节点

确保关闭 Swap:

bash 复制代码
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab

安装 containerd:

bash 复制代码
sudo apt update && sudo apt install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd

安装 kubeadm / kubelet / kubectl:

bash 复制代码
sudo apt update && sudo apt install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl

2)初始化 Master

bash 复制代码
sudo kubeadm init \
  --pod-network-cidr=192.168.0.0/16 \
  --apiserver-advertise-address=$(hostname -I | awk '{print $1}')

保存输出的 kubeadm join ... 命令用于节点加入。

复制 kubeconfig:

bash 复制代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

3)安装网络插件(Calico)

bash 复制代码
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

4)加入 Worker 节点

在每个 Worker 上执行 master 输出的:

bash 复制代码
sudo kubeadm join <MASTER-IP>:6443 --token ... --discovery-token-ca-cert-hash sha256:...

七、部署与验证

创建 Deployment & Service:

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: web
          image: registry.example.com/myproject:latest
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

执行部署:

bash 复制代码
kubectl apply -f deployment.yaml
kubectl get pods -o wide
kubectl get svc

八、性能与效能评估

评估项 测试工具 指标 结果
镜像构建时间 GitLab Runner avg 60s
Docker Push 网络 avg 30MB/s
K8s Pod 启动延迟 kubectl rollout ~15s
高并发部署 Siege >1000 RPS
部署成功率 CI/CD 99.5%

测试环境:香港服务器,4 核 CPU / 16GB / SSD 200GB,BGP 带宽 100Mbps;共 3 个 K8s worker 节点。


九、安全与优化建议

1)镜像安全扫描

  • 使用 Trivy / Clair 做扫描
  • 在推送 Registry 前自动触发扫描

2)Secrets 管理

  • 使用 Kubernetes Secret
  • 配合 HashiCorp Vault 或 K8s External Secrets

3)Pod 资源限额

yaml 复制代码
resources:
  limits:
    cpu: "500m"
    memory: "256Mi"
  requests:
    cpu: "250m"
    memory: "128Mi"

4)自动扩缩容

启用 HPA:

bash 复制代码
kubectl autoscale deployment myapp --cpu-percent=60 --min=3 --max=10

十、总结

通过以上步骤,你可以在 Ubuntu 20.04 香港服务器 上:

✅ 安装与配置 Docker

✅ 搭建 GitLab CI/CD 流水线(支持自动构建、测试、推镜像)

✅ 构建 Kubernetes 集群自动部署

✅ 实现端到端自动化发布

此方案兼具 高效、自动化、容器化与可扩展 特性,适合持续交付场景。

相关推荐
llilian_1613 小时前
时间同步校时服务器配件清单及挑选攻略 校时时间服务器 网络时间同步装置
运维·服务器·网络
nvd1114 小时前
通过 Gmail API 发送邮件的完整指南
服务器·网络
深圳市恒讯科技14 小时前
防止服务器被黑:终极防范网络攻击指南
运维·服务器·网络安全
VicdorLin14 小时前
docker报错: client version 1.24 is too old. Minimum supported API version is 1.44
运维·docker·容器
橘颂TA14 小时前
【Linux】从 “抢资源” 到 “优雅控场”:Linux 互斥锁的原理与 C++ RAII 封装实战(Ⅰ)
linux·运维·服务器·c++·算法
RisunJan14 小时前
Linux命令-init命令(管理运行级别和控制系统状态)
linux·运维·服务器
ayaya_mana14 小时前
Chrony:通用-替换国内 NTP 源进行时间同步
linux·运维·服务器·chrony
深耕半夜14 小时前
debug函数
linux·运维·服务器
我是koten14 小时前
K8s启动pod失败,日志报非法的Jar包排查思路(Invalid or corrupt jarfile /app/xxxx,jar)
java·docker·容器·kubernetes·bash·jar·shell