kubernetes クラスタを作成する

概要

Ubuntu 20.04のホストを使って、kubernetes 1.23.5でクラスタを作成していきます。 クラスタ作成のために使うツールはkubeadmを使って行います。

クラスタとして使うVM情報

VM メモリ CPU ディスク
k8s-master01 8GB 4 500GB
k8s-worker01 8GB 4 500GB
k8s-worker02 8GB 4 500GB
k8s-worker03 8GB 4 500GB

手順

各ノードへの操作

本章の手順はkubernetesクラスタに参加させるホストすべてに必要な操作です。

はじめに

スワップを無効にします。

$ sudo swapoff -a

iptablesのブリッジネットワークの有効化

br_netfilterモジュールがロードされていることを確認する。

$ lsmod | grep br_netfilter

読み込まれていない(出力がない)場合はsudo modprobe br_netfilterで明示的に読み込みを行う。

iptablesがブリッジのネットワークトラフィックを処理できるように、設定ファイルを書き換えます。

$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
$ 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

コンテナランタイムのインストール

今回はcontainerdkubernetes のコンテナランタイムとして使用するので、こちらをインストールしていきます。

まずはcontainerdをシステムへインストールするのに必要な設定を行います。

$ cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

$ sudo modprobe overlay
$ sudo modprobe br_netfilter

# Setup required sysctl params, these persist across reboots.
$ cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# Apply sysctl params without reboot
$ sudo sysctl --system

次に、containerdのインストールです。

$ sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
$ 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 update && sudo apt install -y containerd.io
$ sudo mkdir -p /etc/containerd
$ containerd config default | sudo tee /etc/containerd/config.toml

containerdでcgroupはsystemdのものを使うために、設定ファイルを修正します。 上の手順で書き換えた設定ファイルの[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]セクションにあるSystemdCgroupプロパティをtrueに書き換えて再起動させます。

$ sudo systemctl restart containerd

kubeadm/kubelet/kubectl のインストール

下記コマンドでkubernetesのツール群をインストールします。

# Update the apt package index and install packages needed to use the Kubernetes apt repository:
$ sudo apt update
$ sudo apt install -y apt-transport-https ca-certificates curl

# Download the Google Cloud public signing key:
$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

# Add the Kubernetes apt repository:
$ echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# Update apt package index, install kubelet, kubeadm and kubectl, and pin their version
$ sudo apt update && sudo apt install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl

これでホストの初期設定は完了です。

masterノードを構築する

masterノードを初期化する

kubeadm init実行時に引数に指定する設定ファイルを用意します。 このファイルはmasterノードで使うのでホストに配置しておいてください。

# kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.23.5
networking:
        podSubnet: "172.16.0.0/16"
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

masterノードでkubeadm初期化処理を実行

$ sudo kubeadm init --config kubeadm-config.yaml

この時表示されるkubeadm joinコマンドはworkerノード構築で使うのでメモしておきます。

Podネットワークアドオンのインストール

kubernetesはCNIによってPodのネットワークを構築します。

また、kubernetesはこれらの機能をプラグインとして管理しているので、別途CNIに対応したソフトウェアをインストールする必要があります。 対応しているプラグインこちらに一覧があります。

今回はkubernetesのテストでも使われているcalicoをインストールして使っていきます。

$ curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O

ダウンロードしたファイルのkubernetesのバージョンをインストールしたものに置き換えておきます。今回は1.23.5です。

最後に下記のコマンドでcalicoをkubernetesにデプロイします。

$ kubectl apply -f calio.yaml

workerノードを構築する

kubeadm init実行時に表示されたjoin用のコマンドをワーカーノードで実行する。

コマンドのトークンの有効期限が1日なので1日以上間が空いてしまった場合はmasterノードでkubeadm token create --print-join-commandを実行して再度トークンを発行してください。

$ kubeadm join 192.168.11.249:6443 --token baybl2.i0v3dragpuzikk9k \
        --discovery-token-ca-cert-hash sha256:784e7315d642b4feba182b8422d1d48fac3cba2cad5356481ddd3829eacce643

確認

ワーカーノードをマスターノードに参加させると、マスターノードで以下のコマンドを実行することでクラスタに参加しているノードを確認することができます。

NAME           STATUS   ROLES                  AGE     VERSION
k8s-master01   Ready    control-plane,master   2d11h   v1.23.5
k8s-worker01   Ready    <none>                 2d11h   v1.23.5
k8s-worker02   Ready    <none>                 4h3m    v1.23.5
k8s-worker03   Ready    <none>                 4h3m    v1.23.5

ワーカーノードがクラスタに参加できているので、想定通り1台のマスターノード、3台のワーカーノードの状態になっています。

あとはここにいろいろなアプリケーションをデプロイしてきたいですが、そちらの手順は別の記事にしたいと思います。(まだそこまでできてないだけ...)

参考資料