APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【kind × VirtualBox】無料で!Kubernetesの検証環境を構築する方法

こんにちは!クラウド事業部の中根です。

最近Kubernetesに入門しました!
EKS等は便利で簡単に試せて素晴らしいのですが、料金が気になります。
Kubernetesが触れればいいので、ローカルにも検証環境を作ってみました。
自分の備忘録も兼ねて、共有したいと思います。

kind × VirtualBoxのメリット・デメリット

メリット

  • 無料!
  • 保存できるので、PCをシャットダウンしてもクラスタの再開が楽!(初心者には地味に嬉しい)
  • 環境依存性が低いので、再現性が高い!
  • いざとなれば仮想マシンごと消せる!

デメリット

  • ローカルに直接作るよりは手順が多い
  • ストレージ容量の消費が大きい
  • 設定に注意が必要(特にネットワーク周り)

0. 前提条件

VirtualBox 7.0のインストール済(https://www.virtualbox.org/
Ubuntuイメージのダウンロード済(https://jp.ubuntu.com/download)(22.04.4を使用しています)

1. 仮想マシンの設定

1-1. 仮想マシンの作成

VirtualBoxマネージャーを起動し、「新規」を押下

  • 「名前」:任意の仮想マシン名
  • 「フォルダー」:デフォルト
  • 「ISOイメージ」:前提条件でダウンロードしておいたUbuntuのイメージを参照

「次へ」を押下します。

好きなユーザー名とパスワードを設定し、「次へ」を押下します。

メモリは8GB、プロセッサは2にしています。
最低限このスペックがあれば問題ないと思いますが、適宜調整してください。

ディスクサイズは適宜調整してください。
後で追加もできますし、環境構築だけならデフォルトの25GBでも問題なくできます。
ただ、あまり余裕がないので増やしておくことをおすすめします。

参考:クラスター構築後のディスク使用状況

起動するまで10分程度待ちます。

起動できたら仮想マシンの電源をオフにします。

1-2. ネットワークの設定

VirtualBoxマネージャーの画面から,左上の「ファイル」→「ツール」→「ネットワークマネージャー」を選択
「アダプター」タブの 「IPv4」 のアドレスをメモする。(次使います)
「IPv4 ネットマスク」が 「255.255.255.0」 になっていることを確認する。

「DHCPサーバー」タブの、”サーバーを有効化”のチェックを外す。

作成した仮想マシンを選択し、設定を開きます。

左メニューから「ネットワーク」を選択し

  • 「アダプター1」タブの「ネットワークアダプターを有効化」にチェックが入っている
  • 「割り当て」が「NAT」になっている

ことを確認します。

「アダプター2」タブの「ネットワークアダプターを有効化」にチェックを入れ、
「割り当て」に「ホストオンリーアダプター」を設定し、「OK」を押下します。
※仮想マシンの電源がオフでないと、変更できません。

1-3. 仮想マシンの設定

再度仮想マシンを起動し、ログインします。
右上の電源マーク部分をクリックし、「Ethernet(enp0s8)」 → 「Wired Settings」を押下すると、下の設定画面が開きます。
「Ethernet(enp0s8)」の歯車マークを押下します。

「IPv4」タブの設定を以下の通り変更し、「Apply」を押下します。
パスワード聞かれたら、仮想マシンのログイン時に使っているパスワードでOKです。

  • IPv4 Method:Manual
  • Addresses:
    • Address:192.168.56.100
    • Netmask:255.255.255.0
  • DNS
    • Automatic:Off
    • ネットワークマネージャーでメモしたアドレスを入力

IPアドレスは、192.168.56.0/24内で任意ですが、DNSと被らないようにしてください。
後でSSH接続するときに使います。
左下のアイコンをクリックし、ターミナルを起動します。

ターミナルが起動しない場合
左下のアイコンからSettings(設定)を開く 。
左メニューから、「Region & Language」を選択し、「Language」を「Japanese」にする。

「Restart」を押下し、「Log Out」を選択します。
再度ログイン画面に映るので、ログインし、ターミナルを起動する。

1-4. 仮想マシン→外部への接続確認

ターミナルから、ping google.com等で外部へ接続できることを確認します。
接続できない場合は、ここまでの手順を確認し、設定の保存忘れなどがないか確認しましょう。

1-5. SSH接続の設定

ターミナル上で、下記を実行します。

su -    # rootユーザーに切り替え
usermod -a -G sudo vboxuser

仮想マシンを再ログインし直して、ターミナルを開きます。

sudo apt install openssh-server

インストールができたら、SSH接続のテストを行います。
Tera Term等のSSHクライアントを使った例です。
ホストは仮想マシン内で設定したIPアドレスです。

ユーザー名とパスワードを入力し、以下のように接続できればOKです!

2. kindでクラスタ作成

SSH接続ができるようになったので、仮想マシンに各種ツールをインストールしていきます。

2-1. 各種ツールのインストール

Git
インストールにGitを使います。

sudo apt install git

curl
ダウンロードや動作確認等に使います。

sudo apt install curl

kind
(対応するアーキテクチャを事前に確認してください。参考:https://kind.sigs.k8s.io/docs/user/quick-start/

[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64
chmod +x ./kind
sudo cp ./kind /usr/local/bin/kind

Docker

sudo apt install docker.io

kubectl

curl -LO "https://dl.k8s.io/release/$(curl -LS https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl

ここからは便利ツールなので、任意です。
kubectl補完機能

kubectl completion bash > kubectl_completion
sudo mv kubectl_completion /etc/bash_completion.d/kubectl

エイリアス設定
「kubectl」を「k」と打つだけでよくなります

cat <<"EOT" >> ${HOME}/.bashrc
alias k="kubectl"
complete -o default -F __start_kubectl k
EOT

kube-ps1
今自分がどのcontext、namespaceで作業しているのか等が表示されるので、いちいちコマンドで確認しなくてよくなります。

git clone https://github.com/jonmosco/kube-ps1.git ~/.kube-ps1
cat <<"EOT" >> ~/.bashrc

source ~/.kube-ps1/kube-ps1.sh
function get_cluster_short() {
  echo "$1" | cut -d . -f1
}
KUBE_PS1_CLUSTER_FUNCTION=get_cluster_short
KUBE_PS1_SUFFIX=') '
PS1='$(kube_ps1)'$PS1
EOT

kubectx/kubens
context、namespaceの切り替えコマンドが短くなり、楽になります。

git clone https://github.com/ahmetb/kubectx.git ~/.kubectx
sudo ln -sf ~/.kubectx/completion/kubens.bash /etc/bash_completion.d/kubens
sudo ln -sf ~/.kubectx/completion/kubectx.bash /etc/bash_completion.d/kubectx
cat <<"EOT" >> ~/.bashrc

export PATH=~/.kubectx:$PATH
EOT

補完機能等を入れた場合は、有効化します。

. ~/.bashrc
. /etc/profile.d/bash_completion.sh
. /etc/bash_completion.d/kubectl

2-2. kindでクラスタ構築

kindを使ってクラスタを構築してみます。
以下のYAMLファイルを仮想マシンの任意の場所に作成しましょう。
コントロールプレーンやワーカーの数は適宜変えてください。(お試しなら1:2くらいで十分だと思います)
今回は、~/k8s/kind.yaml に作成しました。

apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
  image: kindest/node:v1.28.7@sha256:9bc6c451a289cf96ad0bbaf33d416901de6fd632415b076ab05f5fa7e4f65c58
- role: control-plane
  image: kindest/node:v1.28.7@sha256:9bc6c451a289cf96ad0bbaf33d416901de6fd632415b076ab05f5fa7e4f65c58
- role: control-plane
  image: kindest/node:v1.28.7@sha256:9bc6c451a289cf96ad0bbaf33d416901de6fd632415b076ab05f5fa7e4f65c58
- role: worker
  image: kindest/node:v1.28.7@sha256:9bc6c451a289cf96ad0bbaf33d416901de6fd632415b076ab05f5fa7e4f65c58
- role: worker
  image: kindest/node:v1.28.7@sha256:9bc6c451a289cf96ad0bbaf33d416901de6fd632415b076ab05f5fa7e4f65c58
- role: worker
  image: kindest/node:v1.28.7@sha256:9bc6c451a289cf96ad0bbaf33d416901de6fd632415b076ab05f5fa7e4f65c58

クラスターを作成します。

kind create cluster --config ~/k8s/kind.yaml --name kind-cluster

しばらく待つと、クラスターが作成されます!

PCをシャットダウンするときは、仮想マシンを保存終了すると、再度起動したときにそのまま再開できますよ!

エラー発生したら:failed to create cluster

こちらは、私がはまったエラーです。

ERROR: failed to create cluster: failed to join node with kubeadm: command "docker exec --privileged kind-cluster-worker kubeadm join --config /kind/kubeadm.conf --skip-phases=preflight --v=6" failed with error: exit status 1
Command Output: I0326 05:52:33.452193     137 join.go:412] [preflight] found NodeName empty; using OS hostname as NodeName

まずは、ログを確認してみましょう。

 kind export logs

出力に応じて対応が変わります。
①dial unix /var/run/docker.sock: connect: permission denied

ERROR: failed to list nodes: command "docker ps -a --filter label=io.x-k8s.kind.cluster=kind --format '{{.Names}}'" failed with error: exit status 1
Command Output: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json?all=1&filters=%7B%22label%22%3A%7B%22io.x-k8s.kind.cluster%3Dkind%22%3Atrue%7D%7D": dial unix /var/run/docker.sock: connect: permission denied

Dockerの実行権限がないようです。
dockerグループがあることを確認します。

grep docker /etc/group

実行ユーザーをdockerグループに追加します。

sudo usermod -aG docker vboxuser

再接続すれば、設定が有効になるはずです。

②ERROR: unknown cluster "kind”
まずはシングルノードなら動くことを確認してみましょう。

kind create cluster

シングルノードなら動く場合、以下のコマンド実行で修正できると思います。

echo fs.inotify.max_user_watches=655360 | sudo tee -a /etc/sysctl.conf
echo fs.inotify.max_user_instances=1280 | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

参考リンク:https://github.com/kubernetes-sigs/kind/issues/2744#issuecomment-1127808069

おわりに

kindとVirtualBoxを使って、自分だけのKubernetes環境を無料で構築できました!
素敵なKubernetesライフを!

お知らせ

APCはAWS Advanced Tier Services(アドバンストティアサービスパートナー)認定を受けております。


その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。
www.ap-com.co.jp

https://www.ap-com.co.jp/service/utilize-aws/

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp

本記事の投稿者: r-nakane
AWSをメインにインフラ系のご支援を担当しています。