0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Kubespray での Kubernetes Cluster 構築 (v2.20.0 containerd)

Last updated at Posted at 2022-11-27

はじめに

過去に 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

構築

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例

~/kubespray/inventory/mycluster/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
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

addons.yml
- 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

addons.yml
- 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 で argocdingress, ストレージ系などもサポートされているのでそちらも試したい

また、ここで書いた hosts.yaml の記載方法が legacy になっているので、修正を次のタイミングでしたい

追記

このクラスタで LoadbalancerIP へのアクセスがアサイン IP によってうまくいかない事象が発生した
MetalLB を L3/L2 両方で試したが直らず原因も不明だが、
CNI をcalico -> cilium へ変更, calicorr ノードを含めない構成に変更したら問題が解消された

diff_k8s-cluster.yml_k8s-cluster.yml.org
- kube_network_plugin: calico
+ kube_network_plugin: cilium
- kube_proxy_strict_arp: false
+ kube_proxy_strict_arp: true
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?