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を入れればいいんじゃないか!?というわけで、そう簡単にはいかなかったのでこの記事を書いています。
全体的な流れ(結論)
WSL2をインストールする
エラーが出たらレジストリの追加で対処し、ユーザーを作成する
Dockerをインストールする
minikubeをインストールし、dockerユーザーを追加する
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
サンプルアプリをデプロイしてみましょう。
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ライフを!
お問合せはお気軽に
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/