はじめに
過去に Kubespray で Kubernetes クラスタを構築しているが、kubespray は docker から containerd への移行は正式にサポートされていない(ただし移行方法例の記載はある)
既存クラスタを削除して Containerd のクラスタを再作成したので実施したメモを記載する
(kubespray v2.18.0 でデフォルトが containerd になったので最新バージョン(v2.20.0)であればデフォルトで入れ直せばcontainerdになる)
設定内容は過去の構築やMetalLB実践と同じなので説明や重複箇所はそちらも参照
実行環境
- ESXi
- Version: 7.0u2a
- license: Free
- Network (Server Gateway Router)
- Edgerouter-X (ER-X)
- Version: v2.0.9-hotfix.2
- kubespray サーバ
- OS : Rocky Linux release 9.0 (Blue Onyx)
- Kubernetes ノード
- OS : Ubuntus Ubuntu 22.04.1 LTS
- インストールのみ完了した状態
- 準備方法は 20.04 LTS 時に実施した内容とほぼ同じなので省略 (参照先)
設定 version
- Kubernetes Version
- v1.25.4 (kubespray v2.20.0 default)
- コンテナランタイム
- containerd v1.6.10 (kubespray v2.20.0 default)
- MetalLB
- L3 mode BGP (過去実践記事)
構築
kubespray 実行準備
kubespray (ansible) 実行サーバの環境準備を実施する (Rocky9入れたばかりのサーバを想定)
sudo dnf install git python3 python3-pip sshpass -y
下記 kubespray をダウンロードして必要なモジュール (ansible etc.) を pip3 でインストールする
cd ~
git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
git checkout v2.20.0
pip3 install -r requirements.txt
クラスタ情報 hosts.yaml を作成する (過去記事参照)
cp -rfp inventory/sample inventory/mycluster
vi ~/kubespray/inventory/mycluster/hosts.yaml
下記hosts.yaml例
all:
hosts:
k8smaster01:
ansible_host: 192.168.129.25
ip: 192.168.129.25
access_ip: 192.168.129.25
k8smaster02:
ansible_host: 192.168.129.35
ip: 192.168.129.35
access_ip: 192.168.129.35
k8smaster03:
ansible_host: 192.168.129.26
ip: 192.168.129.26
access_ip: 192.168.129.26
k8sworker01:
ansible_host: 192.168.129.27
ip: 192.168.129.27
access_ip: 192.168.129.27
k8sworker02:
ansible_host: 192.168.129.36
ip: 192.168.129.36
access_ip: 192.168.129.36
k8sworker03:
ansible_host: 192.168.129.37
ip: 192.168.129.37
access_ip: 192.168.129.37
k8scalicorr01:
ansible_host: 192.168.129.28
ip: 192.168.129.28
access_ip: 192.168.129.28
k8scalicorr02:
ansible_host: 192.168.129.38
ip: 192.168.129.38
access_ip: 192.168.129.38
children:
kube-master:
hosts:
k8smaster01:
k8smaster02:
k8smaster03:
kube-node:
hosts:
k8sworker01:
k8sworker02:
k8sworker03:
etcd:
hosts:
k8smaster01:
k8smaster02:
k8smaster03:
k8s-cluster:
children:
kube-master:
kube-node:
calico-rr:
calico-rr:
hosts:
k8scalicorr01:
k8scalicorr02:
rack0:
hosts:
k8scalicorr01:
k8scalicorr02:
k8smaster01:
k8smaster02:
k8smaster03:
k8sworker01:
k8sworker02:
k8sworker03:
vars:
cluster_id: "1.0.0.1"
各ノードの ufw の停止
やssh key 設定
などの事前準備設定を実施する (詳細は過去記事に記載のまま)
MetalLB 設定
MetalLB は addon で入れられる
設定例は下記の通り (MetalLBについてはこちらの記事を参照)
cd ~/kubespray/inventory/mycluster/group_vars/k8s_cluster/
cp -p k8s-cluster.yml k8s-cluster.yml.org
vi k8s-cluster.yml
# configure arp_ignore and arp_announce to avoid answering ARP queries from kube-ipvs0 interface
# must be set to true for MetalLB to work
- kube_proxy_strict_arp: false
+ kube_proxy_strict_arp: true
cp -p addons.yml addons.yml.org
vi addons.yml
L3mode
- metallb_enabled: false
+ metallb_enabled: true
+ metallb_ip_range:
+ - 192.168.131.0/24
+ metallb_protocol: bgp
+ metallb_peers:
+ - peer_address: 192.168.129.254
+ peer_asn: 65001
+ my_asn: 65002
+ metallb_avoid_buggy_ips: true
+ metallb_speaker_tolerations:
+ - key: "node-role.kubernetes.io/control-plane"
+ operator: "Equal"
+ value: ""
+ effect: "NoSchedule"
+ metallb_controller_tolerations:
+ - key: "node-role.kubernetes.io/control-plane"
+ operator: "Equal"
+ value: ""
+ effect: "NoSchedule"
L2mode
- metallb_enabled: false
+ metallb_enabled: true
+ metallb_speaker_enabled: true
+ metallb_avoid_buggy_ips: true
+ metallb_ip_range:
+ - "192.168.129.100-192.168.129.199"
+ metallb_protocol: "layer2"
+ metallb_speaker_tolerations:
+ - key: "node-role.kubernetes.io/control-plane"
+ operator: "Equal"
+ value: ""
+ effect: "NoSchedule"
+ metallb_controller_tolerations:
+ - key: "node-role.kubernetes.io/control-plane"
+ operator: "Equal"
+ value: ""
+ effect: "NoSchedule"
kubespray 実行
必要な設定記載やノード側下準備が完了したので、cluster.yml
を実行してインストールを実施する
cd ~/kubespray
ansible-playbook -i inventory/mycluster/hosts.yaml -K --become --become-user=root cluster.yml
.kube/config 設定の過去記事を参照してローカルサーバに認証情報取得など実施する (今回、k8smaser01など入れ替えのため s
を追加しているのでhostvars
指定箇所はそこだけ修正が必要)
実行サーバから kubectl でアクセスできるようになったことを確認する (kubectl がなければインストールして実施)
$ kubectl get node
NAME STATUS ROLES AGE VERSION
k8scalicorr01 Ready <none> 58m v1.24.6
k8scalicorr02 Ready <none> 58m v1.24.6
k8smaster01 Ready control-plane 61m v1.24.6
k8smaster02 Ready control-plane 60m v1.24.6
k8smaster03 Ready control-plane 60m v1.24.6
k8sworker01 Ready <none> 58m v1.24.6
k8sworker02 Ready <none> 58m v1.24.6
k8sworker03 Ready <none> 58m v1.24.6
上記で構築完了
その他
設定後に MetalLB の設定を変更したい場合は下記タグで対応する
cd ~/kubespray/
ansible-playbook -i inventory/mycluster/hosts.yaml -K --become --become-user=root cluster.yml --tags metallb
まとめ
containerd 対応のため kubespray v2.20.0 でクラスタ再作成を実施した
addon で argocd
や ingress
, ストレージ系などもサポートされているのでそちらも試したい
また、ここで書いた hosts.yaml の記載方法が legacy になっているので、修正を次のタイミングでしたい
追記
このクラスタで LoadbalancerIP へのアクセスがアサイン IP によってうまくいかない事象が発生した
MetalLB を L3/L2 両方で試したが直らず原因も不明だが、
CNI をcalico
-> cilium
へ変更, calicorr
ノードを含めない構成に変更したら問題が解消された
- kube_network_plugin: calico
+ kube_network_plugin: cilium
- kube_proxy_strict_arp: false
+ kube_proxy_strict_arp: true