VirtualBox+CentOS 7+kubeadmを利用してKubernetesクラスタのローカル構築を試してみる
2018.11.19
VirtualBox+CentOS 7+kubeadmを利用してKubernetesクラスタのローカル構築を試してみます。
はじめに
コンテナオーケストレーションであるKubernetesはGKEやAKS、Amazon 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クラスタ環境をクラウドにて展開することもできそうです。