lablabs.rke2

RKE2 Ansibleロール

ロールバージョン ロールダウンロード数 GitHubアクション ライセンス

このAnsibleロールはRKE2 Kubernetesクラスターをデプロイします。RKE2はtarballメソッドを使用してインストールされます。

このロールはRKE2を3つのモードでインストールできます:

  • RKE2シングルノード
  • RKE2クラスター(1つのサーバー(マスター)ノードと1つ以上のエージェント(ワーカー)ノード)
  • RKE2クラスター(高可用性モードのサーバー(マスター)で0またはそれ以上のエージェント(ワーカー)ノード)です。HAモードでは、etcd、Kubernetes API(Keepalived VIPまたはKube-VIPアドレス)、その他の制御プレーンサービスを実行する奇数個(推奨は3)のサーバー(マスター)ノードが必要です。

  • さらに、ローカルアーティファクトを使用してすべての3つのモードでRKE2クラスターをエアギャップ機能でインストールすることも可能です。

rke2_version変数を変更し、このロールを使用してplaybookを再実行することでRKE2をアップグレードできます。アップグレードプロセス中、ノード上のRKE2サービスは1つずつ再起動されます。Ansibleロールは、サービスが再起動されたノードがReady状態であるかどうかを確認し、その後に他のKubernetesノードでサービスを再起動します。

要件

  • Ansible 2.10以上

テスト済みOS

  • Rocky Linux 9
  • Ubuntu 24.04 LTS

ロール変数

これはdefaults/main.ymlのコピーです。

---
# ノードタイプ - サーバーまたはエージェント
rke2_type: server

# HAモードで制御プレーンをデプロイ
rke2_ha_mode: false

# サーバーノードにKeepalivedをインストールおよび構成
# 事前に構成されたロードバランサーを使用している場合は無効にできます
rke2_ha_mode_keepalived: true

# クラスタ用にkube-vip LBとVIPをインストールおよび構成
# rke2_ha_mode_keepalivedを無効にする必要があります
rke2_ha_mode_kubevip: false

# Kubernetes APIおよびRKE2登録用のIPアドレス。デフォルトアドレスはサーバー/マスターノードのIPv4です。
# HAモードでは、keepalivedのVIPとして設定される静的IPを選択してください。
# あるいは、keepalivedが無効な場合のロードバランサーのIPアドレスを使用します。
rke2_api_ip: "{{ hostvars[groups[rke2_servers_group_name].0]['ansible_default_ipv4']['address'] }}"

# RKE2サーバーが9345ポートでプライベートIPアドレスでリッスンするオプション
# rke2_api_private_ip:

# kubevip IPサブネットのオプション
# rke2_api_cidr: 24

# kubevipのオプション
# rke2_interface: eth0
# ノードに宣伝するIPv4/IPv6アドレスのオプション
# rke2_bind_address: "{{ hostvars[inventory_hostname]['ansible_' + rke2_interface]['ipv4']['address'] }}"

# kubevipロードバランサーのIP範囲
rke2_loadbalancer_ip_range: {}
#  range-global: 192.168.1.50-192.168.1.100
#  cidr-finance: 192.168.0.220/29,192.168.0.230/29

# rke2_ha_mode_kubevipがtrueの場合、kubevipクラウドプロバイダーをインストールします
rke2_kubevip_cloud_provider_enable: true

# kube-vipがLoadBalancerタイプのサービスを監視できるようにする
rke2_kubevip_svc_enable: true

# kube-vipコンテナで使用されるイメージを指定
rke2_kubevip_image: ghcr.io/kube-vip/kube-vip:v0.6.4

# kube-vipクラウドプロバイダーコンテナで使用されるイメージを指定
rke2_kubevip_cloud_provider_image: ghcr.io/kube-vip/kube-vip-cloud-provider:v0.0.4

# 制御プレーン用のkube-vip IPVSロードバランサーを有効にする
rke2_kubevip_ipvs_lb_enable: false

