概要

自宅サーバーのリプレイスに伴い,マシンスペックに余裕ができたため,コンテナオーケストレーション環境の構築を検討しました. 運用の手間を減らしつつ,実務で使うことの多いK8s環境を構築し,学びにつなげるため,軽量版パッケージであるMicroK8sを導入しました.

後学のため,導入方法とメトリクス可視化のための設定をまとめておきます. 本質的な難しい部分はMicroK8sが肩代わりしてくれているので,各ステップはとても簡単かなと思います.

前提

  1. OS : Ubuntu Server 24.04
  2. ネットワーク : 外部への公開およびルーティングにはCloudflare Tunnelを利用

MicroK8sはUbuntuの開発元であるCanonicalが開発しており,導入時の障害が少ないかと思います.

MicroK8s

MicroK8sは,ローカル環境で実行することを想定されたらしいです1

複雑な設定なしに単一ノードで動くため,今回のケースでは導入が非常に簡単でした. 何はともあれ自宅サーバーは管理しやすい方がいいので,MicroK8sを選んでよかったなと思っています.

アプローチ

ここからは,MicroK8sを導入する手順を述べます2. 以下のコマンドを実行すると,MicroK8sがインストールできます.

sudo snap install microk8s --classic

–classicはsnapのサンドボックス機能を無効化するオプションです.詳細は後述する用語集を参照してください.

以上です. これだけでMicroK8sがインストールできてしまいます.

DNSとstorageの有効化

次にDNSとstorageというアドオンを入れます. DNSはコンテナ間での名前解決のため,storageはDBを使うときに使います. もしstorageを利用しない場合,PostgreSQLなどのDBコンテナにおいてコンテナが再起動した瞬間にデータが全消去されます. また,データを保持するための設定を書いてもエラーになってアプリが起動しません. これらを入れていないと,サーバー用途としてはまともに使えません. K8sでは,K8s内部で動的にIPアドレスが変化します. そのため,DNSでコンテナの名前解決をしないと,外部公開する際にコンテナを指定できません.

sudo microk8s enable dns storage

これだけでセットアップ完了です.

メトリクス収集ツール

サーバーの稼働状況を可視化してくれるツールを導入します.

これもMicroK8sであれば簡単に導入できます.

sudo microk8s enable observability

observabilityアドオンを有効化すると,内部では,kube-prom-stack-grafanaという名称のServiceが作成されるため,それを参照します.

service.yaml

apiVersion: v1 # api version
kind: Service
metadata:
  name: external-grafana
  namespace: default # cloudflaredのPodが動いているNamespaceと同じにしてください
spec:
  type: ExternalName
  externalName: kube-prom-stack-grafana.observability.svc.cluster.local
  ports:
  - port: 80 # Grafanaが起動するポート番号
    targetPort: 80

これをcloudflareのトンネル経由で公開すると,可視化されます.

結果

外部で公開されると,指定したサブドメインの画面にログインしてサーバーの状態を可視化できます. Grafanaの管理画面

加えて,万が一アプリケーションを起動しているコンテナが落ちたとしてもK8s側が「あるべき状態」に復元してくれるため,Dockerのみで運用するよりは可用性が高まったかなと思います.

用語集

この記事を書くにあたって,自分が説明できなかった事柄を整理しておきます.

snap
Wikipedia曰く「Canonicalが設計・開発したソフトウェアデプロイメントシステムかつパッケージ管理システム」のこと
snapとaptの違い
Snapではインストールされたパッケージは仮想環境で実行される.これにより,ファイルやネットワークにアクセスするためには専用のインターフェースを経由する必要があるが,セキュリティが強固になる.後述する--classicオプションを付けることでこれを無効化することもできる.一方でaptはそういった仮想環境を持たない.これが一番大きな違いになると考える.
コンテナランタイム
コンテナの実行環境のこと3. OCI(オープンコンテナイニシアチブ)にて現代のコンテナランタイムが準拠すべき3つの仕様を定義している.
  1. 実際のコンテナイメージ仕様
  2. コンテナランタイムがコンテナイメージを取得する方法
  3. イメージの展開・レイヤードマウント・実行方法
CNCF4
Cloud Native Computing Foundation. コンテナ技術の推進と,その進化を取り巻くテクノロジー業界の足並みをそろえるために2015年に創設された財団