GCEとkubeadmでkubernetesクラスター構築

Tech

はじめに

今回はGoogleCloudでVMを建てて、kubernetesクラスターを構築していきます。
ターミナルからgcloudコマンドを使用して、サクッとVPCとGCEを作成します。
(当初はVagrantでVMを建てて構築しようと試みたのですが、M1 macだとVirtualBoxが対応しておらず断念、無料枠がまだ残っていたのでGCEで構築することにしました)

使用するもの

  • macOS Monterey 12.2.1 (M1 2020)
  • Google Cloud SDK 400.0.0 — GCP操作に使用
  • node用VMのOS — Ubuntu 20.04.3 LTS (GNU/Linux 5.11.0-1020-gcp x86_64)
  • コンテナランタイム — Docker
  • ネットワークアドオン — Calico
  • Kubernetes v1.25.0

GoogleCloudでVM環境を用意する

VPCネットワークの作成

まずはnode同士が接続できるように設定します。

# VPCネットワークの作成
gcloud compute networks create k8s-vpc-nw --subnet-mode=custom
# サブネットの作成
gcloud compute networks subnets create k8s-vpc-nw-subnet --range=10.240.0.0/24 --network=k8s-vpc-nw

ファイアウォールの設定

gcloud compute firewall-rules create k8s-vpc-nw-allow-internal \
    --network=k8s-vpc-nw \
    --allow all \
    --source-ranges=10.240.0.0/24

gcloud compute firewall-rules create k8s-vpc-nw-allow-external \
    --network k8s-vpc-nw \
    --allow tcp:22,tcp:6443,icmp

ファイアウォール設定の詳細

プロトコル通信の向きポート範囲ソースIP目的
anyinboundany10.240.0.0/24ネットワークIPレンジ内でnodeへの任意のプロトコルでの接続を許可
TCPoutbound220.0.0.0/0ssh接続
TCPoutbound64430.0.0.0/0Kubernetes API serverへのリクエスト
ICMPoutbound0.0.0.0/0pingでの監視や疎通確認用

VMインスタンスの作成

次にクラスターのnode用にmaster nodeとworker nodeをそれぞれ1台ずつのVMインスタンスを作成します。
インスタンスタイプはmaster(E2-medium),worker(E2-small)、OSはUbuntu 20.04 LTSとします。

gcloud compute instances create k8s-master \
    --machine-type=e2-medium \
    --image-family=ubuntu-2004-lts \
    --image-project=ubuntu-os-cloud \
    --subnet=k8s-vpc-nw-subnet \
    --private-network-ip 10.240.0.11

gcloud compute instances create k8s-worker \
    --machine-type=e2-small \
    --image-family=ubuntu-2004-lts \
    --image-project=ubuntu-os-cloud \
    --subnet=k8s-vpc-nw-subnet \
    --private-network-ip 10.240.0.12

インスタンスが正常に建っているか確認します。masterとwokerが1台ずつ表示されればOKです。

gcloud compute instances list

# masterとwokerが一台ずつ作成されている
# NAME        ZONE        MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
# k8s-master  us-west1-c  e2-medium                  10.240.0.11  34.82.232.121   RUNNING
# k8s-worker  us-west1-c  e2-small                   10.240.0.12  104.198.107.29  RUNNING

kubeadmのインストール

VMが用意できたら、kubeadmや各種コンポーネントのインストールをすすめていきます。
※masterとwokerそれぞれにインストールするようにしましょう。
手順の詳細が気になる方は下記の公式ドキュメントから手順を確認することができます。

kubeadmのインストール
 

まずVMインスタンスへ接続を行います。gcloudコマンドでssh接続をしてみましょう。
使い慣れたteratermなどから接続したい方は調べるとすぐに出てくるかと思います。

#master
gcloud compute ssh k8s-master
#woker
gcloud compute ssh k8s-worker

iptablesがブリッジを通過するトラフィックを処理できるようにする

コマンドを実行する前に管理者権限に移行しておきます。

sudo -i
modprobe br_netfilter
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

iptablesがnftablesバックエンドを使用しないようにする

VMインスタンスのOSが今回はUbuntu 20.04 LTSなので以下を実行します。
一応、OSのバージョンも確認してみましょう。