# IPVSカーネルモジュールを使用して制御プレーンのレイヤー4ロードバランシングを有効にする
# kube-vipバージョン0.4.0以降を使用する必要があります

rke2_kubevip_service_election_enable: true

# デフォルトでは、ARPモードはVIP(サービスIPアドレス)のHA実装を提供し、それがkube-vipリーダーでトラフィックを受け取ります。
# これを回避するために、kube-vipは「サービスごとのリーダー選出」という新しい機能を実装しました。
# すべてのサービスに対して1つのノードがリーダーとなるのではなく、すべてのkube-vipインスタンスで選挙が行われ、選挙のリーダーがそのサービスのホルダーになります。
# 最終的には、理論的には、各サービスは作成時に異なるノードに分散できるため、初期展開でのボトルネックを防ぐことができます。
# kube-vipバージョン0.5.0以上が必要です

# (オプション) kube-vipフラグのリスト
# すべてのフラグはここにあります https://kube-vip.io/docs/installation/flags/
# rke2_kubevip_args: []
# - param: lb_enable
#   value: true
# - param: lb_port
#   value: 6443

# kube-vipのPrometheusメトリックポート
rke2_kubevip_metrics_port: 2112

# k8s API TLS証明書に追加のSANを追加
rke2_additional_sans: []

# クラスターのドメインを構成
# rke2_cluster_domain: cluster.example.net

# APIサーバーの宛先ポート
rke2_apiserver_dest_port: 6443

# サーバーノードの汚染
rke2_server_node_taints: []
  # - 'CriticalAddonsOnly=true:NoExecute'

# エージェントノードの汚染
rke2_agent_node_taints: []

# クラスターに接続する際、他のサーバーまたはエージェントノードが登録するための事前共有シークレットトークン
rke2_token: defaultSecret12345

# RKE2のバージョン
rke2_version: v1.25.3+rke2r1

# RKE2リポジトリのURL
rke2_channel_url: https://update.rke2.io/v1-release/channels

# RKE2インストール用のbashスクリプトのURL
# 例: ランチャーの中国ミラー http://rancher-mirror.rancher.cn/rke2/install.sh
rke2_install_bash_url: https://get.rke2.io

# RKE2用のローカルデータディレクトリ
rke2_data_path: /var/lib/rancher/rke2

# アーティファクトを取得するためのデフォルトのURL
rke2_artifact_url: https://github.com/rancher/rke2/releases/download/

# アーティファクトを保存するためのローカルパス
rke2_artifact_path: /rke2/artifact

# エアギャップに必要なアーティファクト
rke2_artifact:
  - sha256sum-{{ rke2_architecture }}.txt
  - rke2.linux-{{ rke2_architecture }}.tar.gz
  - rke2-images.linux-{{ rke2_architecture }}.tar.zst

# デプロイ戦略をローカルアーティファクトに基づいてインストールに変更
rke2_airgap_mode: false

# エアギャップの実装タイプ - ダウンロード、コピーまたは存在
# - 'download'は各ノードでアーティファクトを取得します。
# - 'copy'は'rke2_artifact'にあるローカルファイルをノードに転送します。
# - 'exists'は'rke2_artifact'ファイルがすでに'rke2_artifact_path'に保存されていることを前提とします。
rke2_airgap_implementation: download

# アーティファクトが保存されているローカルのソースパス
rke2_airgap_copy_sourcepath: local_artifacts

# rke2_airgap_copy_sourcepathからノードにコピーされる追加コンポーネントのtarballイメージ
# (リスト内のファイル拡張子と実際のファイルには一致が必要です)
rke2_airgap_copy_additional_tarballs: []

# エアギャップ追加イメージのtarballsの宛先 (https://docs.rke2.io/install/airgap/#tarball-methodを参照)
rke2_tarball_images_path: "{{ rke2_data_path }}/agent/images"

# ダウンロードするアーキテクチャ、現在amd64およびs390xのリリースがあります
rke2_architecture: amd64

