前回はkubernetesについてざっくりとした解説をしました。今回は実際にkubernetesを構築してみましょう。ここではkubeadmを使用して、一つのマスターノードと二つのワーカーノードを作成する手順を紹介します。

目次
・前置き
・必要なもの
・マスターノードの構築
    ・事前準備(IPアドレス固定、swap無効化)
    ・kubernetesの構築
      ・パッケージのインストール
      ・kubernetesマスターノードの初期化
      ・kubectlの設定
・ワーカーノードの構築
    ・事前準備(IPアドレス固定、swap無効化)
    ・パッケージのインストール
    ・マスターノードに追加
・まとめ

前置き

今回Ubuntu22.04ではなく20.04にしている理由としては、何故かUbuntu22.04だと上手く動かない(マスターノードの初期化に失敗したり、kubectl get nodesが動かなかったり)ためです。ただこれに関してはおま環である可能性が非常に高いので、可能であればサポートが長いUbuntu22.04を使用した方が良いでしょう。
また、今回はProxmoxで作成した仮想マシンを使っています。何かエラーが起きたらChatGPTに聞いてください。自分はこれで飯食ってるわけではないので的確な回答をすることができません。

必要なもの

・Ubuntuが動作しているマシン3台(物理マシンでも仮想マシンでも良い)
 ちなみに推奨スペックは
    CPUコア数2以上
    メモリ2GB以上
・それぞれのマシンに対してSSH接続が可能であること(手打ちはきついぞ〜)

マスターノードの構築

事前準備

kubernetesをインストールする前に、swap(仮想メモリ)の無効化とIPアドレスの固定をします。
swapを無効化するには下記のコマンドを叩きます。

sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

次にIPアドレスの固定をします。以下のコマンドを叩いてテキストエディタを開きます。

sudo apt install nano -y
sudo nano /etc/netplan/00-installer-config.yaml

エディタが開いたら以下の例に従って任意のIPアドレス(addresses)とデフォルトゲートウェイ(gateway4)を設定してください。

network:
version: 2
renderer: networkd
ethernets:
ens160:
dhcp4: no
addresses: [192.168.1.160/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]


値がわからない場合は、iPhoneやMac、WindowsのWi-Fi設定が参考になると思います。
Windowsの場合は
設定→ネットワークとインターネット→ハードウェアと接続のプロパティを表示する
ここに表示されている「IPv4アドレス」が「addresses」に対応します。
addresses: [IPv4アドレス/24]
でいけると思います。
次にデフォルトゲートウェイですが、よほど変なことをしていない限り「DHCPサーバー」と同じです。
gateway4: DHCPサーバー でいけるかと思います。

Mac、iPhoneの場合は
設定→Wi-Fi→ iマーク or 詳細
ここで表示されている
「IPアドレス」が「addresses」に
「ルーター」が「gateway4」に対応します。

設定ができたら以下のコマンドを打って設定を適用します。

sudo netplan apply

この時IPアドレスが変わるので新たなIPアドレスで再度SSH接続してください。
これで事前準備は完了です。

kubernetesの構築

あとはパッケージぶちこんで設定するだけなのでコピペするだけです。

#パッケージの更新をします
sudo apt update && sudo apt upgrade -y
#dockerをインストールします。dockerランタイムを使用するのは非推奨らしいですが、今回はとりあえず触るという目的なのでこれでいきます
sudo apt install -y docker.io
#dockerを有効にします
sudo systemctl enable docker
sudo systemctl start docker
#kubernetesのインストールを行います
sudo apt install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubeadm kubelet kubectl
#kubernetesのマスターノードを初期化します
sudo kubeadm config images pull
sudo kubeadm init

ここで表示されるkubeadm join ~~~~から始まる2行程度のコマンドをコピーしてどこかにメモしてください。その後下のコマンドをコピペしてください。
kubeadm join <マスターノードのIPアドレス>:6443 –token <トークン> \ –discovery-token-ca-cert-hash sha256:<ハッシュ値>
上記のようなコマンドです。

#kubernetesクラスタの設定をします
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#ネットワークプラグインのインストールをします
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

これでマスターノードの設定は完了です。

ワーカーノードの構築

事前準備

マスターノードと同じ操作をします。また、それぞれのマシンの名前が同じになっていないことを確認してください。仮想マシンをクローンする方法で複数台のマシンを作成している場合、ここでつまづくことが多いかと思われます。

パッケージのインストール

いつも通りコピペしましょう

#パッケージの更新をします
sudo apt update && sudo apt upgrade -y
#dockerをインストールします。dockerランタイムを使用するのはry
sudo apt install -y docker.io
#dockerを有効にします
sudo systemctl enable docker
sudo systemctl start docker
#kubernetesのインストールを行います
sudo apt install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubeadm kubelet kubectl
kubeadm init

上記の操作が終わったら、マスターノードで表示されたkubeadm join ~~~~のコマンドをこちらのマシンに貼り付けます。
kubeadm join <マスターノードのIPアドレス>:6443 –token <トークン> \ –discovery-token-ca-cert-hash sha256:<ハッシュ値>
上記のようなコマンドです。

あとはしばらく待つだけ!なんか上手くいってそうだったらマスターノードに戻ります。
その後下記コマンドを入力し、マシンの名前が複数表示されていれば成功です。お疲れ様でした。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl get nodes

まとめ

いやー本当にkubernetesは難しい。概念の時点で難しいですが、自分で環境構築するのはトラブルだらけで大変ですね。自分はGoogle CloudやAzureといったサービスを使わないので(高いから)クラウドを使ったらもう少し簡単なのではないかと思います。
まだ現時点では初めの一歩を歩み始めた(一歩進んだとは言っていない)状態だと思うので、これからも勉強をしてこのブログにて分かりやすく共有できたらなと思います。

投稿者 カワディアン

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です