用 DevStream 搭建 Gitlab CI + Argo CD 工具链,管理 Python Flask 项目

    1. 使用 Docker 安装 GitLab,作为代码仓库(如果你的服务器上已经安装了 GitLab,可以跳过这一步);
    2. 在 GitLab 上创建一个 Python Web 应用程序仓库,基于 Flask 框架;
    3. 使用 GitHub CI 为我们创建的仓库设置基本的 CI 流水线;
    4. 一个已有的 Kubernetes 集群 中安装 以实现 GitOps;
    5. 创建一个 Argo CD 应用程序,用于部署第 1 步中生成的 Web 应用程序。

    1 概览

    DevStream 将使用下面的插件来实现中描述的目标:

    1. gitlab-ce-docker:用于在 Docker 中安装 GitLab;
    2. : 用于在 GitLab 上创建一个 Python Web 应用程序仓库;
    3. gitlab-ci:用于为我们创建的仓库设置基本的 CI 流水线;
    4. : 用于在 Kubernetes 集群中安装 Argo CD;
    5. argocdapp: 用于创建一个 Argo CD 应用程序,来部署第 1 步中生成的 Web 应用程序。

    我们将分成两个步骤来完成这些目标:

    1. 编写一个配置文件,完成工具的安装,GitLab 和 Argo CD;
    2. 编写一个配置文件,完成后续流水线的创建、代码仓库的创建,并将其部署到 Argo CD 中。

    为本教程创建一个临时工作目录:

    Bash

    接着,在新创建的目录下,运行下面的命令:

    Bash

    1. sh -c "$(curl -fsSL https://download.devstream.io/download.sh)"

    这个脚本会根据你的操作系统来下载对应的 dtm 二进制文件,保存到当前目录。然后,赋予其可执行权限。

    2 安装 GitLab 和 Argo CD

    创建 config-tools.yaml 文件,你可以修改 vars 中的值来适应你的环境:

    config-tools.yaml

    1. config:
    2. state:
    3. backend: local
    4. options:
    5. stateFile: devstream-1.state
    6. gitlabHostname: gitlab.example.com
    7. gitlabSSHPort: 30022
    8. gitlabHttpPort: 80
    9. gitlabHttpsPort: 30443
    10. tools:
    11. - name: gitlab-ce-docker
    12. instanceID: default
    13. dependsOn: []
    14. options:
    15. hostname: [[ gitlabHostname ]]
    16. gitlabHome: /srv/gitlab
    17. sshPort: [[ gitlabSSHPort ]]
    18. httpPort: [[ gitlabHttpPort ]]
    19. httpsPort: [[ gitlabHttpsPort ]]
    20. rmDataAfterDelete: false
    21. imageTag: "rc"
    22. - name: helm-installer
    23. instanceID: argocd

    并修改服务器的 /etc/hosts 文件,添加 gitlab.example.com 的域名解析。如果你的服务器 ip 是 44.33.22.11,就可以这样配置:

    /etc/hosts

    1. 44.33.22.11 gitlab.example.com

    2.2 初始化(Init)

    运行下面的命令来下载安装 GitLab 和 Argo CD 所需的插件:

    Bash

    1. dtm init -f config-tools.yaml -y

    2.3 应用(Apply)

    Bash

    你会看到类似于下面的输出:

    2.4.1 访问 GitLab

    你可以在自己的 PC 里配置 44.33.22.11 gitlab.example.com 静态域名解析记录,然后在浏览器里通过 http://gitlab.example.com 访问到 GitLab(如果浏览器报了:

    GitLab 登录界面

    通过执行如下命令,你可以设置 GitLab 的 root 密码:

    get GitLab root Password

    1. gitlab-rake "gitlab:password:reset" # 执行后按照提示输入用户名 root,回车后输入密码

    拿到 root 密码后,你可以尝试用 root/YOUR_PASSWORD 来登录 GitLab。因为后面你还需要用到 GitLab 的 token,所以这时候你可以顺手先创建一个 token:

    GitLab token

    Generate GitLab token

    2.4.2 查看 Argo CD

    可以看到 Argo CD 已经被安装到了 Kubernetes 的 argocd 命名空间中:

    Bash

    1. [root@ip-10-18-13-200 devstream]# kubectl get ns
    2. NAME STATUS AGE
    3. argocd Active 36s
    4. default Active 6d4h
    5. kube-node-lease Active 6d4h
    6. kube-public Active 6d4h
    7. kube-system Active 6d4h
    8. [root@ip-10-18-13-200 devstream]# kubectl get pods -n argocd
    9. NAME READY STATUS RESTARTS AGE
    10. argocd-application-controller-0 1/1 Running 0 49s
    11. argocd-applicationset-controller-7f4577c5fd-8z926 1/1 Running 0 49s
    12. argocd-dex-server-7cdb45c7c9-nspgz 1/1 Running 0 49s
    13. argocd-notifications-controller-65b77fb646-phdwh 1/1 Running 0 49s
    14. argocd-redis-577c6c8f5c-nf5xm 1/1 Running 0 49s
    15. argocd-repo-server-7bd9fd899c-7f6cp 1/1 Running 0 49s
    16. argocd-server-6686bbcf68-fms5w 1/1 Running 0 49s

    3.1 配置准备

    创建 config-apps.yaml 文件,你可以修改 vars 中的值来适应你的环境(尤其是dockerhubUser这个配置):

    config-apps.yaml

    1. config:
    2. state:
    3. backend: local
    4. options:
    5. stateFile: devstream-2.state
    6. vars:
    7. appName: myapp
    8. defaultBranch: main
    9. dockerhubUser: DOCKERHUB_USER
    10. apps:
    11. - name: [[ appName ]]
    12. spec:
    13. language: python
    14. framework: flask
    15. repo:
    16. url: [[ gitlabURL ]]/root/[[ appName ]].git
    17. branch: [[ defaultBranch ]]
    18. repoTemplate:
    19. url: https://github.com/devstream-io/dtm-repo-scaffolding-python-flask.git
    20. ci:
    21. - type: template
    22. templateName: ci-pipeline
    23. cd:
    24. - type: argocdapp
    25. pipelineTemplates:
    26. - name: ci-pipeline
    27. type: gitlab-ci
    28. options:
    29. runner:
    30. enable: true
    31. imageRepo:
    32. user: [[ dockerhubUser ]]
    33. password: [[ env DOCKERHUB_TOKEN ]] # use "DOCKERHUB_TOKEN" env var

    你可能已经注意到了,上面的配置中有形如 [[ env XXX ]] 的内容,这表示我们引用了 “XXX” 环境变量来填充配置。所以我们还需要设置如下两个环境变量:

    Bash

    1. export GITLAB_TOKEN="YOUR_GITLAB_TOKEN_HERE"
    2. export DOCKERHUB_TOKEN="YOUR_DOCKERHUB_TOKEN_HERE"

    3.2 初始化(Init)

    Bash

    运行:

    Bash

    1. dtm apply -f config-apps.yaml -y

    你会看到类似下面的输出:

    3.4 查看结果

    3.4.1 查看 在 GitLab 上创建的 Flask 仓库

    Flask 仓库

    3.4.2 基于 GitLab CI 的 CI 流水线

    通过浏览器访问 http://gitlab.example.com,依次点击 CI/CDPipelines

    GitLab CI 概览

    GitLab CI 概览

    3.4.3 基于 Argo CD 的持续交付/部署

    CI 流水线已经构建了一个 Docker 镜像并推送到了 Dockerhub,而 DevStream 创建的 Argo CD 应用也部署了这个应用:

    Bash

    1. [root@ip-10-18-13-200 devstream]# kubectl get deployment -n default
    2. NAME READY UP-TO-DATE AVAILABLE AGE
    3. myapp 1/1 1 1 101s
    4. [root@ip-10-18-13-200 devstream]# kubectl get pods -n default
    5. NAME READY STATUS RESTARTS AGE
    6. myapp-b65774f56-8cmjc 1/1 Running 0 106s
    7. [root@ip-10-18-13-200 devstream]# kubectl get services -n default
    8. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    9. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12d
    10. myapp ClusterIP 10.101.148.66 <none> 8080/TCP 110s

    我们可以通过端口转发来访问这个应用:

    Bash

    1. kubectl port-forward -n default svc/myapp 8080:8080

    在浏览器中访问 localhost:8080,你可以看到应用返回了一个 “Hello, World!”。大功告成!

    4 清理

    4.1 删除 Web 应用

    运行:

    Bash

    1. dtm delete -f config-apps.yaml -y

    运行:

    Bash

    4.3 删除其他文件

    1. cd ../
    2. rm -rf test/
    3. rm -rf ~/.devstream/