# RKE2インストールスクリプトの宛先ディレクトリ
rke2_install_script_dir: /var/tmp

# RKE2チャネル
rke2_channel: stable

# コンポーネントをパッケージとしてデプロイせず、すでにデプロイされたコンポーネントを削除します
# 有効なアイテム: rke2-canal, rke2-coredns, rke2-ingress-nginx, rke2-metrics-server
rke2_disable:

# kube-proxyを無効にするオプション
disable_kube_proxy: false

# 主にオンプレミス用のビルトインクラウドコントローラーを無効にするオプション
rke2_disable_cloud_controller: false

# クラスタで使用するクラウドプロバイダー(aws、azure、gce、openstack、vsphere、external)
# rke2_disable_cloud_controllerがtrueの場合のみ適用されます
rke2_cloud_provider_name: "external"

# RKE2インストール中にデプロイされるカスタムマニフェストのパス
# マニフェスト内でJinja2テンプレートを使用することが可能です
rke2_custom_manifests:

# RKE2インストール中にデプロイされる静的ポッドのパス
rke2_static_pods:

# カスタムContainerdレジストリを設定
rke2_custom_registry_mirrors: []
  # - name:
  #   endpoint: {}
#   rewrite: '"^rancher/(.*)": "mirrorproject/rancher-images/$1"'

# カスタムContainerdレジストリの追加設定を行う
rke2_custom_registry_configs: []
#   - endpoint:
#     config:

# Containerレジストリ設定ファイルのテンプレートのパス
rke2_custom_registry_path: templates/registries.yaml.j2

# RKE2設定ファイルのテンプレートのパス
rke2_config: templates/config.yaml.j2

# Etcdスナップショット元ディレクトリ
rke2_etcd_snapshot_source_dir: etcd_snapshots

# Etcdスナップショットファイル名。
# ファイル名が定義されている場合、etcdは最初のデプロイAnsible実行時に復元されます。
# Etcdは初期実行中のみ復元されるため、ファイル名を指定しても次回以降の実行ではetcdは変更されません。
# これを使用するか、`rke2_etcd_snapshot_s3_options`のオプションを設定できます。
rke2_etcd_snapshot_file:

# Etcdスナップショットの保存先
rke2_etcd_snapshot_destination_dir: "{{ rke2_data_path }}/server/db/snapshots"

# EtcdスナップショットのS3オプション
# これらのすべての値または`rke2_etcd_snapshot_file`と`rke2_etcd_snapshot_source_dir`を設定してください。

# rke2_etcd_snapshot_s3_options:
  # s3_endpoint: "" # 必須
  # access_key: "" # 必須
  # secret_key: "" # 必須
  # bucket: "" # 必須
  # snapshot_name: "" # 必須
  # skip_ssl_verify: false # オプション
  # endpoint_ca: "" # オプション。デフォルトを使用する場合は省略可能
  # region: "" # オプション - デフォルトはus-east-1
  # folder: "" # オプション - デフォルトはバケットのトップレベル
# デフォルトのcontainerdスナップショッターを上書き
rke2_snapshooter: overlayfs

# デフォルトCNI canalでRKE2をデプロイ
rke2_cni: canal

# 選択したベンチマークに対してシステム設定を検証します
# (サポートされている値は "cis-1.23" またはRKE2のバージョン1.25以前の "cis-1.6" です)
rke2_cis_profile: ""

# AnsibleコントローラーにKubernetes設定ファイルをダウンロードする
rke2_download_kubeconf: false

# AnsibleコントローラーにダウンロードするKubernetes設定ファイルの名前
rke2_download_kubeconf_file_name: rke2.yaml

# AnsibleコントローラーにKubernetes設定ファイルをダウンロードする宛先ディレクトリ
rke2_download_kubeconf_path: /tmp

# RKE2クラスターのデフォルトのAnsibleインベントリグループ名
rke2_cluster_group_name: k8s_cluster

