OPS

VirtualBox+CentOS 7+kubeadmを利用してKubernetesクラスタのローカル構築を試してみる

2018.11.19

本記事のポイント

VirtualBox+CentOS 7+kubeadmを利用してKubernetesクラスタのローカル構築を試してみます。

はじめに

コンテナオーケストレーションであるKubernetesはGKEAKSAmazon EKS等のクラウドサービスで利用することができます。

Kubernetesを検証のためローカル環境で利用したいと思い、今回VirtualBox、CentOS 7、kubeadmを利用してKubernetesクラスタの構築を試してみました。

環境構成

Kubernetesクラスタはマスターノード1台、ワーカーノード1台の構成とします。

VirtualBoxの各ノードVMはNICを2つ用意してNAT、内部ネットワークにそれぞれ割り当てます。内部ネットワーク側は固定IPの設定を行い、ノード間で導通できるようにします。

今回試した構成は次のとおりです。

ホストマシン

  • OS: Windows10 Pro 64bit
  • VirtualBox: 5.2.18

マスターノード(VM1)

  • OS: CentOS 7.5.1804 64bit
  • CPU: x2
  • メモリ: 2GB
  • ホスト名: k8s-master
  • 内部ネットワーク側IPアドレス: 192.168.81.50
  • Docker: 18.06.1-ce
  • Kubernetes: 1.12

ワーカーノード(VM2)

  • OS: CentOS 7.5.1804 64bit
  • CPU: x2
  • メモリ: 2GB
  • ホスト名: k8s-worker
  • 内部ネットワーク側IPアドレス: 192.168.81.121
  • Docker: 18.06.1-ce
  • Kubernetes: 1.12

構成図

構築

事前設定

以下の設定をマスターノード、ワーカーノード両方に行います。

SELinux

無効に設定します。


# setenforce 0
# sed -i -e "s/^SELINUX=enforcing$/SELINUX=disabled/g" /etc/selinux/config

firewall

各ホストの送信元IPアドレスを許可するように設定を行います。

・マスターノード


# firewall-cmd --new-zone k8s --permanent
# firewall-cmd --zone=k8s --set-target=ACCEPT --permanent 
# firewall-cmd --add-source=192.168.81.121 --zone=k8s --permanent
# firewall-cmd --reload

・ワーカーノード


# firewall-cmd --new-zone k8s --permanent
# firewall-cmd --zone=k8s --set-target=ACCEPT --permanent 
# firewall-cmd --add-source=192.168.81.50 --zone=k8s --permanent
# firewall-cmd --reload

/etc/hosts

各ホストの名前解決できるように設定します。


# vi /etc/hosts
192.168.81.50 k8s-master
192.168.81.121 k8s-worker

SWAP

kubeadm導入前に無効化しておきます。
永続化する場合は /etc/fstab を編集してください。


# swapoff -a

Docker

Docker CEをマスターノード、ワーカーノード両方に導入を行います。

必要パッケージのインストール


# yum install yum-utils device-mapper-persistent-data lvm2

stable repositoryを有効化


# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

インストールを実行


# yum install docker-ce

dockerサービスを起動


# systemctl enable docker
# systemctl start docker

kubeadm

マスターノード、ワーカーノード両方に導入を行います。

カーネルパラメータの設定

次の設定を有効化しておきます。


# echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
# sysctl -w net.bridge.bridge-nf-call-ip6tables=1
# echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
# sysctl -w net.bridge.bridge-nf-call-iptables=1

repositoryの設定


# cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF

インストール


# yum install kubeadm --disableexcludes=kubernetes

kubeletサービスを起動


# systemctl enable kubelet
# systemctl start kubelet

マスターノード

kubeadmを実行

次のコマンドを実行してマスターノードの作成を行います。

–apiserver-advertise-address でマスターノードの固定IPアドレスを設定します。また -pod-network-cidr でpodのサブネットを設定します。
今回はVirtualBoxの内部で使われるIPアドレスと被らないように10.240.0.0/16を設定します。


# kubeadm init --apiserver-advertise-address 192.168.81.50 --pod-network-cidr 10.240.0.0/16

成功するとコンソールに

kubeadm join {ip}:{port} –token {token} –discovery-token-ca-cert-hash sha256:{hash}

が表示されます。これはワーカーノード作成時に必要なのでメモしておきます。

kube configのコピー


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

kubectl を実行してnode情報が表示されることを確認します。


# kubectl get nodes
NAME         STATUS     ROLES    AGE     VERSION
k8s-master   NotReady   master   2m19s   v1.12.1

クラスタネットワークが未導入なので、STATUSはNotReadyとなっています。

クラスタネットワークの導入

クラスタネットワークはflannel、Calicoなど複数の種類がありますが、今回はWeave Netを導入してみます。

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


# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')&env.IPALLOC_RANGE=10.240.0.0/16"

Weave Net導入後 kubectl を実行してnodeのSTATUSがReadyと表示されることを確認します。


# kubectl get nodes
NAME         STATUS   ROLES    AGE     VERSION
k8s-master   Ready    master   4m38s   v1.12.1

ワーカーノード

次のコマンドを実行してワーカーノードの作成を行います。
{ip}、{port}、{token}、{hash}はマスターノード作成時にメモした値を利用します。


# kubeadm join --token {token} {ip}:{port} --discovery-token-ca-cert-hash sha256:{hash}

動作確認

マスターノードにて kubectlを実行します。k8s-workerのSTATUSがReadyと表示されていれば構築は成功です。


# kubectl get nodes
NAME         STATUS   ROLES    AGE     VERSION
k8s-master   Ready    master   9m46s   v1.12.1
k8s-worker   Ready    <none>   2m55s   v1.12.1

おわりに

以上でKubernetesクラスタの構築は完了となります。
今回はVirtualBoxを使ったローカル構築を行ってみましたが、この構築手順を応用すればAmazon EC2等を利用して独自のKubernetesクラスタ環境をクラウドにて展開することもできそうです。

参考