はじめに
今回は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 | 目的 |
any | inbound | any | 10.240.0.0/24 | ネットワークIPレンジ内でnodeへの任意のプロトコルでの接続を許可 |
TCP | outbound | 22 | 0.0.0.0/0 | ssh接続 |
TCP | outbound | 6443 | 0.0.0.0/0 | Kubernetes API serverへのリクエスト |
ICMP | outbound | – | 0.0.0.0/0 | pingでの監視や疎通確認用 |
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それぞれにインストールするようにしましょう。
手順の詳細が気になる方は下記の公式ドキュメントから手順を確認することができます。
まず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で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の種類によっては細かいところで構築するのに差分がありました。
(実は色々試してハマったりした)
それでも、おおよその流れは掴めてやって良かったなと思います。