こんにちは。id:SlashNephy です。この記事は はてなエンジニア Advent Calendar 2023 の28日目の記事です。
27日目の記事は id:chaya2z さんの Linuxカーネルの赤黒木のおもしろい最適化 でした。
私は最近、自宅で Kubernetes クラスタを構築して遊んでいるのですが、今日は Kubernetes クラスタを構築し始めたきっかけから、実際に何をどうやって運用しているのかまで広くご紹介します。
- きっかけ
- GitOps (Argo CD)
- シークレット管理 (1Password Kubernetes Operator)
- Node Feature Discovery
- 脆弱性スキャナー (KubeClarity)
- モニタリング (Robusta)
- まとめ
きっかけ
私が所属しているチームでは、Kubernetes (Amazon EKS) を利用してサービスを運用しています。詳しくは、以下の記事を参照ください。
業務で Kubernetes に触れる中で、「Kubernetes のオーケストレーションかっこいい!」「自分でもクラスタを運用してみたい!」とエンジニアの血がざわざわし始めました。 その結果、去年末ごろから、自宅で Kubernetes クラスタを運用するに至っています。
GitOps (Argo CD)
デプロイ管理は、Argo CD を利用して GitOps を実現することにしました。Argo CD は、宣言型の継続的デリバリーツールです。また、Web UI が付属していて Kubernetes のリソースの状態や Pod のログをリアルタイムに確認できるのが便利です。
自宅で稼働している Kubernetes マニフェストは以下で公開しています。リモートリポジトリ内のマニフェストに変更が入ると、Argo CD が apply して Kubernetes クラスタのリソースが更新される... といった算段です。
シークレット管理 (1Password Kubernetes Operator)
GitOps する上で、シークレットなど秘匿情報の取り扱いについて気になるところです。それなら、秘匿情報を 1Password に入れて管理してしまいましょう!
1Password Kubernetes Operator は、1Password 上の保管庫のアイテムを Kubernetes 上の Secret
リソースに同期してくれる Operator です。
以下のように保管庫のアイテムを指定した OnePasswordItem
リソースを定義しておくと
apiVersion: onepassword.com/v1 kind: OnePasswordItem metadata: name: example-app-secret spec: itemPath: vaults/<vault_id>/items/<item_id>
同名の Secret
リソースが作られて、Deployment
リソースなどから参照できるようになります。グッバイ秘匿値ハードコード!
apiVersion: apps/v1 kind: Deployment metadata: name: example-deployment spec: template: spec: containers: - name: example-app image: example-app env: - name: DISCORD_WEBHOOK_URL valueFrom: secretKeyRef: name: example-app-secret # OnePasswordItem リソースと同じ名前の Secret として参照できる key: discord-webhook-url # key は 1Password 上のアイテムのフィールド名に対応する
アイテムを指定するときに使う <item_id>
は 👇 こういうふうに取ってきます。もしメニューがなければ、1Password の設定 →「上級」→「デバッグツールを表示」を有効にします。
導入方法など詳細は私の Scrapbox に記してあるので、もしよければ参照ください。
Node Feature Discovery
オンプレミスな Kubernetes クラスタを運用していると、Node に固有のハードウェアにアクセスしたくなることがあります。
例えば、AI のトレーニングのために GPU 資源を利用したいケースや、動画のリアルタイム エンコードのためにハードウェア アクセラレーションを利用したいケースが挙げられます。そのようなワークロードが必要な Pod は、グラフィックボードを搭載した Node にスケジューリングしたくなります。
そこで kubernetes-sigs/node-feature-discovery の出番です。
node-feature-discovery は、Node
リソースにマシンの情報の label を付与してくれます。Intel 製の GPU デバイスを検出するために Intel GPU Device Plugin を導入した状態では
$ kubectl get nodes -o json | jq '.items[].metadata.labels' { ... "feature.node.kubernetes.io/cpu-cpuid.AVX2": "true", "feature.node.kubernetes.io/kernel-version.full": "6.1.61-1-lts", "intel.feature.node.kubernetes.io/gpu": "true", ... }
のように intel.feature.node.kubernetes.io/gpu=true
が Node にセットされるようになります。Intel GPU が搭載された Node へ Pod がスケジューリングされるよう制御するには、nodeSelector フィールドを使用します。
apiVersion: v1 kind: Pod metadata: name: gpu-pod spec: containers: - name: gpu-app image: gpu-app nodeSelector: intel.feature.node.kubernetes.io/gpu: "true"
これで gpu-pod
は希望通り、Intel GPU が搭載された Node で実行されます。
脆弱性スキャナー (KubeClarity)
個人運用だとセキュリティアップデートを疎かにしがちだと思います...
KubeClarity はライブマニフェストを解釈して、コンテナイメージの脆弱性を発見してくれます。
かっこいいダッシュボード付きです。かっこいいダッシュボードはなんぼあってもいいですからね。
モニタリング (Robusta)
Pod が突然死すること、ありますよね。私は Kubernetes のモニタリングに Robusta を使って見ています。
Robusta は Kubernetes の多機能なモニタリングツールです。👇 のような特徴があります。
- ビルトインなアラートがすぐ使えて便利
- Pod や CronJob が落ちたり、CrashLoopBackOff したりしてるときにアラートが発火するようになってる
- マネージドな Alertmanager / Prometheus を組み込んでいて (そういう Helm Chart があります)、zero-configuration で有用なアラートが設定できる
- 私は Discord にアラートを送って見てます
- CPU やメモリの割り当ての推奨値を教えてくれる
- 個人利用だとあんまり使う機会はないかも
- krr がバンドルされている感じです
そしてこちらもかっこいいダッシュボード付きです。最高ですね。
まとめ
業務でなんとなく触っていた Kubernetes も、実際に手を動かして運用してみると Kubernetes への理解やエコシステムの周辺知識が深まりました。
私は DIY 的なプログラミングが好きで、コードを書いて解決できることは自分で書いて解決してきました。
...ということをしていたら、Argo CD 上で動いているアプリケーションの数が62個になっていました。小さいコード片をデプロイする選択肢としても、おうち Kubernetes クラスタはおすすめです!
皆さんもおうちに Kubernetes クラスタを飼ってみてはいかがでしょうか?懐くとかわいいですよ。冬休みの自由研究にぜひどうぞ!
この記事は はてなエンジニア Advent Calendar 2023 の28日目の記事でした。
29日目の記事は id:cohalz さんの はてなブックマークのステージング環境を支える技術 です。はてなのアドベントカレンダーはまだまだ続きます!