こんにちは!クラウド事業部の中根です。
最近Kubernetesに入門しました!
EKS等は便利で簡単に試せて素晴らしいのですが、料金が気になります。
Kubernetesが触れればいいので、ローカルにも検証環境を作ってみました。
自分の備忘録も兼ねて、共有したいと思います。
- kind × VirtualBoxのメリット・デメリット
- 0. 前提条件
- 1. 仮想マシンの設定
- 1-1. 仮想マシンの作成
- 1-3. 仮想マシンの設定
- 2. kindでクラスタ作成
- おわりに
- お知らせ
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/
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。