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

2025年7月29日(火)
水野 源
第16回の今回は、WSL上にmicrok8sをインストールし、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をインストールしていきましょう。

  1. Windows Terminalを開き、以下のコマンドを実行してください。なお、microk8sはSnapパッケージとして提供されています。Snapについては第4回を参照してください。
    $ sudo snap install microk8s --classic
  2. sudoなしでmicrok8sコマンドを実行できるように、現在のユーザーをmicrok8sグループに追加します。
    $ sudo gpasswd -a $USER microk8s 
    $ sudo chown -f -R $USER ~/.kube
  3. この時点で設定を反映するために、一度Windows Terminalを終了し、再起動してください。
  4. 以下のコマンドを実行してください。「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」として使えるようにしましょう。

  1. 以下のコマンドを実行してください。
    $ sudo snap alias microk8s.kubectl kubectl
  2. これで「kubectl」コマンドが使えるようになります。エイリアスが正しく設定されたことを確認しましょう。
    $ kubectl version --client
    Client Version: v1.32.3
    Kustomize Version: v5.5.0
  3. 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ブラウザのアドレスバーに入力してください。

Windowsからmicrok8s上のサービスにアクセスできた

以下のコマンドを実行すると、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

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環境を構築し、コンテナオーケストレーションの学習や開発作業を効率的に進めましょう!

日本仮想化技術株式会社
Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。最近レンズ沼にハマる。日本仮想化技術株式会社所属。

連載バックナンバー

開発ツール技術解説
第16回

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

2025/7/29
第16回の今回は、WSL上にmicrok8sをインストールし、Kubernetes環境を構築する方法を解説します。
開発ツール技術解説
第15回

「WSL」を使って、話題の生成AI「Ollama」をWindowsで簡単に動かしてみよう

2025/7/8
第15回の今回は、WSLを活用してローカルLLMツールの代表格と言える「Ollama」をWindows環境で簡単に動作させる方法について解説します。
開発ツール技術解説
第14回

ターミナルマルチプレクサの「Byobu」を導入して、WSLのターミナル生活をさらに快適にしよう

2025/6/17
第14回の今回は、WSLのターミナルにおける作業を格段に効率化してくれるツール「Byobu」の導入と活用方法について解説します。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています