lablabs.rke2
RKE2 Ansibleロール
この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
インベントリファイルの例
このロールは、ノードをmasters
とworkers
のインベントリグループに分配します。
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によって作成されました。
ansible-galaxy install lablabs.rke2