おうち Kubernetes クラスタ運用記 ~2023~

こんにちは。id:SlashNephy です。この記事は はてなエンジニア Advent Calendar 2023 の28日目の記事です。

27日目の記事は id:chaya2z さんの Linuxカーネルの赤黒木のおもしろい最適化 でした。


私は最近、自宅で Kubernetes クラスタを構築して遊んでいるのですが、今日は Kubernetes クラスタを構築し始めたきっかけから、実際に何をどうやって運用しているのかまで広くご紹介します。

きっかけ

私が所属しているチームでは、Kubernetes (Amazon EKS) を利用してサービスを運用しています。詳しくは、以下の記事を参照ください。

developer.hatenastaff.com

業務で Kubernetes に触れる中で、「Kubernetes のオーケストレーションかっこいい!」「自分でもクラスタを運用してみたい!」とエンジニアの血がざわざわし始めました。 その結果、去年末ごろから、自宅で Kubernetes クラスタを運用するに至っています。

GitOps (Argo CD)

デプロイ管理は、Argo CD を利用して GitOps を実現することにしました。Argo CD は、宣言型の継続的デリバリーツールです。また、Web UI が付属していて Kubernetes のリソースの状態や Pod のログをリアルタイムに確認できるのが便利です。

argoproj.github.io

自宅で稼働している Kubernetes マニフェストは以下で公開しています。リモートリポジトリ内のマニフェストに変更が入ると、Argo CD が apply して Kubernetes クラスタのリソースが更新される... といった算段です。

github.com

シークレット管理 (1Password Kubernetes Operator)

GitOps する上で、シークレットなど秘匿情報の取り扱いについて気になるところです。それなら、秘匿情報を 1Password に入れて管理してしまいましょう!

1Password Kubernetes Operator は、1Password 上の保管庫のアイテムを Kubernetes 上の Secret リソースに同期してくれる Operator です。

github.com

以下のように保管庫のアイテムを指定した 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 に記してあるので、もしよければ参照ください。

scrapbox.io

Node Feature Discovery

オンプレミスな Kubernetes クラスタを運用していると、Node に固有のハードウェアにアクセスしたくなることがあります。

例えば、AI のトレーニングのために GPU 資源を利用したいケースや、動画のリアルタイム エンコードのためにハードウェア アクセラレーションを利用したいケースが挙げられます。そのようなワークロードが必要な Pod は、グラフィックボードを搭載した Node にスケジューリングしたくなります。

そこで kubernetes-sigs/node-feature-discovery の出番です。

github.com

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 はライブマニフェストを解釈して、コンテナイメージの脆弱性を発見してくれます。

かっこいいダッシュボード付きです。かっこいいダッシュボードはなんぼあってもいいですからね。

github.com

モニタリング (Robusta)

Pod が突然死すること、ありますよね。私は Kubernetes のモニタリングに Robusta を使って見ています。

home.robusta.dev

Robusta は Kubernetes の多機能なモニタリングツールです。👇 のような特徴があります。

  • ビルトインなアラートがすぐ使えて便利
    • Pod や CronJob が落ちたり、CrashLoopBackOff したりしてるときにアラートが発火するようになってる
    • マネージドな Alertmanager / Prometheus を組み込んでいて (そういう Helm Chart があります)、zero-configuration で有用なアラートが設定できる
    • 私は Discord にアラートを送って見てます
  • CPU やメモリの割り当ての推奨値を教えてくれる

そしてこちらもかっこいいダッシュボード付きです。最高ですね。

まとめ

業務でなんとなく触っていた Kubernetes も、実際に手を動かして運用してみると Kubernetes への理解やエコシステムの周辺知識が深まりました。

私は DIY 的なプログラミングが好きで、コードを書いて解決できることは自分で書いて解決してきました。

...ということをしていたら、Argo CD 上で動いているアプリケーションの数が62個になっていました。小さいコード片をデプロイする選択肢としても、おうち Kubernetes クラスタはおすすめです!

皆さんもおうちに Kubernetes クラスタを飼ってみてはいかがでしょうか?懐くとかわいいですよ。冬休みの自由研究にぜひどうぞ!


この記事は はてなエンジニア Advent Calendar 2023 の28日目の記事でした。

29日目の記事は id:cohalz さんの はてなブックマークのステージング環境を支える技術 です。はてなのアドベントカレンダーはまだまだ続きます!