Django - 云环境中的持续集成

CICD 的工作流程

CICD 包含如下流程

  • Build & Package
  • Test
  • Deployment CICD的工作流程

需要的服务

  • Git 仓库:使用 Github
  • Docker 镜像仓库:使用阿里云镜像仓库
  • Jenkins:使用阿里云 k8s 上搭建的 jenkins
  • K8s: 使用阿里云 k8s

CICD 工具

  • Jenkins:Jenkins pipeline 流水线
    • CICD Pipeline: 包含一系列按照指定顺序执行的脚本
    • 包含有用来完成任务的多个阶段(stages)
  • Spinnaker
  • Harness

CD 阶段不同的部署策略

  • Rolling Upgrade: 滚动更新,多个实例,下线一台升级一台,直至升级完
  • Blue/Green Deployment: 蓝绿部署,部署到新集群,部署完切流量到新集群
  • Canary Deployment:金丝雀部署,过程中新老版本共存,持续做灰度验证
    CD阶段不同的部署策略

CICD 的使用 - 前提

如何对 Django Web 应用进行 CICD, 自动化镜像打包,测试,发布,部署

  • 前提:镜像的构建不依赖于本地的文件
  • 安全策略:账号密码不保存在代码库中
  • 账号密码保存到哪里? 密码如何使用?
    • Kubernetes Secrets
    • KMS 系统: 如 Vault,阿里云 KMS 等

使用 Kubernetes Secrets 管理账号密码

用 Kubernetes Secrets 管理账号密码的使用流程

  • K8s secrets 中管理密码,k8s 配置文件中引用密码,代码中通过环境变量来引用

什么是 Kubernetes Secrets?

如何使用

  • 基于文件创建 Secret:kubectl apply -f mysecret.yaml
  • 基于命令创建:kubectl create secret generic
  • 在云厂商 k8s 的管理控制台创建 secrets

示例

1
kubectl create secret generic prod-db-secret --fromliteral=username=produser --from-literal=password=Y4nys7f11
1
kubectl get secret prod-db-secret
1
kubectl describe secret prod-db-secret
1
kubectl delete secret prod-db-secret

CICD 的使用 – 阿里云创建密钥

  1. 创建密钥:配置管理 – 保密字典

    阿里云创建密钥

  2. 使用密钥:K8s 文件中引用 secrets

    阿里云创建密钥

  3. Python 代码从环境变量读取配置

    阿里云创建密钥

CICD 的使用 - Jenkins 使用

搭建 k8s 中的 Jenkins 环境

使用 Jenkins DoD 版本 (Docker on Docker),部署到 k8s

1
cd Jenkins-dod
1
docker pull ihopeit/jenkins-dod:1.1
1
docker tag ihopeit/jenkins-dod:1.1 registry.cn-beijing.aliyuncs.com/ihopeit/jenkins-dod:1.1
1
docker push registry.cn-beijing.aliyuncs.com/ihopeit/jenkins-dod:1.1

初始化完成后,部署到 k8s

1
kubectl apply -f jenkins-service.yaml
1
kubectl apply -f jenkins-deployment.yaml

jenkins 的启动日志里面会自动产生初始化的 admin 密码,可用于登陆

流程总结

  • 阿里云 K8s 创建 Jenkins 路由(ingress 路由)
  • 访问 Jenkins, 配置 kubeconfig, 配置 阿里云 镜像仓库账号密码
  • 创建 Jenkins 项目, Pipeline 项目,设置 Pipeline
  • Build 项目