Ubuntu 22.04 に Kubernetes をインストールして自宅クラウド

サーバー
スポンサーリンク

Kubernetes についてほぼ何も知らない状態から,自宅用にクラスタを設置してみました.

スポンサーリンク

はじめに

自宅のサーバーでは家族用の下記のようなサービスを動かしています.

これらの環境を Ubuntu 22.04 LTS に置き換えていっているときに,また 2 年後も似たような作業が発生することに思い当たり,思い切って Kubrenetes を使ったコンテナベースの環境に移行することを決断しました.

コンテナであれば,OS の更新に合わせて各種サービスのコードを修正する必要もなくなり,負担が減ることが期待できます.

事前に知っておいた方が良いこと

Kubernetes について調べ始めると,新しい用語や概念が沢山出てきてちょっと混乱するのですが,その情報の波を乗り越えるに当たって役に立った内容を紹介します.

Youtube 解説動画

Kubernetes の全体像をコンパクトにわかりやすく説明されています.2回ほど見たら大体全体像がつかめ,その後の学習の見通しがとても良くなりました.

クラスタは簡単にリセットできる

作成したクラスタは sudo kubeadm reset コマンド一発で簡単にリセットできます.

ソフトの中には,一度インストールすると削除しても各種設定が残ってしまって挙動が変わってしまうものがありますが,Kubernetes はそういったことがありません.そのため,とりあえず試してみてよく分からなくなったらリセットする,といった試行錯誤が気兼ねなくできます.

なお,クラスタに対する設定を全て YAML ファイルで行うようにしておけば,リセットしたあとに元に戻すのも簡単です.

検索の期間指定

Web 検索をするときは,なるべく期間の指定をすることがお勧めです.

Kubernetes は現在ホットなソフトだけあって進化のスピードが速く,3年以上前に通用した内容が現在では古くなっていることが少なくないです.そのため,期間を指定せずに普通に検索すると,一昔前には重宝されたけれども既に正しくなくなってしまった情報が上位に来てしまいます.

Google 検索の場合,「ツール」ボタンを押すことで検索結果の対象となるページ更新日の期間を指定できます.

クラスタの構築

ここからはクラスタの構築方法について説明してきます.

ワーカーノードでコンテナを動かすのに必要な作業は,次の4ステップになります.【】は,どこで実施する作業なのかを示しています.

  1. kubeadm のインストール 【全ノード】
  2. クラスタの初期化 【マスタノード】
  3. クラスタネットワークの設定 【マスタノード】
  4. クラスタへのワーカの追加【ワーカノード】

以降では,それぞれの手順について説明してきます.

kubeadm のインストール 【全ノード】

基本的には,下記の公式サイトの手順を追っていけば OK です.

kubeadmを使用したクラスターの作成
ベストプラクティスに準拠した実用最小限のKubernetesクラスターを作成します。実際、kubeadmを使用すれば、Kubernetes Conformance testsに通るクラスターをセットアップすることができます。kubeadmは...

ただ,Ubuntu 22.04 の場合,cgroup が v1 → v2 に変わったのに伴い,そのままだと Kubernetes が正常に動作しません.次の記事にあるように,containerd の設定ファイルで SystemdCgroup を true に指定する必要があります.

How to Install Kubernetes Cluster on Ubuntu 22.04
In this guide, we will cover how to install Kubernetes cluster on Ubuntu 22.04 step-by-step. It is a free and open-sourc...

これらを Ansible のレシピにしたのが下記です.レシピを用意しておくとワーカーノードの追加が簡単にできるのでお勧めです.コンテナランタイムは containerd を採用しています.

なお,最低限必要になる設定に対して,下記を追加しています.

  • Docker のインストール
    イメージの構築用に,containerd の他に docker.ce をインストールしています.
  • inotify の上限数の拡大
    Pod を配置していくと,inotify のリソースが不足することがあるので,上限値を拡大しています.

ここで一旦,ノードを reboot しておきます.

実際に運用で使っている最新のレシピは下記に置いています.

https://github.com/kimata/server_init/blob/main/roles/kubeadm/tasks/main.yml

クラスタの初期化 【マスタノード】

次のコマンドを実行するだけです.

「192.168.0.20」はマスターノードの IP アドレスです.マスターノードを複数設置する場合は,ロードバランサ―の IP アドレスを指定します.ホスト名でもOK.

