KubesprayによるKubernetesクラスター構築手順

Kubespray を使ってKubernetesクラスターを構築してみます。クラスター構成はマスター3VM、ワーカー3VMです。そしてkubespray実行用にdeployというVMがあり、計7台構成を想定しています。

今回は検証なのでrootユーザーで実行します。適切な方法としてはansibleユーザーなどを作ってパスワードレスでsudoできるようにしておき、同じような手順でやることだと思います。


構成概要

ホスト名 IPアドレス 役割
kube-master-1 (例)192.168.100.121 Masterノード / etcdノード
kube-master-2 (例)192.168.100.122 Masterノード / etcdノード
kube-master-3 (例)192.168.100.123 Masterノード / etcdノード
kube-worker-1 (例)192.168.100.124 Workerノード
kube-worker-2 (例)192.168.100.125 Workerノード
kube-worker-3 (例)192.168.100.126 Workerノード
deploy (例)192.168.100.127 Ansible実行ホスト (Kubespray)

OS: Ubuntu 22.04 スペック: 各VM4コア4GB インターネット疎通可能であること

各ノードにSSHログインする際に、rootユーザーを使用し、公開鍵認証によりパスワードレスで接続できるようにします。


構築の大まかな流れ

  1. 各ノードでSSHをrootログインできるよう設定(PermitRootLogin yesなど)
  2. deployノードへ必要ツール(Ansible, Python3, Gitなど)をインストール
  3. Kubesprayのダウンロードと依存パッケージのインストール
  4. Inventoryファイル(hosts.iniまたはinventory.ini)を作成し、rootユーザーでの接続を設定
  5. SSH接続テスト (ansible -m ping)
  6. Ansible PlaybookでKubernetesクラスターを構築
  7. クラスターの動作確認

1. 各ノードでrootログインを許可する

まず、マスター・ワーカーの各ノードでSSHサーバー設定を確認します。

# 例: vim /etc/ssh/sshd_config で最下部にコピペ
PermitRootLogin yes
# もしパスワード認証を許可するなら
PasswordAuthentication yes

設定を変更したらSSHデーモンを再起動します。

sudo systemctl restart sshd

2. rootユーザーで公開鍵認証を設定

  1. deployノードで鍵を準備する
    # deployノードで鍵を作成(未作成の場合)
    ssh-keygen -t rsa -b 4096
    # id_rsa(秘密鍵)と id_rsa.pub(公開鍵)ができる
    
  2. 公開鍵をコピーしてrootでパスワードレスログインを可能にする
    # deployノードから各ノードへコピー
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.121
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.122
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.123
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.124
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.125
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.126
    
    #もし以下が出てきたらyesにします
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    
    

    これによって、各ノードの /root/.ssh/authorized_keys に公開鍵が登録されます。

  3. SSH接続テスト
    # 例: kube-master-1 にログイン可能かテスト
    ssh root@192.168.100.121
    

    パスワードを聞かれずログインできれば成功です。


3. deployノードで必要パッケージをインストール

AnsibleやPython3などが必要です。例としてUbuntu系の場合:

sudo apt-get update
sudo apt-get install -y python3 python3-pip python3-venv git ansible

CentOS / RockyLinux系の場合は yum または dnf を使って同様にインストールしてください。


4. Kubesprayを取得

cd ~
git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
#venvを使用します
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt

要件に応じて、git checkout <タグ> で特定バージョンを使用することもできます。


5. インベントリファイル (inventory.ini) の作成・編集

サンプルをコピーして編集します。
:

cp -rfp inventory/sample inventory/mycluster

inventory/mycluster/inventory.ini を以下のように編集(rootユーザーで接続する設定)。

[all]
kube-master-1 ansible_host=192.168.100.121 ip=192.168.100.121
kube-master-2 ansible_host=192.168.100.122 ip=192.168.100.122
kube-master-3 ansible_host=192.168.100.123 ip=192.168.100.123
kube-worker-1 ansible_host=192.168.100.124 ip=192.168.100.124
kube-worker-2 ansible_host=192.168.100.125 ip=192.168.100.125
kube-worker-3 ansible_host=192.168.100.126 ip=192.168.100.126

[all:vars]
ansible_python_interpreter=/usr/bin/python3
ansible_user=root
ansible_ssh_private_key_file=~/.ssh/id_rsa

[kube_control_plane]
kube-master-1
kube-master-2
kube-master-3

[kube_node]
kube-worker-1
kube-worker-2
kube-worker-3

[etcd]
kube-master-1
kube-master-2
kube-master-3

[calico_rr]

[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr

6. Ansibleの疎通テスト (Ping)

cd ~/kubespray
ansible -i inventory/mycluster/inventory.ini all -m ping

SUCCESSが返ればSSH接続が成功です。

もし「Permission denied」等のエラーが出る場合、rootログインの設定鍵のコピーを再度ご確認ください。


7. Kubernetesクラスター構築

最後にPlaybookを実行してKubernetesクラスターをセットアップします。

ansible-playbook -i inventory/mycluster/inventory.ini \
  --become --become-user=root cluster.yml

処理には数分~十数分程度かかります。途中でエラーが出た場合はログを確認し、SSHやネットワーク設定を再度ご確認ください。

以下のようになっていれば成功です。


8. クラスター動作確認

構築が成功したら、マスターノードまたはdeployノードにインストールされたkubectlでノードの状態を確認します。

kubectl get nodes

全ノードが Ready で表示されていれば正常稼働です。


コラム

  • セキュリティ:今回はrootで実施しましたが一般ユーザー + sudo を利用推奨です
  • ネットワークプラグイン: KubesprayのデフォルトはCalicoです。他のCNI(Flannel, Weave, Cilium等)を利用したい場合はgroup_varsを編集します。
  • HA設定と負荷分散: マスターノードが3VMあるので高可用性構成になっていますが、外部からのアクセスをさせるにはHAProxyとKeepalivedを利用することも検討しましょう。お金があればA10などのアプライアンス型ロードバランサーなども検討できます。クラウド利用であればクラウドのロードバランサーを検討できます。(AWS ELBなど)
  • バージョン固定: 必要に応じてkube_versionやetcd_versionをgroup_varsで指定することができます。

以上が、rootユーザーを使ってKubesprayでKubernetesクラスターを構築する手順でした。

Kubesprayはめんどくさい手を使ったクラスタ構築をとても簡単に終わらせてくれる大変すばらしいツールだと思います。ぜひお試しを!

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