Simple minds think alike

より多くの可能性を

kubeadminでAWS EC2環境にkuenetesクラスタを作ってみた - 各ノード共通の設定 (1/2)

kubernetesのドキュメントを読んでAWS環境にkuenetesクラスタを作ってみました。
基本的にはクラウドプロバイダーから提供されているkubernetes環境を使うことになるので、コマンドを叩いてクラスタを作ることはないと思いますが、内部で何をしているかを把握するためにkubeadminを使って構築してみました。

また、何も動かないと面白くないので、80番ポートにアクセスすると「Hello Docker!」と返すだけのPodもワーカーノードに配置してみました。

kubernetes.io

構成図

今回構築する環境の構成図です。

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のマスターノード・ワーカーノードの構築を行っていきます。

simple-minds-think-alike.hatenablog.com