# RKE2サーバーのデフォルトのAnsibleインベントリグループ名
rke2_servers_group_name: masters

# RKE2エージェントのデフォルトのAnsibleインベントリグループ名
rke2_agents_group_name: workers

# (オプション) Kubernetes APIサーバーフラグのリスト
# すべてのフラグはここにあります https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver
# rke2_kube_apiserver_args: []

# (オプション) ノードラベルのリスト
# k8s_node_label: []

# (オプション) 追加のRKE2サーバー設定オプション
# フラグはhttps://docs.rke2.io/reference/server_configで見つけられます。
# rke2_server_options:
#   - "option: value"
#   - "node-ip: {{ rke2_bind_address }}"  # ex: (agent/networking) ノードのIPv4/IPv6アドレス

# (オプション) 追加のRKE2エージェント設定オプション
# フラグはhttps://docs.rke2.io/reference/linux_agent_configで見つけられます。
# rke2_agent_options:
#   - "option: value"
#   - "node-ip: {{ rke2_bind_address }}"  # ex: (agent/networking) ノードのIPv4/IPv6アドレス

# (オプション) プロキシを設定
# すべてのフラグはここにあります https://docs.rke2.io/advanced#configuring-an-http-proxy
# rke2_environment_options: []
#   - "option=value"
#   - "HTTP_PROXY=http://your-proxy.example.com:8888"

# (オプション) デフォルトのkube-controller-manager引数をカスタマイズ
# この機能は、引数がデフォルトで存在しない場合は追加し、すでに存在する場合は置き換えます。
# rke2_kube_controller_manager_arg:
#   - "bind-address=0.0.0.0"

# (オプション) デフォルトのkube-scheduler引数をカスタマイズ
# この機能は、引数がデフォルトで存在しない場合は追加し、すでに存在する場合は置き換えます。
# rke2_kube_scheduler_arg:
#   - "bind-address=0.0.0.0"

# (オプション) nginxをHelmChartConfig経由で設定: https://docs.rke2.io/networking/networking_services#nginx-ingress-controller
# rke2_ingress_nginx_values:
#   controller:
#     config:
#       use-forwarded-headers: "true"
rke2_ingress_nginx_values: {}

# アップグレード中にノードをコルドンし、排出する。RKE2がアップグレードされたらノードのコルドンを解除。
rke2_drain_node_during_upgrade: false

# ローリング再起動中にrke2サービス再起動後、すべてのポッドが準備完了になるまで待機します。
rke2_wait_for_all_pods_to_be_ready: false

# デバッグモードを有効にする(rke2-service)
rke2_debug: false

# (オプション) デフォルトのkubelet引数をカスタマイズ
# rke2_kubelet_arg:
#   - "--system-reserved=cpu=100m,memory=100Mi"

# (オプション) デフォルトのkube-proxy引数をカスタマイズ
# rke2_kube_proxy_arg:
#   - "proxy-mode=ipvs"

# ノード名設定項目の値
rke2_node_name: "{{ inventory_hostname }}"

# ポッド用に使用されるネットワーク。デフォルトで'10.42.0.0/16'に設定されています。
rke2_cluster_cidr:
  - 10.42.0.0/16

# ClusterIPサービス用に使用されるネットワーク。デフォルトで'10.43.0.0/16'に設定されています。
rke2_service_cidr:
  - 10.43.0.0/16

インベントリファイルの例

このロールは、ノードをmastersworkersのインベントリグループに分配します。 RKE2 Kubernetesマスター/サーバーノードはmastersグループに、ワーカー/エージェントノードはworkersグループのメンバーである必要があります。両方のグループはk8s_clusterグループの子となる必要があります。

[masters]
master-01 ansible_host=192.168.123.1 rke2_type=server
master-02 ansible_host=192.168.123.2 rke2_type=server
master-03 ansible_host=192.168.123.3 rke2_type=server

