VirtualBoxでKubernetes環境構築

VirtualBox利用して、Kubernetes環境を構築する手順を説明します。

構築するKubernetes環境は1 Control Plane + 1 Worker Node環境です。KubernetesのOSはUbuntu Serverを利用します。基本的にはKubernetes公式マニュアル通りですが、一部追加設定が必要です。

必要なもの:

まずはControl Plane用のVMを作ります。VirtualBoxを運用するPCからアクセスできるようにNetwork AdapterはBridged Adapterにします。名前はk8s-control-planeに設定。

k8s-control-planeにUbuntu Serverのisoファイルをマウントし、インストールします。インストール中にhostnameを聞かれたらVM名と同じk8s-control-planeに設定します。またOpenSSHも有効にします。ただし、その他のパッケージはインストールしないでください。(特にDocker、Dockerは後でKuberentesと一緒にaptでインストールします)

OSのインストールが終わったら、本格的にKubernetesに必要な設定を行います。

まずはswapを無効にします。

sudo swapoff -a

上記だけだと、再起動したときにswapがまた有効になるのでfstab設定も変更し、ブート時のswapも無効にします。(/etc/fstabからswapパーティションをコメントアウト)

sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab

次に、Kuberentes動作に必要なポートをfirewallから許可します。ついでにSSHポートも許可してリモートからSSHできるようにします。(Visual Studio Code Remote SSH + Kubernetesプラグインを使うため)

sudo ufw limit ssh
sudo ufw allow 6443/tcp
sudo ufw allow 2379:2380/tcp
sudo ufw allow 10250:10252/tcp
sudo ufw allow 8285/udp
sudo ufw allow 8472/udp
sudo ufw --force enable 

※ UDP 8285, 8472ポートを許可しないと、Kubernetesのflannelプラグインが動作しなくなりPodからのインターネットアクセスができなくなります。

次に、Kubernetesが利用するコンテナエンジンであるDockerをインストールします。(公式マニュアル)

sudo apt-get update && sudo apt-get install -y \
  apt-transport-https ca-certificates curl software-properties-common gnupg2

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
  "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
  stable"

sudo apt-get update && sudo apt-get install -y \
  containerd.io docker-ce docker-ce-cli

cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker

Dockerのインストールが終わったら、いよいよKubernetesのインストールです。(Kubernetes公式マニュアル)

まずはKubernetes動作に必要なネットワーク設定を行います。

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sudo sysctl --system

そしてKubernetesの各コンポーネントをインストールします。(kubelet, kubeadm, kubectl)

sudo apt-get update && sudo apt-get install -y apt-transport-https curl

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF

sudo apt-get update && sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

インストールが終わったら、このVMをControl Planeとして使うように初期化を行います。flannel利用のため、PodのCIDRを10.244.0.0/16に設定する必要があるのでパラメータで設定します。

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

初期化作業のログの最後にWorker Nodeの設定に必要なコマンドが出力されるのでコピーしておきます。(kubeadm join ~)

kubectl使用に必要な設定ファイルをコピーします。(出典)

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Kubernetesにflannelをインストールします。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

少し待ってから、正常にKubernetesが動いているか確認します。

kubectl get node
kubectl get pod -n kube-system

これでControl PlaneのVM準備は終わりです。

Worker NodeのセットアップはControl Planeとほぼ一緒です。k8s-node-0という名前でVMを作り、Ubuntu ServerをインストールしControl Planeのセットアップと同じ手順をKubernetesの各コンポーネントをインストールまで行います。ただし、許可するポートは以下のように変えます。

sudo ufw limit ssh
sudo ufw allow 10250/tcp
sudo ufw allow 30000:32767/tcp
sudo ufw allow 8285/udp
sudo ufw allow 8472/udp
sudo ufw --force enable 

Kubernetesのコンポーネントインストールまで終わったら、Control Planeのkubeadm initコマンドのログでコピーしたkubeadm joinコマンドを実行します。

sudo kubeadm join ...

上記コマンドが成功したら、Control PlaneのVMから正しくWorker Nodeが接続されたか確認します。

kubectl get node

k8s-control-plane, k8s-node-0ノードが両方ともReady状態になっていればセットアップは終了です。

これでVirtualBoxの環境にKubernetesを構築できました。VMのSnapshot機能を利用していつでも状態を戻せるので、いろいろ自由にテストできると思います。

作成者: kkc0923

KANOTYPE管理者。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Note: Commenter is allowed to use '@User+blank' to automatically notify your reply to other commenter. e.g, if ABC is one of commenter of this post, then write '@ABC '(exclude ') will automatically send your comment to ABC. Using '@all ' to notify all previous commenters. Be sure that the value of User should exactly match with commenter's name (case sensitive).

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください