kubernetesのドキュメントを読んでAWS環境にkuenetesクラスタを作ってみました。
基本的にはクラウドプロバイダーから提供されているkubernetes環境を使うことになるので、コマンドを叩いてクラスタを作ることはないと思いますが、内部で何をしているかを把握するためにkubeadminを使って構築してみました。
また、何も動かないと面白くないので、80番ポートにアクセスすると「Hello Docker!」と返すだけのPodもワーカーノードに配置してみました。
構成図
今回構築する環境の構成図です。
kubernetesクラスターにマスターノード1台、ワーカーノード1台がある構成にして、マスターノードからワーカーノードに対してPodを配置してみます。マニフェストファイルもマスターノードに作成します。
前提
- kubernetesのマスターノード、ワーカーノード共に、CPU coreが2つ以上で、メモリ2048MB以上が必須のため、EC2のt2.mediumインスタンスで構築していきます。
- EC2のAMIは、「Ubuntu Server 18.04 LTS (HVM), SSD Volume Type - ami-0eeb679d57500a06c」を使用しました。
前準備
EC2インスタンスの準備
キーペア作って、EC2を2台(マスターノード用、ワーカーノード用のマシン)をそれぞれ起動しておきます。
作ったキーペアで2台ともSSHログインできることを確認しておきます。
$ ssh -i ~/.ssh/kubenetes.pem ubuntu@ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
※以降はubuntuユーザでSSHログインして実行したコマンドを記載しています
SWAPをオフにしておきます。
$ sudo swapoff -a
セキュリティグループの準備
AWS Consoleでマスターノードとワーカーノードでセキュリティグループを準備します。
[インバウンドルール]
・マスターノード
・ワーカーノード
[アウトバウンドルール (マスターノード、ワーカーノード共通)]
始める前に確認すること
マスターノード・ワーカーノードのそれぞれにSHHログインし、ホスト名、MACアドレス、product_uuidがユニークで、他のノードと被っていないか確認します。
# ホスト名の確認 $ hostname -s # product_uuidの確認 $ sudo cat /sys/class/dmi/id/product_uuid # MACアドレスの確認 $ /bin/ip link show eth0
同様に、複数のネットワークアダプタがないか確認しておきます。
$ ifconfig
Docker(CE)のインストール
Kubernetesはマスターノード・ワーカーノードの両方にPodとコンテナを作るので、Docker、containerd、CRI-O等のコンテナランタイムをインストールしておきます。
今回はDocker(CE)を入れていきます。
# https経由でaptを実行するために必要なパッケージをインストール $ sudo apt-get update && sudo apt-get install apt-transport-https ca-certificates curl software-properties-common # Docker’s 公式のGPG keyを追加 $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # Docker aptリポジトリを追加 $ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" # [Docker CEのインストール](https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker) $ sudo apt-get update && sudo apt-get install docker-ce=18.06.2~ce~3-0~ubuntu # デーモン設定 $ sudo cat << 'EOT' | sudo tee /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOT # docker.service.dのディレクトリ作成 $ sudo mkdir -p /etc/systemd/system/docker.service.d # docker再起動 $ sudo systemctl daemon-reload $ sudo systemctl restart docker # dockerのステータス確認 $ sudo systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: e Active: active (running) since Sun 2019-08-18 08:10:14 UTC; 14s ago
Dockerが動くところまで確認できました。
kubeadm, kubelet, kubectlのインストール
全てのノード(マスターノード、ワーカーノードの両方)で、kubeadm, kubelet, kubectlをインストールします。
# Googleクラウド 公式のGPG keyを追加 $ sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - # ソースリストにkubernetes.listを追加 $ sudo cat << 'EOT' | sudo tee /etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOT # kubelet kubeadm kubectlをインストール $ sudo apt-get update && sudo apt-get install -y kubelet kubeadm kubectl # インストールしたkubelet kubeadm kubectlのバージョンがあがらないように $ sudo apt-mark hold kubelet kubeadm kubectl
各ノード間でバージョンが異なると予期せぬ動きに繋がるので、バージョンが変わらないようにしています。
cgroup driverの設定
Dockerのcgroupドライバーを確認し、cgroupfsでない場合はDockerと同じcgroupドライバーでkubeleteを実行するようにします。
$ sudo docker info | grep -i cgroup Cgroup Driver: systemd
kubelet起動時にオプション--cgroup-driver=systemd
を渡すように設定しました。
$ sudo mkdir /var/lib/kubelet $ sudo touch /var/lib/kubelet/kubeadm-flags.env $ sudo cat << 'EOT' | sudo tee /var/lib/kubelet/kubeadm-flags.env KUBELET_EXTRA_ARGS=--cgroup-driver=systemd EOT
kubeletを再起動します。
sudo systemctl daemon-reload
sudo systemctl restart kubelet
ここまでの手順で、kubeadminを実行して、kubernetestクラスターを作ることができました。 次はkuenetesのマスターノード・ワーカーノードの構築を行っていきます。