[workers]
worker-01 ansible_host=192.168.123.11 rke2_type=agent
worker-02 ansible_host=192.168.123.12 rke2_type=agent
worker-03 ansible_host=192.168.123.13 rke2_type=agent

[k8s_cluster:children]
masters
workers

プレイブックの例

このプレイブックは、サーバーとエージェントの両方として機能する単一ノードにRKE2をデプロイします。

- name: RKE2をデプロイ
  hosts: node
  become: yes
  roles:
     - role: lablabs.rke2

このプレイブックは、1つのサーバー(マスター)といくつかのエージェント(ワーカー)ノードを持つクラスターにRKE2をデプロイします。

- name: RKE2をデプロイ
  hosts: all
  become: yes
  roles:
     - role: lablabs.rke2

このプレイブックは、エアギャップモードで1つのサーバー(マスター)といくつかのエージェントノードを持つクラスターにRKE2をデプロイします。MultusとCalicoをCNIとして使用します。

- name: RKE2をデプロイ
  hosts: all
  become: yes
  vars:
    rke2_airgap_mode: true
    rke2_airgap_implementation: download
    rke2_cni:
      - multus
      - calico
    rke2_artifact:
      - sha256sum-{{ rke2_architecture }}.txt
      - rke2.linux-{{ rke2_architecture }}.tar.gz
      - rke2-images.linux-{{ rke2_architecture }}.tar.zst
    rke2_airgap_copy_additional_tarballs:
      - rke2-images-multus.linux-{{ rke2_architecture }}
      - rke2-images-calico.linux-{{ rke2_architecture }}
  roles:
     - role: lablabs.rke2

このプレイブックは、HAサーバー(マスター)コントロールプレーンといくつかのエージェント(ワーカー)ノードを持つクラスターにRKE2をデプロイします。サーバー(マスター)ノードには汚染が施され、ワークロードはエージェントノードのみに分散されます。このロールは、コントロールプレーンノードにKeepalivedをインストールし、Kubernetes APIに到達可能なVIPアドレスを設定します。また、Kubernetes設定ファイルをローカルマシンにダウンロードします。

- name: RKE2をデプロイ
  hosts: all
  become: yes
  vars:
    rke2_ha_mode: true
    rke2_api_ip : 192.168.123.100
    rke2_download_kubeconf: true
    rke2_server_node_taints:
      - 'CriticalAddonsOnly=true:NoExecute'
  roles:
     - role: lablabs.rke2

エージェントノード用の別々のトークンを持つ

サーバー設定のドキュメントに従い、エージェントノードがクラスターに接続するために使用されるエージェントトークンを定義することが可能であり、これによりサーバーノードよりもクラスターへのアクセスが制限されます。 上記の設定に必要な変更は次の通りです:

  • グローバル変数からrke2_tokenを削除します。
  • group_vars/masters.ymlに追加します:
rke2_token: defaultSecret12345
rke2_agent_token: agentSecret54321
  • group_vars/workers.ymlに追加します:
rke2_token: agentSecret54321

サーバートークンの変更は問題がありますが、エージェントトークンは自由にローテーションできます。サーバーとエージェントが同じ値を持っている限り、サービス(適切にrke2-serverおよびrke2-agent)が再起動されることで新しい値が使用されるようになります。

トラブルシューティング

エージェントでRKE2サービスを開始中にプレイブックが詰まる

プレイブックが「残りのノードが準備完了を待機」というタスクでハングし、「RKE2サービスを他のノードで開始」のタスクで失敗する場合は、ノードのネットワークに制限がある可能性があります。

必要なRKE2サーバーノードのインバウンドルールについては、以下のリンクをチェックしてください:https://docs.rke2.io/install/requirements/#networking

ライセンス

MIT

作者情報

2021年にLabyrinth Labsによって作成されました。

プロジェクトについて

This Ansible Role will deploy Rancher RKE2 Kubernetes

インストール
ansible-galaxy install lablabs.rke2
ライセンス
mit
ダウンロード
776.7k
所有者