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ユーザーを使用し、公開鍵認証によりパスワードレスで接続できるようにします。
構築の大まかな流れ
- 各ノードでSSHをrootログインできるよう設定(PermitRootLogin yesなど)
- deployノードへ必要ツール(Ansible, Python3, Gitなど)をインストール
- Kubesprayのダウンロードと依存パッケージのインストール
- Inventoryファイル(hosts.iniまたはinventory.ini)を作成し、rootユーザーでの接続を設定
- SSH接続テスト (ansible -m ping)
- Ansible PlaybookでKubernetesクラスターを構築
- クラスターの動作確認
1. 各ノードでrootログインを許可する
まず、マスター・ワーカーの各ノードでSSHサーバー設定を確認します。
# 例: vim /etc/ssh/sshd_config で最下部にコピペ PermitRootLogin yes # もしパスワード認証を許可するなら PasswordAuthentication yes
設定を変更したらSSHデーモンを再起動します。
sudo systemctl restart sshd
2. rootユーザーで公開鍵認証を設定
- deployノードで鍵を準備する
# deployノードで鍵を作成(未作成の場合) ssh-keygen -t rsa -b 4096 # id_rsa(秘密鍵)と id_rsa.pub(公開鍵)ができる
- 公開鍵をコピーして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
に公開鍵が登録されます。 - 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はめんどくさい手を使ったクラスタ構築をとても簡単に終わらせてくれる大変すばらしいツールだと思います。ぜひお試しを!