cat /etc/*release*
# レガシーバイナリがインストールされていることを確認
apt-get install -y iptables arptables ebtables

# レガシーバージョンに切り替え
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
update-alternatives --set arptables /usr/sbin/arptables-legacy
update-alternatives --set ebtables /usr/sbin/ebtables-legacy

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

kubernetesはpodを動かす際、コンテナランタイムを使用します。いくつかコンテナランタイムには種類があるのですが、今回はdockerを使用します。 それでは、以下のコマンドを実行していきます。

sudo apt update
sudo apt install -y docker.io 
sudo systemctl enable docker.service
sudo apt install -y apt-transport-https curl

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

ようやくここでkubeadmをインストールします。
同時にkubelet,kubectlもインストールしていきます。

  • kubeadm: クラスターを起動するコマンドです。
  • kubelet: クラスター内の各ノードで動作するKubernetesのエージェントで、コンテナランタイムを操作してPodの起動や管理を担います。
  • kubectl: クラスターにアクセスするためのコマンドラインツールです。
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

はい、以上でkubeadmのインストールが無事終わりました。
それでは次からkubeadmコマンドでクラスターを起動していきます。

kubeadmを使用したクラスターの構築

クラスター構築までの準備が整ったので、kubeadmでサクッと構築してみます。
思ったより簡単に作成することができます。
手順の詳細が気になる方は下記の公式ドキュメントから手順を確認することができます。

kubeadmを使用したクラスターの作成
 

コントロールプレーンノードの初期化

次はkubeadmでmasterノード(controlplane)を作成します。
※masterでkubeadm initを実行していきます。

kubeadm init \
  --apiserver-advertise-address=10.240.0.11 \
  --pod-network-cidr=192.168.0.0/16

補足

  • –apiserver-advertise-addressは、ノードのIPを指定します。インスタンス作成時プライベートIPを指定しているので上記のIPで大丈夫ですが、IPを確認したい場合 ip aコマンドで確認できます。
  • –pod-network-cidrは、Calicoのデフォルトである192.168.0.0/16を指定します。podに払い出されるIPアドレスになります。

kubectlをroot以外のユーザーで実行できるように以下コマンドを実行します。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

今rootユーザーの場合は、代わりに次のコマンドを実行します。

export KUBECONFIG=/etc/kubernetes/admin.conf

kubeadm initが出力したkubeadm joinコマンドをメモしておきます。クラスターにノードを追加するために、下画像の緑の枠で囲ってあるこのコマンドが必要になります。

試しにここでノードの確認をしてみます。masterがいることが確認できます。

kubectl get nodes

# NAME         STATUS     ROLES           AGE   VERSION
# k8s-master   NotReady   control-plane   51s   v1.25.0

ノードを追加する

※ wokerで実行。
masterでkubeadm initした時の結果にkubeadm joinコマンドが表示されるので実行します

kubeadm join 10.240.0.11:6443 \
  --token 8hyuzp.6pm5f2iyjaalg97j \
	--discovery-token-ca-cert-hash sha256:86fa0e1e3c50e0a77ba6ba78cd87ccfffa7be0d91343ff0e62ce124c7ecae4f4

コピーし忘れて、消えてしまった場合は以下のコマンドで新規tokenの作成、CA証明書のハッシュ値を取得ができます。

kubeadm token create --print-join-command

workerが追加されていることを確認してみます。
※masterから実行。

kubectl get nodes

workerが参加していることが確認できる
# NAME         STATUS     ROLES           AGE   VERSION
# k8s-master   NotReady   control-plane   13m   v1.25.0
# k8s-worker   NotReady   <none>          15s   v1.25.0

このままではpod同士の通信ができていないので、Container Network Interface(CNI)をベースとするPodネットワークアドオンをインストールが必要になります。

ネットワークアドオン(Calico)のインストール

CNIについては種類があるのですが、今回はCalicoを使用します。
バージョンは2022/9時点で最新の物を使用。※ wokerで実行。

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/tigera-operator.yaml

curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/custom-resources.yaml -O
kubectl create -f custom-resources.yaml

インストールが完了したのでpodへの通信を確認してみます。

# podの確認
kubectl get pod -A
# ノードの確認
kubectl get nodes

最終的にpodが正常に全てrunning状態になっていれば、ノードもReady状態になっているかと思います。

お片付け

Google CloudやAWSなどのパブリッククラウドは従量制課金されていきますので、不要であればすぐに削除してしまいましょう。

gcloud compute instances delete k8s-master k8s-worker
gcloud compute firewall-rules delete k8s-vpc-network-allow-internal k8s-vpc-network-allow-external
gcloud compute networks subnets delete k8s-vpc-network-subnet
gcloud compute networks delete k8s-vpc-network

おわりに

以上でGCEとkubeadmを使ってKubernetesクラスターを構築してみました。
基本的にドキュメント通りに実行していけばいい感じでした。
ただ、実行する環境やCRIやCNIの種類によっては細かいところで構築するのに差分がありました。
(実は色々試してハマったりした)
それでも、おおよその流れは掴めてやって良かったなと思います。

タイトルとURLをコピーしました