見出し画像

Windows PCで簡易Kubernetes環境(minikube)を構築する道のり

はじめまして。SHIFTでインフラコンサルタントをしている大竹です。

Kubernetesの利用案件に携わっていて、とあるDockerイメージをKubernetes上で試す必要がありました。しかし気軽に試せる環境がなかったので、ローカルPCを使って簡易的なKubernetes環境を構築してみることにしました。

このような要求に応えるOSSとして有名なもののひとつが、minikubeです。しかしインストール方法を探してみても、LinuxだったりMacOSのものばかり。Windowsのもあるにはあるのですが、そこにはもう一つの事情があります。

そう、Docker Desktop for Windowsの有料化です。Windowsでminikubeを利用するにはこいつが必要なのです(これも選択肢としてはいくつかあると思いますが)。

当社では近年、従業員が急増しています。数年前であればDocker Desktopを無料の範囲内で使えたかもしれませんが、今となっては夢のまた夢です。

しかし思いました。私のPCはWindowsです。WindowsにはWSL2(Windows Subsystem for Linux)がある!WSL2にDockerとminikubeを入れればいいんじゃないか!?というわけで、そう簡単にはいかなかったのでこの記事を書いています。


全体的な流れ(結論)

  1. WSL2をインストールする

  2. エラーが出たらレジストリの追加で対処し、ユーザーを作成する

  3. Dockerをインストールする

  4. minikubeをインストールし、dockerユーザーを追加する

  5. Dockerとminikubeの自動起動を設定する

WSL2のインストール

まず、WSL2をインストールします。以下の手順は公式ドキュメントにも書いてあります。

PowerShellを管理者モードで実行します。

winver を実行して、Windows 10 バージョン 2004 以降 (ビルド 19041 以降)であることを確認します。

次のコマンドを実行します。

wsl --install

WSL2およびUbuntuがインストールされます。

インストール中: 仮想マシン プラットフォーム
仮想マシン プラットフォーム はインストールされました。
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム はインストールされました。
ダウンロード中: WSL カーネル
インストール中: WSL カーネル
WSL カーネル はインストールされました。
ダウンロード中: Ubuntu
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります。

指示に従い、再起動すると、インストールが再開します。

Installing, this may take a few minutes...

ユーザーの作成を促されるので、入力します。

Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username:

以上です。
(公式の手順はこちら:https://docs.microsoft.com/ja-jp/windows/wsl/install ) 
一覧コマンドでインストールされたディストリビューションを確認できます。

wsl --list

Linux 用 Windows サブシステム ディストリビューション:
Ubuntu (既定)

トラブルシュート

さて次の手順は、と言いたいところですが、私の環境ではエラーが出てしまいました。

実行しようとした操作は、参照したオブジェクトの種類ではサポートされていません。

原文だとこうですね。

The attempted operation is not supported for the type of object referenced.

ユーザー名の入力を促されますが、同じエラーが出るので進めません。一度Ubuntuを終了します。

次の内容のファイルを拡張子 ".reg" で作成し、実行します。(出典:https://github.com/MicrosoftDocs/WSL/issues/547 )

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog\0408F7A3]
"AppFullPath"="C:\\Windows\\System32\\wsl.exe"
"PermittedLspCategories"=dword:80000000

スタートメニューからUbuntuを実行すると、起動できるようになりました。

が、実行ユーザーがrootになってしまいました。安全のために、一般ユーザーを作成し、sudoできるようにします。

adduser xxx
usermod -G sudo xxx

PowerShellを起動し、次のコマンドを実行します。

ubuntu config --default-user xxx

Ubuntuを起動し直すと、一般ユーザーで起動できました。

Dockerのインストール

Ubuntuを起動し、公式の手順に従ってDockerをインストールします。ここは特にハマりポイントはないと思います。

https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

hello-worldを起動する前に、dockerサービスを起動します。

sudo service docker start
sudo docker run hello-world

ここは余裕ですね。

minikubeのインストール

次に、公式の手順に従ってminikubeをインストールします。

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
sudo dpkg -i minikube_latest_amd64.deb

(参考:https://minikube.sigs.k8s.io/docs/start/

このままminikubeを開始するとエラーとなるので、指示に従って実行ユーザーをdockerグループに追加した上で、driverにdockerを指定して開始します。

sudo usermod -aG docker ko && newgrp docker
minikube start --vm-driver=docker

初期インストールが始まり、しばらくすると完了します。

Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

kubectlを未インストールの場合は、minikubeが持つkubectlをエイリアス設定することで、kubectlとして使用できます。

minikube kubectl -- get po -A
alias kubectl="minikube kubectl --"

もちろんkubectlをインストールしても良いです。

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update
sudo apt-get install -y kubectl

(参考:https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/#install-using-native-package-management

サンプルアプリをデプロイしてみましょう。

kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4

kubectl get deployment
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
hello-minikube   1/1     1            1           14s

できましたね!

自動起動の設定

実はこのままだと、UbuntuなりホストOSなりをシャットダウンしたらminikubeもDockerも停止するので、起動するたびにこれらを開始しなければなりません。面倒なので自動起動を設定したいですが、systemctl enableは使えません。

ですので起動スクリプトで対応しましょう。.bashrcに以下のコードを追記します。dockerが起動していないときだけ起動するようになっています。

if test $(service docker status | awk '{print $4}') = 'not'; then
    sudo /usr/sbin/service docker start
    minikube start --vm-driver=docker
fi

そしたら、この起動スクリプトをパスワードなしで実行できるようにしましょう。

sudo visudo

を実行して、下記の行を追記します。

%docker ALL=(ALL)  NOPASSWD: /usr/sbin/service docker start

Ubuntuを再起動して確認してみましょう。

service docker status
* Docker is running

minikube kubectl -- get deployment
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
hello-minikube   1/1     1            1           14s

このようにすれば、Ubuntu起動時にdockerと一緒にminikubeも起動できます。が、minikube以外の用途でもWSL2を使う場合は、いちいち起動してくるのは鬱陶しいかもしれませんね。その場合はminikube起動の部分をコメントアウトしましょう。

快適なKubernetesライフを!


執筆者プロフィール:大竹 一毅
国内大手システムインテグレーターにて技術支援部門に所属し、アプリケーション領域やクラウドインフラ領域のアーキテクトとして従事した後、SHIFTにジョイン。クラウドインフラの保守業務をしたり設計に口を挟んだりしている。

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/