はじめに
Misskey インスタンスを立てたのですがときどき kubernetes を破壊してしまうことがあり、そのたびに手動でkubectl apply
やhelm install
などを実行して再インストールしていました。
これがかなり手間だったのですが最近ArgoCDの存在を知り、これを使うことで面倒を減らせると思いチュートリアルをやっていました。
最終的な構成は、ArgoCD + Vault + Vault Secrets Operator です。
作業したリポジトリは以下から確認できます
https://github.com/tunamaguro/try-argocd
ArgoCD インストール
適当なクラスタを事前に立ち上げておいてください。私は kind を使いました
インストールはHelm
を利用して行いました。ほかにkubectl apply
する方法もありますが単純に面倒だったのでHelm
を使っています。
Ref
とくに深い理由はないのですがこちらに記載のある、HA モードで動かします
その後。チュートリアルにあるアプリケーションをデプロイして、動作しているかどうか確かめます
Hashicorp Vault のインストール
https://developer.hashicorp.com/vault/tutorials/kubernetes/kubernetes-minikube-raft
ArgoCD を使う際の問題の 1 つに Secret があります。よく言われていることですが Secret は単純に base64 でエンコードされているだけなので、これを GitHub などに置くと機密情報が漏洩します。
私の浅い知識で知っている解決策は以下の 2 つです。
- 外部の機密管理の仕組みを利用する(e.g External Secrets)
- Secret 自体を暗号化する(e.g Seald Secrets)
暗号化されたとしても GitHub に Secret を置きたくなかったので 1 番の方法を試します。今回は機密管理ツールとしてHashicorp Vault
を利用します
チュートリアルを参考にマニフェストを作成します
https://github.com/tunamaguro/try-argocd/blob/4dec56ca00be2c4d77c6293bb620ab06e81864da/vault/application.yaml
Vault を機密管理ツールとして使うだけなので、Injector はなしにしてあります
次に暗号化に使う鍵を生成して初期化します。
--key-shares
がマスタキーの分割数、key-threshold
が分割されたキー何個で複合できるかどうからしいです。デフォルトだと分割数が 5 で複合に必要な数は 3 個のはずです。
https://developer.hashicorp.com/vault/docs/commands/operator/init
実際に生成されたキーは次のような形です
開封処理を行うと Sealed が false になっているはずです。
出力内のSealed
が false になるまで繰り返します
他のポッドをクラスターに参加させつつ開封処理を繰り返します
各ポッドのステータスが Running になれば終了です
Vault Secrets Operator のインストール
https://developer.hashicorp.com/vault/tutorials/kubernetes/vault-secrets-operator
当初は前述の External Secret を使うつもりでしたが vault 公式の Operator があるらしいのでこちらを試します
vault で kubernetes 認証を有効化します。これを使うと ServiceAccount と vault の権限管理を連携できるらしいです
key-value エンジンを追加します
先ほど作成したkvv2
以下で読み込みのみが可能なポリシーを作成する
ポリシーとサービスアカウントを紐づける。今回の場合app
名前空間のdeafault
サービスアカウントにdev
ポリシーを割り当てるという形のはずです。
残りのaudience
はドキュメントを確認したんですが、何を設定しているのかよくわかっていません。詳しい人がいれば教えてください
https://developer.hashicorp.com/vault/api-docs/auth/kubernetes
シークレットを作成します
ようやく Operator をデプロイします
Secret を作る
軽くドキュメントを読んだだけなので間違っているかもしれません
どの vault に接続するかを示すVaultConnection
と認証情報を示すVaultAuth
を組み合わせて Secret を作成します。
というわけで用意されているマニフェストをapply
します
すると Secret が増えているはずです
_raw
には base64 エンコードされたデータが格納されていました。
vault に格納されている値を更新すると Secret も更新されます
おそらくこれの更新頻度はrefreshAfter
で制御できるはずです
おわりに
この後VaultDynamicSecret
を検証して、vault の値が更新されるたびに Secret を利用しているポッドが更新されることを確認しましたが、書く元気がなくなったのでここで終わります(現在時刻 00:03)。
試してみた感想として Vault はかなり直感的に扱えるのでそこは素晴らしいと感じました。ただ、Vault を再起動するたびにunseal
や、クラスターへの参加を毎回手動で行う必要があるのがかなりつらそうです。
実際のところ、自動で unseal するauto-unseal
やauto-join
はあるらしいのでこれらを利用すれば、ArgoCD をデプロイ後マニフェストをapply
するだけで Secret を扱う基盤構築ができるかもしれません。
これらを試してみたらまた記事にしたいと思います