
写完一段时间后 ,在那里我熟练地管理了 jsonnet 和 gitlab,我意识到管道当然很好,但不必要的复杂和不方便。
在大多数情况下,需要一个典型的任务:“生成 YAML 并将其放入 Kubernetes”。 事实上,这正是 Argo CD 做得非常好的地方。
Argo CD 允许您连接 Git 存储库并将其状态发送到 Kubernetes。 默认情况下,支持多种类型的应用程序:Kustomize、Helm 图表、Ksonnet、裸 Jsonnet 或仅包含 YAML/JSON 清单的目录。
这套对于大多数用户来说已经足够了,但并不适合所有人。 为了满足每个人的需求,Argo CD 具有使用自定义工具的能力。
首先,我对添加支持的可能性感兴趣 и ,这在上一篇文章中已经充分讨论过。
在开始配置之前,您首先需要准确了解 Argo CD 的工作原理。
对于每个添加的应用程序,它有两个阶段:
- 初始化 — 部署前的初步准备,这里可能发生任何事情:下载依赖项、解压机密等等。
- 生成 — 直接执行清单生成命令,输出必须是有效的 YAML 流,这正是将应用于集群的内容。
值得注意的是,Argo 将这种方法应用于任何类型的应用程序,包括 Helm。 也就是说,在 Argo CD Helm 中不会将版本部署到集群,而仅用于生成清单。
就其本身而言,Argo 可以本地处理 Helm 钩子,这使得它不会违反应用发布的逻辑。
昆士兰商贸中心
Qbec 可以让您方便地使用 jsonnet 描述应用程序,此外还具有渲染 Helm 图表的能力,并且由于 Argo CD 可以正常处理 Helm hook,因此将此功能与 Argo CD 结合使用可以让您获得更正确的结果。
为了向 argocd 添加 qbec 支持,您需要做两件事:
- 在 Argo CD 配置中,必须定义用于生成清单的自定义插件和命令。
- 映像中必须存在必要的二进制文件 argocd-repo-服务器.
第一个任务 很简单:
# cm.yaml
data:
configManagementPlugins: |
- name: qbec
generate:
command: [sh, -xc]
args: ['qbec show "$ENVIRONMENT" -S --force:k8s-namespace "$ARGOCD_APP_NAMESPACE"'](团队 初始化 不曾用过)
$ kubectl -n argocd patch cm/argocd-cm -p "$(cat cm.yaml)"建议添加二进制文件 ,或使用 :
# deploy.yaml
spec:
template:
spec:
# 1. Define an emptyDir volume which will hold the custom binaries
volumes:
- name: custom-tools
emptyDir: {}
# 2. Use an init container to download/copy custom binaries into the emptyDir
initContainers:
- name: download-tools
image: alpine:3.12
command: [sh, -c]
args:
- wget -qO- https://github.com/splunk/qbec/releases/download/v0.12.2/qbec-linux-amd64.tar.gz | tar -xvzf - -C /custom-tools/
volumeMounts:
- mountPath: /custom-tools
name: custom-tools
# 3. Volume mount the custom binary to the bin directory (overriding the existing version)
containers:
- name: argocd-repo-server
volumeMounts:
- mountPath: /usr/local/bin/qbec
name: custom-tools
subPath: qbec
- mountPath: /usr/local/bin/jsonnet-qbec
name: custom-tools
subPath: jsonnet-qbec$ kubectl -n argocd patch deploy/argocd-repo-server -p "$(cat deploy.yaml)"现在让我们看看我们的应用程序清单是什么样子的:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: qbec-app
namespace: argocd
spec:
destination:
namespace: default
server: https://kubernetes.default.svc
project: default
source:
path: qbec-app
plugin:
env:
- name: ENVIRONMENT
value: default
name: qbec
repoURL: https://github.com/kvaps/argocd-play
syncPolicy:
automated:
prune: true在一个变量中 环境 我们传递需要为其生成清单的环境的名称。
让我们应用它,看看我们会得到什么:

