温馨提示×

Kubernetes在Ubuntu上的CI/CD集成

小樊
36
2025-12-14 16:08:37
栏目: 智能运维

在 Ubuntu 上落地 Kubernetes 的 CI/CD 可按“工具选型 → 环境准备 → 流水线实现 → 安全与运维”的路径推进。下面给出可直接复用的方案与关键注意事项。


一、方案总览与工具选型

  • 常用工具与适用场景
    • Jenkins:生态成熟、插件丰富,适合已有自建平台或复杂流程编排。
    • GitLab CI:与代码托管一体化,适合“开箱即用”的流水线。
    • Argo CD:Kubernetes 原生 GitOps,声明式同步与回滚,适合生产级交付。
    • Tekton:Kubernetes 原生 CI,以 CRD 定义流水线,适合云原生团队自建标准流水线。
  • 推荐组合
    • 通用团队:Jenkins/GitLab CI + Kubernetes 实现构建与部署。
    • 生产级交付:Argo CD 管理应用发布,配合 Jenkins/GitLab CI 负责构建与镜像推送。

二、环境与前置准备

  • 基础组件
    • 在 Ubuntu 上安装与配置 kubectl、Helm、Docker(或 containerd),确保能与目标集群通信。
    • 示例(kubectl):
      • 下载并安装:curl -LO “https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl” && chmod +x ./kubectl && sudo mv ./kubectl /usr/local/bin/kubectl
    • 如使用自托管 Jenkins,建议将 jenkins 用户加入 docker 组,避免构建阶段权限问题:sudo usermod -aG docker jenkins && newgrp docker
  • 集群与网络
    • 可使用 kubeadm 搭建集群(示例):sudo kubeadm init --pod-network-cidr=10.244.0.0/16;随后部署 Flannel 等网络插件:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 权限与安全
    • 为 CI/CD 创建专用 ServiceAccountRBAC,遵循最小权限原则。
    • 在集群中预置 Secrets:镜像仓库凭证(docker-registry)、Git 凭据(ssh-auth 或 secret text)、可选 SMTP 通知凭证。

三、流水线实现示例

  • Jenkins 示例(声明式流水线)

    • 关键步骤:拉取代码 → 构建镜像 → 推送镜像 → 部署到 Kubernetes(可配合 Helm/原生命令)。
    • Jenkinsfile 片段:
      pipeline {
        agent any
        environment {
          IMAGE = "your-registry/your-app:${env.BUILD_NUMBER}"
          K8S_NS = "default"
        }
        stages {
          stage('Build') {
            steps { sh 'docker build -t $IMAGE .' }
          }
          stage('Push') {
            steps {
              withCredentials([usernamePassword(credentialsId: 'docker-hub', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) {
                sh "echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin"
                sh 'docker push $IMAGE'
              }
            }
          }
          stage('Deploy') {
            steps {
              sh "kubectl set image deployment/your-app container=$IMAGE -n $K8S_NS"
              sh "kubectl rollout status deployment/your-app -n $K8S_NS"
            }
          }
        }
      }
      
    • 提示:如需在 Kubernetes 中动态创建构建 Pod,可在 Jenkins 安装 Kubernetes 插件 并配置 Kubernetes Cloud
  • GitLab CI 示例(.gitlab-ci.yml)

    stages:
      - build
      - deploy
    
    build:
      stage: build
      script:
        - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
        - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
    
    deploy:
      stage: deploy
      script:
        - kubectl set image deployment/my-app my-app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
        - kubectl rollout status deployment/my-app
      only:
        - main
    
    • 说明:如使用 GitLab 托管镜像,可利用内置 CI_REGISTRY_IMAGECI_COMMIT_SHA 变量。
  • Argo CD(GitOps 交付)

    • 安装 Argo CD:
      kubectl create namespace argocd
      kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
      kubectl port-forward svc/argocd-server -n argocd 8080:443
      
    • 在控制台添加 Git 仓库,指向包含 Kubernetes 清单/Helm Chart 的仓库,Argo CD 会自动同步与回滚。
  • Tekton(Kubernetes 原生 CI)

    • cicd 命名空间创建 Secrets(Git SSH、镜像仓库)、ServiceAccountRBAC,组合 Tasks/Pipeline 完成拉取代码、构建(可用 Kaniko 无 Docker Daemon 构建)、推送与部署。

四、安全与运维最佳实践

  • 镜像与代码安全
    • 在构建阶段加入 镜像漏洞扫描(如 Trivy/Clair),阻止高危镜像进入仓库与集群。
  • 交付策略与回滚
    • 使用 滚动更新健康检查,必要时执行 回滚;在 GitOps 中通过 Argo CD 一键回滚到上一版本。
  • 配置与密钥管理
    • 使用 Helm 管理可复用配置与版本化发布;所有 Secrets 纳入 Kubernetes Secrets 并做最小权限控制。
  • 可观测性
    • 接入 Prometheus + Grafana 监控集群与应用指标,集中收集与分析 日志,便于快速定位问题。

0