使用 GitOps 方式管理配置
配置管理问题
在前面的章节中,我们将每个应用的配置都单独放到一个目录,并使用 kustomize 的方式组织目录结构。当需要对配置进行改动时,修改相应的配置文件后需重新 apply 一下,操作起来相对 繁琐,另外还存在一个难题:这些配置存放在哪,以谁的为准?如果放到路由器内,每次修改配置需要先 SSH 登录路由器进行修改并重新 apply;如果存放到自己电脑,每次修改配置都要指定用这台电脑进行修改;如果在多个设备都有保存配置,那还需要保证每个设备的配置保持同步,否则容易导致配置错乱。
GitOps 管理方案
为了解决前面提到的配置管理问题,我们可以采用 GitOps
的理念,将路由器里所有应用的配置,放到一个 Git 仓库中,然后 GitOps
工具会对比集群中的配置与 Git 仓库中声明的配置,确保集群中的配置始终符合 Git 仓库中的配置。
当要修改配置时,直接将修改提交到 Git 仓库即可,GitOps
工具会自动拉取 Git 仓库并进行调谐,将改动 apply 到集群中。
Argo CD 介绍
Argo CD 是 Kubernetes 生态中流行的 GitOps
工具,支持 kustomize
、helm
、jsonnet
以及 YAML
和 JSON
方式定义 kubernetes manifests。本文将介绍如何利用 Argo CD 来管理云原生家庭网络的配置。
创建 Git 仓库
通常我们需 要将配置存放到私有的 Git 仓库中,在国内你可以使用 gitee 来托管私有仓库,国内速度快,而且免费。
项目结构组织
前面我们已经将所有应用配置都用单独的目录保存,并采用 kustomize
方式组织结构,现在我们将其放到 Git 仓库目录下 apps
的子目录下:
apps
├── alist
│ ├── daemonset.yaml
│ └── kustomization.yaml
├── aria2
│ ├── daemonset.yaml
│ └── kustomization.yaml
├── ddns
│ ├── config
│ ├── daemonset.yaml
│ └── kustomization.yaml
├── dnsmasq
│ ├── config
│ ├── daemonset.yaml
│ └── kustomization.yaml
├── filebrowser
│ ├── daemonset.yaml
│ └── kustomization.yaml
├── home-assistant
│ ├── daemonset.yaml
│ └── kustomization.yaml
├── homepage
│ ├── config
│ ├── daemonset.yaml
│ └── kustomization.yaml
将所有配置提交并 push 到 Git 仓库。
安装 Argo CD
Argo CD 可以安装在路由器,也可以安装在其它地方。由于我有自己的 linux 开发机,并且也装了 k3s,而且家里路由器也部署了 DDNS 服务,电信宽带也支持独占公网 IP,从外部可以远程连上家里路由器的 k3s 集群,所以我将 Argo CD 安装在自己的开发机,由开发机远程管理多个 k8s 集群,其中就包括家里路由器的 k3s 集群。
具体 Argo CD 的安装方法可参考官方文档: https://argo-cd.readthedocs.io/en/stable/operator-manual/installation/
建议是给 argocd 加点自定义配置(见注释解释):
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
data:
# argocd 默认会给管理的应用打上 app.kubernetes.io/instance 这个常见注解,
# 而其它很多开源项目部署的应用也使用了这个注解,会导致冲突,改成其它的注解以避免冲突。
application.instanceLabelKey: argocd.argoproj.io/instance
# 让 kustomization.yaml 中能够使用 helmCharts 引用 helm chart,
# resources 中能够引用本目录之外目录下的内容。
kustomize.buildOptions: --enable-helm --load-restrictor=LoadRestrictionsNone
我是通过 kustomize
安装的 Argo CD,可以将上面的配置作为 patch 引用:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: argocd
patches:
- path: argocd-cm-patch.yaml
resources:
- install.yaml
Argo CD 添加集群与 Git 仓库
安装完 Argo CD 并配置好 argocd
命令后,我们来使用 argocd
命令添加下集群和 Git 仓库。
如果你的 Argo CD 就安装在路由器的 k3s 集群中,那么无需添加集群,会自动添加一个名为 in-cluster
的集群,代表本集群,后续可通过 in-cluster
来引用。如果你像我一样将 Argo CD 部署在外部的集群中,先确保你的 kubeconfig 当前的 context 能从外部操作家里的 k3s 集群,然后使用如下命令将集群添加到 Argo CD 中:
argocd cluster add home
home 改为 context 名称,也将作为后续在 Argo CD 引用的集群名称。
下面来添加 Git 仓库到 Argo CD 中:
argocd repo add --ssh-private-key-path $HOME/.ssh/id_rsa --insecure-skip-server-verification git@gitee.com:your-name/your-repo.git
要点解析:
- 添加私有仓库指定 SSH 密钥,以便让 Argo CD 有权限拉取 Git 仓库。
- 替换 Git 仓库地址为你自己仓库的地址。
创建 ApplicationSet
ApplicationSet
是 Argo CD 支持的 CRD 资源,相当于是应用模版,会根据 ApplicationSet
所声明的配置自动创建 Application