はじめに
以前k8sをkubeadmで構築した際に、コントロールプレーンのヘルスチェックはHAProxy+keepalivedで実現させていたが、AWSのNetwork LoadBalancerで実現できるか確認してみようと思います。
構成
サーバ環境情報
- Ubuntu 22.04
- kubeadm/kubectl/kubelet 1.28.03
- runc 1.1.9
- containerd 1.7.5
- cni-plugin 1.3.0
実際にやってみる
Kubernetesをまずインストール
コントロールプレーン3台に入れていく。
#各種設定
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay && modprobe br_netfilter
cat <<EOF | 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
sysctl --system
#Containerdインストール
wget https://github.com/containerd/containerd/releases/download/v1.7.5/containerd-1.7.5-linux-amd64.tar.gz
tar Cxzvf /usr/local containerd-1.7.5-linux-amd64.tar.gz
wget -P /usr/local/lib/systemd/system/ https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
systemctl daemon-reload
systemctl enable --now containerd
#runcインストール
wget https://github.com/opencontainers/runc/releases/download/v1.1.9/runc.amd64install -m 755 runc.amd64 /usr/local/sbin/runc
#cni-pluginインストール
wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
mkdir -p /opt/cni/bin
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.3.0.tgz
#Containerd設定
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml
sed -i -e 's/sandbox_image = "registry.k8s.io\/pause:3.8/sandbox_image = "registry.k8s.io\/pause:3.9/g' /etc/containerd/config.toml
sed -i -e 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
systemctl restart containerd
#Kubernetesインストール
apt-get update
apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
ELBを作る
ターゲットグループ
ターゲットタイプ:インスタンス
ターゲットグループ名:お好きなように
プロトコル:TCP
ポート番号:6443
IPアドレスタイプ:IPv4
VPC:指定したもの
ヘルスチェックプロトコル:TCP
ターゲット:コントロールプレーン3台
ロードバランサー
タイプ:Network
ロードバランサー名:お好きなように
スキーム:Internet
IPアドレスタイプ;IPv4
VPC:指定したもの
マッピング:所属するAZとサブネット(パブリックサブネットを選択)
セキュリティグループ:6443ポートを許可するSG
リスナー:TCP/6443/作成したターゲットグループ
ヘルスチェックを確認
ターゲットグループにぶら下がっていることと、インスタンスへの疎通が取れている。
コントロールプレーンの起動
その他引数の指定はお好みで。
kubeadm init --control-plane-endpoint "<NLBのDNS名>:6443"