应用程序已部署,太棒了!
git 密码
Git-crypt 允许您为存储库设置透明加密。 这是一种直接在 git 中存储敏感数据的简单且安全的方法。
git-crypt 的实现变得更加困难。
理论上我们可以做 git-crypt unlock 在我们的自定义插件的初始化阶段,但这不是很方便,因为它不允许使用本机部署方法。 例如,在 Helm 和 Jsonnet 的情况下,我们失去了灵活的 GUI 界面,该界面允许我们简化应用程序配置(值文件等)。
这就是为什么我想在克隆期间的早期阶段打印存储库。
由于目前 Argo CD 不提供描述用于同步存储库的任何钩子的功能,因此我们必须使用一个棘手的 shell 脚本来替换 git 命令来绕过此限制:
#!/bin/sh
$(dirname $0)/git.bin "$@"
ec=$?
[ "$1" = fetch ] && [ -d .git-crypt ] || exit $ec
GNUPGHOME=/app/config/gpg/keys git-crypt unlock 2>/dev/null
exit $ecArgo CD 演出 git fetch 每次部署操作之前。 我们将把执行分配给这个命令 git-crypt unlock 解锁存储库。
对于测试你可以使用 其中已经拥有您需要的一切:
$ kubectl -n argocd set image deploy/argocd-repo-server argocd-repo-server=docker.io/kvaps/argocd-git-crypt:v1.7.3现在我们需要考虑 Argo 将如何解密我们的存储库。 即为其生成一个 gpg 密钥:
$ kubectl exec -ti deploy/argocd-repo-server -- bash
$ printf "%sn"
"%no-protection"
"Key-Type: default"
"Subkey-Type: default"
"Name-Real: YOUR NAME"
"Name-Email: YOUR EMAIL@example.com"
"Expire-Date: 0"
> genkey-batch
$ gpg --batch --gen-key genkey-batch
gpg: WARNING: unsafe ownership on homedir '/home/argocd/.gnupg'
gpg: keybox '/home/argocd/.gnupg/pubring.kbx' created
gpg: /home/argocd/.gnupg/trustdb.gpg: trustdb created
gpg: key 8CB8B24F50B4797D marked as ultimately trusted
gpg: directory '/home/argocd/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/argocd/.gnupg/openpgp-revocs.d/9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D.rev'让我们保存密钥名称 8CB8B24F50B4797D 进一步的步骤。 导出密钥本身:
$ gpg --list-keys
gpg: WARNING: unsafe ownership on homedir '/home/argocd/.gnupg'
/home/argocd/.gnupg/pubring.kbx
-------------------------------
pub rsa3072 2020-09-04 [SC]
9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D
uid [ultimate] YOUR NAME <YOUR EMAIL@example.com>
sub rsa3072 2020-09-04 [E]
$ gpg --armor --export-secret-keys 8CB8B24F50B4797D并将其添加为单独的秘密:
# argocd-gpg-keys-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: argocd-gpg-keys-secret
namespace: argocd
stringData:
8CB8B24F50B4797D: |-
-----BEGIN PGP PRIVATE KEY BLOCK-----
lQVYBF9Q8KUBDACuS4p0ctXoakPLqE99YLmdixfF/QIvXVIG5uBXClWhWMuo+D0c
ZfeyC5GvH7XPUKz1cLMqL6o/u9oHJVUmrvN/g2Mnm365nTGw1M56AfATS9IBp0HH
O/fbfiH6aMWmPrW8XIA0icoOAdP+bPcBqM4HRo4ssbRS9y/i
=yj11
-----END PGP PRIVATE KEY BLOCK-----$ kubectl apply -f argocd-gpg-keys-secret.yaml我们唯一剩下的就是把它扔进容器里 argocd-repo-服务器,为此,请编辑部署:
$ kubectl -n argocd edit deploy/argocd-repo-server我们将替换现有的 gpg 钥匙 音量开 projected,我们在其中表明我们的秘密:
spec:
template:
spec:
volumes:
- name: gpg-keys
projected:
defaultMode: 420
sources:
- secret:
name: argocd-gpg-keys-secret
- configMap:
name: argocd-gpg-keys-cm当容器启动时,Argo CD 会自动从该目录加载 gpg 密钥,因此它也会加载我们的私钥。
让我们检查:
$ kubectl -n argocd exec -ti deploy/argocd-repo-server -- bash
$ GNUPGHOME=/app/config/gpg/keys gpg --list-secret-keys
gpg: WARNING: unsafe ownership on homedir '/app/config/gpg/keys'
/app/config/gpg/keys/pubring.kbx
--------------------------------
sec rsa2048 2020-09-05 [SC] [expires: 2021-03-04]
ED6285A3B1A50B6F1D9C955E5E8B1B16D47FFC28
uid [ultimate] Anon Ymous (ArgoCD key signing key) <noreply@argoproj.io>
sec rsa3072 2020-09-03 [SC]
9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D
uid [ultimate] YOUR NAME <YOUR EMAIL@example.com>
ssb rsa3072 2020-09-03 [E]太棒了,钥匙已加载! 现在我们只需要将 Argo CD 作为协作者添加到我们的存储库中,它将能够动态自动解密。
将密钥导入本地计算机:
$ gpg --armor --export-secret 8CB8B24F50B4797D > 8CB8B24F50B4797D.pem
$ gpg --import 8CB8B24F50B4797D.pem让我们设置信任级别:
$ gpg --edit-key 8CB8B24F50B4797D
trust
5让我们将 argo 作为合作者添加到我们的项目中:
$ git-crypt add-gpg-user 8CB8B24F50B4797D相关链接:
来源: habr.com
