用 DevStream 搭建 Gitlab CI + Argo CD 工具链,管理 Python Flask 项目
0 目标
在本教程中,我们将尝试通过 DevStream 来实现以下目标:
- 使用 Docker 安装 GitLab,作为代码仓库(如果你的服务器上已经安装了 GitLab,可以跳过这一步);
- 在 GitLab 上创建一个 Python Web 应用程序仓库,基于 Flask 框架;
- 使用 GitHub CI 为我们创建的仓库设置基本的 CI 流水线;
- 在 一个已有的 Kubernetes 集群 中安装 Argo CD 以实现 GitOps;
- 创建一个 Argo CD 应用程序,用于部署第 1 步中生成的 Web 应用程序。
先决条件:
- Docker (GitLab 使用 Docker 来安装)
- Kubernetes 集群(Argo CD 安装在 Kubernetes 集群中)
如果你想跟着本教程自己尝试一下,但不知道如何在本地启动和运行 Kubernetes 集群,下面的博客(也来自 DevStream)可能会有所帮助:
1 概览
DevStream 将使用下面的插件来实现第 0 节中描述的目标:
- gitlab-ce-docker:用于在 Docker 中安装 GitLab;
- repo-scaffolding: 用于在 GitLab 上创建一个 Python Web 应用程序仓库;
- gitlab-ci:用于为我们创建的仓库设置基本的 CI 流水线;
- helm-installer: 用于在 Kubernetes 集群中安装 Argo CD;
- argocdapp: 用于创建一个 Argo CD 应用程序,来部署第 1 步中生成的 Web 应用程序。
我们将分成两个步骤来完成这些目标:
- 编写一个配置文件,完成工具的安装,GitLab 和 Argo CD;
- 编写一个配置文件,完成后续流水线的创建、代码仓库的创建,并将其部署到 Argo CD 中。
说明:实际上,DevOps 工具的安装和配置可以在同一个配置文件中完成,但 GitLab 较为特殊,需要在安装完成之后由用户手动创建 token,因此我们将工具的安装单独拆分出来了。
2 启程:下载 DevStream (dtm
)
为本教程创建一个临时工作目录:
Bash
mkdir test
cd test/
接着,在新创建的目录下,运行下面的命令:
Bash
sh -c "$(curl -fsSL https://download.devstream.io/download.sh)"
这个脚本会根据你的操作系统来下载对应的 dtm
二进制文件,保存到当前目录。然后,赋予其可执行权限。
可选:你可以把
dtm
移动到 $PATH 环境变量中的某个目录下。例如:mv dtm /usr/local/bin/
。这样,你就可以直接运行dtm
而不需要再加上./
前缀了。更多安装方式详见安装 dtm。
2 安装 GitLab 和 Argo CD
2.1 配置准备
创建 config-tools.yaml
文件,你可以修改 vars
中的值来适应你的环境:
config-tools.yaml
config:
state:
backend: local
options:
stateFile: devstream-1.state
vars:
gitlabHostname: gitlab.example.com
gitlabSSHPort: 30022
gitlabHttpPort: 80
gitlabHttpsPort: 30443
tools:
- name: gitlab-ce-docker
instanceID: default
dependsOn: []
options:
hostname: [[ gitlabHostname ]]
gitlabHome: /srv/gitlab
sshPort: [[ gitlabSSHPort ]]
httpPort: [[ gitlabHttpPort ]]
httpsPort: [[ gitlabHttpsPort ]]
rmDataAfterDelete: false
imageTag: "rc"
- name: helm-installer
instanceID: argocd
并修改服务器的 /etc/hosts
文件,添加 gitlab.example.com
的域名解析。如果你的服务器 ip 是 44.33.22.11,就可以这样配置:
/etc/hosts
44.33.22.11 gitlab.example.com
2.2 初始化(Init)
运行下面的命令来下载安装 GitLab 和 Argo CD 所需的插件:
Bash
dtm init -f config-tools.yaml -y
2.3 应用(Apply)
运行下面的命令来通过配置文件来安装 GitLab 和 Argo CD:
Bash
dtm apply -f config-tools.yaml -y
你会看到类似于下面的输出:
2.4 检查安装结果
2.4.1 访问 GitLab
你可以在自己的 PC 里配置 44.33.22.11 gitlab.example.com
静态域名解析记录,然后在浏览器里通过 http://gitlab.example.com
访问到 GitLab(如果浏览器报了:
GitLab 登录界面
通过执行如下命令,你可以设置 GitLab 的 root 密码:
get GitLab root Password
docker exec -it gitlab bash # 进入容器
gitlab-rake "gitlab:password:reset" # 执行后按照提示输入用户名 root,回车后输入密码
拿到 root 密码后,你可以尝试用 root/YOUR_PASSWORD 来登录 GitLab。因为后面你还需要用到 GitLab 的 token,所以这时候你可以顺手先创建一个 token:
Generate GitLab token
2.4.2 查看 Argo CD
可以看到 Argo CD 已经被安装到了 Kubernetes 的 argocd
命名空间中:
Bash
[root@ip-10-18-13-200 devstream]# kubectl get ns
NAME STATUS AGE
argocd Active 36s
default Active 6d4h
kube-node-lease Active 6d4h
kube-public Active 6d4h
kube-system Active 6d4h
[root@ip-10-18-13-200 devstream]# kubectl get pods -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 49s
argocd-applicationset-controller-7f4577c5fd-8z926 1/1 Running 0 49s
argocd-dex-server-7cdb45c7c9-nspgz 1/1 Running 0 49s
argocd-notifications-controller-65b77fb646-phdwh 1/1 Running 0 49s
argocd-redis-577c6c8f5c-nf5xm 1/1 Running 0 49s
argocd-repo-server-7bd9fd899c-7f6cp 1/1 Running 0 49s
argocd-server-6686bbcf68-fms5w 1/1 Running 0 49s
3 创建、部署应用程序
3.1 配置准备
创建 config-apps.yaml
文件,你可以修改 vars
中的值来适应你的环境(尤其是dockerhubUser
这个配置):
config-apps.yaml
config:
state:
backend: local
options:
stateFile: devstream-2.state
vars:
appName: myapp
gitlabURL: http://gitlab.example.com
defaultBranch: main
dockerhubUser: DOCKERHUB_USER
apps:
- name: [[ appName ]]
spec:
language: python
framework: flask
repo:
url: [[ gitlabURL ]]/root/[[ appName ]].git
branch: [[ defaultBranch ]]
token: [[ env GITLAB_TOKEN ]] # use "GITLAB_TOKEN" env var
repoTemplate:
url: https://github.com/devstream-io/dtm-repo-scaffolding-python-flask.git
ci:
- type: template
templateName: ci-pipeline
cd:
- type: argocdapp
pipelineTemplates:
- name: ci-pipeline
type: gitlab-ci
options:
runner:
enable: true
imageRepo:
user: [[ dockerhubUser ]]
password: [[ env DOCKERHUB_TOKEN ]] # use "DOCKERHUB_TOKEN" env var
你可能已经注意到了,上面的配置中有形如 [[ env XXX ]]
的内容,这表示我们引用了 “XXX” 环境变量来填充配置。所以我们还需要设置如下两个环境变量:
Bash
export GITLAB_TOKEN="YOUR_GITLAB_TOKEN_HERE"
export DOCKERHUB_TOKEN="YOUR_DOCKERHUB_TOKEN_HERE"
提示:
如果你不知道如何创建 DockerHub 的 token,可以参考:Manage access tokens
3.2 初始化(Init)
同样地,我们需要下载第二个配置文件中所需的插件,运行:
Bash
dtm init -f config-apps.yaml
3.3 应用(Apply)
运行:
Bash
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/CD
、Pipelines
:
GitLab CI 概览
3.4.3 基于 Argo CD 的持续交付/部署
CI 流水线已经构建了一个 Docker 镜像并推送到了 Dockerhub,而 DevStream 创建的 Argo CD 应用也部署了这个应用:
Bash
[root@ip-10-18-13-200 devstream]# kubectl get deployment -n default
NAME READY UP-TO-DATE AVAILABLE AGE
myapp 1/1 1 1 101s
[root@ip-10-18-13-200 devstream]# kubectl get pods -n default
NAME READY STATUS RESTARTS AGE
myapp-b65774f56-8cmjc 1/1 Running 0 106s
[root@ip-10-18-13-200 devstream]# kubectl get services -n default
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12d
myapp ClusterIP 10.101.148.66 <none> 8080/TCP 110s
我们可以通过端口转发来访问这个应用:
Bash
kubectl port-forward -n default svc/myapp 8080:8080
在浏览器中访问 localhost:8080
,你可以看到应用返回了一个 “Hello, World!”。大功告成!
4 清理
4.1 删除 Web 应用
运行:
Bash
dtm delete -f config-apps.yaml -y
4.2 删除 GitLab 和 Argo CD
运行:
Bash
dtm delete -f config-tools.yaml -y
4.3 删除其他文件
Bash
cd ../
rm -rf test/
rm -rf ~/.devstream/