環境
- ubuntu:22.0.4.1 LTS
- kubernetes:1.28.2
要件確認
公式ドキュメントより確認
以下、抜粋。ここでは、Swapのオフについてのみ記載します。
(Swapについては、v1.22以降では有効でも使用できるらしいです(後述)。)
- 1台あたり2GB以上のメモリ(2GBの場合、アプリ用のスペースはほとんどありません)
- 2コア以上のCPU
- クラスター内のすべてのマシン間で通信可能なネットワーク(パブリックネットワークでもプライベートネットワークでも構いません)
- ユニークなhostname、MACアドレス、とproduct_uuidが各ノードに必要です。詳細はここを参照してください。
- マシン内の特定のポートが開いていること。詳細はここを参照してください。
- Swapがオフであること。kubeletが正常に動作するためにはswapは必ずオフでなければなりません。
※Swapを使用する場合はKubeletConfigurationで修正できるようです。
(動作確認はできていないです。)
swapのオフ
/etc/fstabの修正
以下をコメントアウトする
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-TyqXbx0yg0a711NQgPrCGSXBSnt6VFU4b995cVb1DSgP2k6GwyyHlQFPDxhfMKrU / ext4 defaults 0 1
# /boot was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/c2cc52fd-0ac5-41c9-91d2-e17ec2687ec9 /boot ext4 defaults 0 1
- /swap.img none swap sw 0 0
+ #/swap.img none swap sw 0 0
再起動
再起動を実行
sudo reboot
確認
swap領域を確認する
free -h
出力例
total used free shared buff/cache available
Mem: 3.8Gi 305Mi 2.3Gi 1.0Mi 1.2Gi 3.3Gi
Swap: 0B 0B 0B
コンテナランタイム用の設定
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# カーネルパラメーターの設定
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# カーネルパラメーターを適用
sudo sysctl --system
確認 - モジュール
以下のコマンドで、モジュールが読み込まれていることを確認する。
lsmod | grep br_netfilter
出力例
br_netfilter 32768 0
bridge 307200 1 br_netfilter
lsmod | grep overlay
出力例
overlay 151552 0
確認 - カーネルパラメータ
以下のコマンドで、カーネルパラメータが反映されていることを確認します。
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables
出力例
net.ipv4.ip_forward
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
containerdのインストール
コンテナランタイムには、containerdを使用します。
インストール方法はいくつかありますが、ここではDockerより配布されているcontainerd.ioをインストールします。その他の方法についてもgetting-started.mdに記載があります。
aptレポジトリの追加
以下の一連のコマンドでレポジトリを追加します。
# GPG鍵を追加
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# レポジトリを追加
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
container.ioのインストール
sudo apt-get install containerd.io
configの作成、修正
公式ドキュメントを確認すると、kubelet用のcgroupドライバーにsystemdに設定する際は、コンテナランタイムのcgroupドライバーもsystemdに変更する必要があります。
kubelet用のcgroupドライバーとしてsystemdを設定する場合、コンテナランタイムのcgroupドライバーにもsystemdを設定する必要があります。 具体的な手順については、以下のリンクなどの、お使いのコンテナランタイムのドキュメントを参照してください。
はじめに以下のコマンドで、デフォルトのコンフィグを作成できます。
containerd config default > /etc/containerd/config.toml
上記で作成したファイルを以下のように修正します。
後にkubenetesを起動する際は、kubeletのcgroupドライバーの設定をする。
加えて、デフォルトのままだと、以下のエラーが出るので、sandboxのバージョンを変更する。
W1110 12:27:27.248837 1905882 checks.go:835] detected that the sandbox image "registry.k8s.io/pause:3.6" of the container runtime is inconsistent with that used by kubeadm. It is recommended that using "registry.k8s.io/pause:3.9" as the CRI sandbox image.
[plugins."io.containerd.grpc.v1.cri"]
- sandbox_image = "registry.k8s.io/pause:3.6"
+ sandbox_image = "registry.k8s.io/pause:3.9"
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.opti ons]
- SystemdCgroup = false
+ SystemdCgroup = true
containerdの再起動
sudo systemctl restart containerd
cniプラグインのインストール
以下のアーカイブをダウンロードする
- cni-plugins-linux-amd64-v1.3.0.tgz
wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
インストール
sudo mkdir -p /opt/cni/bin
sudo tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.3.0.tgz
kubeadm, kubelet, kubectlのインストール
aptレポジトリの追加
# 必要なパッケージをインストール
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
# Google Cloudの公開鍵をダウンロード
curl -fsSL https://dl.k8s.io/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
# レポジトリを追加
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
kubernetesに必要なソフトウェアをインストール
kubectlは必要に応じてインストールする。
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
以上で準備は完了です。
次回は、kubeadmを使用してkubernetesを構築していきます。