「microk8s」を使って、WSL上にKubernetesクラスターを構築してみよう

はじめに
第9回では「Docker」を使ったコンテナの動かし方を紹介しました。アプリケーションをホストOSから隔離して動かすコンテナは、現在のアプリケーションのデリバリーにおいて欠かせない技術となっています。
手元のPCでコンテナを1つ起動するだけであれば、Dockerや「Podman」を直接実行すれば良いでしょうし、実際にそうしている開発者の方も多いはずです。ところが、本番環境ではそうはいきません。
システムは複数のコンテナで構成されることが一般的ですが、複数のコンテナを協調して動かそうとすると「複数のノード上で動くコンテナ間の通信はどうやって実現すれば良いのか?」「複数のアプリケーションコンテナが吐き出すログを1箇所に集約するには?」といった様々な問題が浮上してきます。コンテナの死活監視や負荷分散、オートスケール、物理ノードがダウンしたときの対応も考えなければいけません。
こうした問題を解決するのが「コンテナオーケストレーション」と呼ばれるツールです。コンテナオーケストレーションは、複数のコンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化します。数十から数百、場合によっては数千のコンテナを本番環境で運用するには、自動化されたコンテナオーケストレーションが必要不可欠と言えるでしょう。そして現在、コンテナオーケストレーションの中でもデファクトスタンダードの地位を築いているのが「Kubernetes」(略してk8sとも呼ばれます)です。
k8sは、もともとGoogleが社内で使用していた「Borg」というシステムをベースに開発されました。2014年にオープンソース化され、現在ではクラウドネイティブアプリケーションの標準的なプラットフォームとして多くの企業で採用されています。また「AWS EKS」「Google GKE」「Azure AKS」など、主要なクラウドプロバイダーもマネージドKubernetesサービスを提供しています。
k8sで本番環境を構築するのであれば、当然開発者の手元にも開発用のk8sが必要になってきます。そこで今回は、WSL上で簡単にk8sを動かす方法を紹介します。
WindowsでKubernetesを動かす方法
KubernetesはLinux上で動作するソフトウェアなので、Windows上で動かすにはバックエンドとして何らかのLinux環境が必要となります。今回はWSLのUbuntu上に「microk8s」を直接インストールして構築します。
microk8sを選ぶメリットとしては、以下のようなものがあります。
- 軽量: microk8sは最小限のリソースで動作する
- 高速起動: 数秒でKubernetesクラスターが利用可能になる
- 本格的: 機能が限定されておらず、本番環境と同等のKubernetesを利用できる
- 豊富なアドオン: dashboard、ingress、storageなど多数のアドオンが利用可能
- 簡単管理: Ubuntuであればsnapパッケージで簡単にインストールできる
なお、WindowsでKubernetesを動かすには、他にもいくつかの選択肢があります。例えば「Docker DesktopのKubernetes機能を使う」「MinikubeやKindでインストールする」などですが、今回は上記のようなメリットも考慮し、本格的な学習環境を構築可能なmicrok8sを選択しました。またWSLにおいてはいつものことですが、Ubuntu上でのノウハウをそのまま流用できることもメリットです。
microk8sのインストール
それでは、WSL上にmicrok8sをインストールしていきましょう。
- Windows Terminalを開き、以下のコマンドを実行してください。なお、microk8sはSnapパッケージとして提供されています。Snapについては第4回を参照してください。
$ sudo snap install microk8s --classic
- sudoなしでmicrok8sコマンドを実行できるように、現在のユーザーをmicrok8sグループに追加します。
$ sudo gpasswd -a $USER microk8s $ sudo chown -f -R $USER ~/.kube
- この時点で設定を反映するために、一度Windows Terminalを終了し、再起動してください。
- 以下のコマンドを実行してください。「microk8s is running」と表示されれば、microk8sが正常にインストールされ起動しています。
$ microk8s status --wait-ready microk8s is running ...(以下略)...
コマンドにエイリアスを設定する
Kubernetesのあらゆる操作はRESF APIを通じて行われています。そのため、APIを叩くことさえできればクライアントの種類は問いません。実際にcurlコマンドでKubernetesを操作することも可能ですが、それでは使い勝手が悪いため専用のCLIコマンドを使うのが一般的です。それがkubectlコマンドです。
Snapからmicrok8sをインストールするとkubectlコマンドも同時にインストールされますが、Snapからインストールした環境はやや特殊で、各種コマンドには「microk8s.」というプリフィックスが付きます。つまり、kubectlコマンドは「microk8s.kubectl」という名前で提供されているのです。毎回長いコマンドを入力するのは面倒なので、エイリアスを設定して一般的な「kubectl」として使えるようにしましょう。
- 以下のコマンドを実行してください。
$ sudo snap alias microk8s.kubectl kubectl
- これで「kubectl」コマンドが使えるようになります。エイリアスが正しく設定されたことを確認しましょう。
$ kubectl version --client Client Version: v1.32.3 Kustomize Version: v5.5.0
- Kubernetesクライアントのバージョン情報が表示されれば成功です。また、何らかの理由でエイリアスを解除したい場合は、以下のコマンドを実行してください。
$ sudo snap unalias microk8s.kubectl
クラスターの情報を確認する
以下のコマンドで、k8sクラスターが正常に動作していることを確認できます。
$ kubectl cluster-info Kubernetes control plane is running at https://127.0.0.1:16443 CoreDNS is running at https://127.0.0.1:16443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Kubernetesコントロールプレーンのエンドポイントや、動いているコアサービスの情報が表示されます。
ノードの状態を確認する
以下のコマンドを実行すると、k8sクラスターに参加しているノードの情報を表示できます。今回はシングルノードのクラスターなので、自分自身が「Ready」として表示されることを確認しましょう。
mizuno@arcturus:~/.kube$ kubectl get nodes NAME STATUS ROLES AGE VERSION arcturus Ready <none> 17m v1.32.3
サービスを動かしてみよう
実際にKubernetes上でアプリケーションを動かしてみましょう。今回はシンプルな例として、Webサーバーの「nginx」を使用します。
Kubernetesは、いわゆる「宣言型」のアプローチを採用しており、クラスター内で実行したいリソースを「マニフェスト」という形で宣言します。ユーザーがシステムのあるべき姿を定義すると、具体的なリソースの作成や削除といった調整作業はKubernetesが自動的に行うのです。
以下の内容で、nginx-deployment.yamlというファイルを作成してください。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m" --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30080 type: NodePort
以下のコマンドで、マニフェストを適用します。
$ kubectl apply -f nginx-deployment.yaml
これだけで、nginxのPod(Kubernetesが管理するコンテナの最小単位)が起動します。またPodにアクセスするためのサービスも作成されます。今回はNodePortタイプのサービスを作成しているので、ホストのIPアドレスでサービスに直接アクセスできます。
以下のコマンドを実行してみましょう。nginxのサンプルページのHTLMが表示されるはずです。
$ curl http://localhost:30080
Windows上のWebブラウザからもアクセスできます。ただし、この場合localhostではなくWSLが動作している仮想マシンのIPアドレスを指定する必要があります。PowerShellを起動して、以下のコマンドでIPアドレスを調べましょう。筆者の環境では「172.18.232.10」でした。
$ wsl hostname -I 172.18.232.10
このIPアドレスとポート番号(今回の例では30080)を、Webブラウザのアドレスバーに入力してください。
以下のコマンドを実行すると、Pod内で起動しているnginxのログを確認できます。
$ kubectl logs deployment/nginx-deployment
動作テストが完了したら、以下のコマンドを実行してください。作成したリソース一式を削除できます。
$ kubectl delete -f nginx-deployment.yaml
アドオンを有効化しよう
microk8sには多数の便利なアドオンが用意されています。今回は、Kubernetesクラスターを視覚的に管理できる「Kubernetes Dashboard」を有効化してみましょう。Dashboard用のPodやサービスを自動的にデプロイするために、以下のコマンドを実行してください。なお、途中でsudoのパスワードを求められます。
$ microk8s enable dashboard
続いて、以下のコマンドを実行して生成されたダッシュボードのトークンを取得します。これはWeb UIからダッシュボードにログインする際に必要となります。表示された値を控えておいてください。
$ kubectl describe secret -n kube-system microk8s-dashboard-token
ダッシュボードのサービスは先ほどのNodePortとは異なるため、ホストのIPアドレスでは直接アクセスできません。そこでポートフォワードを行います。以下のコマンドを実行してください。コマンドの実行中に限り、外部からの接続をサービスへフォワードできます。
$ kubectl port-forward -n kube-system service/kubernetes-dashboard 8443:443
WindowsのWebブラウザを開いて「https://localhost:8443」にアクセスしてください。スキーマがHTTPSであることと、今回はlocalhostで良い点に注意です。なおSSL証明書のセキュリティ警告が表示されますが、気にせずアクセスしてください。
ログイン画面が表示されるので、先ほど控えたトークンを入力して「サインイン」をクリックします。
ダッシュボードが表示されれば成功です。
Kubernetesは非常に複雑なシステムのため、慣れないうちは何がどうなっているのか、イメージしづらいことも多いでしょう。ダッシュボードはKubernetesクラスターの様々な側面をグラフィカルに表現してくれます。特にデプロイされているリソースを把握しやすいため、文字情報だけのCLIに比べると、学習の助けとなるでしょう。
おわりに
今回は、WSL上でmicrok8sを使ってKubernetesクラスターを構築する方法を紹介しました。microk8sを使うことで、軽量かつ高速にKubernetes環境を手元に構築できることがお分かりいただけたのではないでしょうか。
コンテナを使うのであれば、オーケストレーションツールの学習もまた、避けては通れません。手元のWindows環境で本格的なKubernetes環境を構築し、コンテナオーケストレーションの学習や開発作業を効率的に進めましょう!
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Kubernetes環境を構築して、実際にコンテナを動かしてみよう
- Oracle Cloud Hangout Cafe Season7 #1「Kubnernetes 超入門」(2023年6月7日開催)
- Kubernetesの基礎
- WSLでUbuntuのユニバーサルパッケージシステム「snap」を使う
- KubernetesのDiscovery&LBリソース(その1)
- KubernetesのマニフェストをMagnumで実行する
- Project CalicoをKubernetesで使ってみる:構築編
- Kubernetes上のコンテナをIngressでインターネットに公開するまで
- NGINX Ingress Controllerの柔軟なアプリケーション制御、具体的なユースケースと設定方法を理解する
- Kubernetesアプリケーションのモニタリングことはじめ