「10.0.0.0/16」はクラスタで使用するネットワークです.マスターノード等が属するネットワークでは使われていないプライベートネットワークを指定しておきます.基本的には下記の中から選択します.

  • 10.0.0.0/24
  • 172.16.0.0/20
  • 192.168.0.0/16

この後,kubeadm コマンドでクラスタを操作するための設定ファイルをユーザアカウントにコピーします.

この時点で kubectl get pod,svc --all-namespaces -o wide を実行して,下記のような出力が得られれば OK です.

3,4行目の coredns だけ STATUS が「Pending」になっていますが,これはこの次のステップでクラスタネットワークの設定を行うと解消します.

クラスタネットワークの設定 【マスタノード】

クラスタのノード間のネットワーク機能の設定を行います.いくつかのコンポーネントがあるのですが,現時点では特にこだわりがなければ Calico を選んでおくのがおすすめです.

詳細が気になる方は,次の資料がおすすめです.

オンプレミス Kubernetes のネットワーク [キャッシュ]

Calico の導入にあたり設定ファイルのひな型をダウンロードします.

なお,ここで紹介するのは Calico の『Install Calico networking and network policy for on-premises deployments』で Manifest を使った方のインストール手順になります.デフォルトで表示されている Operator を使った手順だと,以降で説明している IP_AUTODETECTION_METHOD の指定ができず,運よくデフォルト設定で正しいネットワークIFが選択されない限り正常動作しないです(これに気付かず数日無駄にしました).

設定ファイルは基本的にはそのままで OK なのですが,ネットワーク関係の次の2項目だけ変更します.

使用するネットワークIFの自動検出方法の指定
デフォルトだと,最初に見つかったネットワークIFが使われてしまうので,IP_AUTODETECTION_METHOD の指定を行います.指定できるパラメータはいくつかあるのですが,自宅用だと下記の「cidr=CIDR」方式が便利だと思います.

アドレスプールの指定
クラスタで使用するネットワークを指定します.前のステップで kubeadm init を実行した際と同じものを指定します.

私の環境の場合,具体的な修正内容は次のようになります.

ファイルを編集し終わったら次のようにしてクラスタに適用します.

しばらくすると,先ほどまで STATUS が「Pending」だった coredns が「Running」になり,動き始めます.

一方,calico-kube-controllers が追加されて,STATUS が「Pending」になっています.これは,次のステップでワーカを追加すると解消します.

クラスタへのワーカの追加【ワーカノード】

マスターノードで kubeadm token create --print-join-command を実行すると,ワーカで実行すべきコマンドが出力されるのでメモしておきます.

ワーカーにするサーバで,「kubeadm のインストール 【全ノード】」の内容を実行した後,上記でメモした kubeadm joinsudo 付きで実行すると,クラスターに追加できます.

しばらくして,下記のように全ての Pod が「Running」になっていれば正常完了です.

同じことをワーカーにしたいすべてのサーバで実行していきます.

動作確認

クラスターが正常に動作しているか確認するため,Hello World を出力する Pod を動かしてみます.

まず,次の内容の test_hello_world.yml ファイルを用意します.

次のコマンドを実行すると,Pod がノードに配置され,実行されます.

少し時間をおいてから下記のコマンドを実行します.

次のように「Hello from Docker!」が表示されれば,クラスターは正常に動作しています.

動作確認が終わったら,次のコマンドで削除しておきます.

まとめ

自宅サーバーに Kubernetes クラスターを構築する方法を紹介しました.

次回以降,自宅ネットワーク内にコンテナレジストリを設置したり,クラスター上のコンテナのサービスを外部に公開していく方法について紹介したいと思います.

参考文献

自宅Kubernetesクラスタはじめました
自宅でクラスターを構築するときに欲しくなる要素全体がカバーされています.Kubernetes について書いたブログは結構ありますが,単なる作業手順の羅列がほとんどの中で,作業の意味・位置付けがセットで記載されていてとても分かりやすいです.
Kubernetesで実践するクラウドネイティブDevOps
Kubernetes の全体像についてバランスよく解説されていてお勧めです.最初の一冊としてちょうどよい構成です.これで概要を掴んでから,個々のトピックスについて Web で検索すると良いと思います.

Kubernetesで実践するクラウドネイティブDevOps

Kubernetesで実践するクラウドネイティブDevOps

John Arundel, Justin Domingus
3,850円(12/07 10:54時点)
Amazonの情報を掲載しています

コメント