lablabs.rke2

RKE2 Ansible角色

角色版本 角色下载 GitHub Actions 许可证

这个Ansible角色将部署RKE2 Kubernetes集群。RKE2将使用tarball方法安装。

该角色可以以三种模式安装RKE2:

  • RKE2单节点

  • RKE2集群,包含一个服务器(主)节点和一个或多个代理(工作)节点

  • RKE2集群,服务器(主)节点以高可用模式运行,且可以有零个或多个代理(工作)节点。在高可用模式下,您应该有一个奇数数量(建议三个)的服务器(主)节点来运行etcd、Kubernetes API(Keepalived VIP或Kube-VIP地址)和其他控制平面服务。


  • 此外,还可以使用本地工件在隔离功能下安装RKE2集群(所有三种模式)。

可以通过更改rke2_version变量并重新运行此角色的剧本来升级RKE2。在升级过程中,节点上的RKE2服务将逐个重启。Ansible角色将检查服务被重启的节点是否处于就绪状态,只有在确认该节点就绪后,才会继续重启其他Kubernetes节点上的服务。

要求

  • Ansible 2.10+

测试环境

  • 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负载均衡器和集群VIP
# rke2_ha_mode_keepalived需要为false
rke2_ha_mode_kubevip: false

# Kubernetes API和RKE2注册IP地址。默认地址是服务器/主节点的IPv4地址。
# 在高可用模式下选择一个静态IP,这将设置为keepalived中的VIP。
# 或者如果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内核模块的控制平面四层负载均衡
# 必须使用kube-vip版本0.4.0或更高版本

rke2_kubevip_service_election_enable: true
# 默认情况下,ARP模式提供VIP的高可用性实现(您的服务IP地址),流量将接收kube-vip领导者。
# 为了规避这一点,kube-vip实现了一个新功能,即“每个服务的领导者选举”,
# 不是一个节点成为所有服务的领导者,而是在所有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
# 例如,Rancher中国镜像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

# 额外组件的tarball镜像从rke2_airgap_copy_sourcepath复制到节点
#(列表中的文件扩展名和实际文件必须保留)
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安装期间创建的静态Pod的路径
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快照文件名。
# 当指定文件名时,将在初始部署Ansible运行时恢复etcd。
# 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之前使用“cis-1.6”的话)
rke2_cis_profile: ""

# 下载Kubernetes配置文件到Ansible控制器
rke2_download_kubeconf: false

# 将下载到Ansible控制器的Kubernetes配置文件名称
rke2_download_kubeconf_file_name: rke2.yaml

# 将下载Kubernetes配置文件到Ansible控制器的目标目录
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 }}"  # 例如:(agent/networking)要为节点宣传的IPv4/IPv6地址

# (可选)额外的RKE2代理配置选项
# 您可以在https://docs.rke2.io/reference/linux_agent_config找到标志
# rke2_agent_options:
#   - "option: value"
#   - "node-ip: {{ rke2_bind_address }}"  # 例如:(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"

# (可选)通过HelmChartConfig配置nginx: 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_drain_node_during_upgrade: false

# 在滚动重启期间,等待所有Pod在rke2服务重启后准备就绪。
rke2_wait_for_all_pods_to_be_ready: false

# 启用调试模式(rke2服务)
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 }}"

# 为Pods使用的网络,默认设置为'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

这个剧本将在一个服务器(主)和多个代理(工作)节点的集群上部署RKE2。

- name: 部署RKE2
  hosts: all
  become: yes
  roles:
     - role: lablabs.rke2

这个剧本将在隔离模式下的集群中部署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,并设置VIP地址以使Kubernetes API可达。同时,它还将把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-serverrke2-agent)已被重启,以确保进程使用新值。

故障排除

剧本在启动代理上的RKE2服务时陷入停滞

如果剧本在“启动其余节点上的RKE2服务”任务处开始挂起,然后在“等待其余节点准备就绪”任务时失败,则可能是节点网络上存在某些限制。

请检查所需的RKE2服务器节点入站规则,链接如下:https://docs.rke2.io/install/requirements/#networking

许可证

MIT

作者信息

由Labyrinth Labs于2021年创建

关于项目

This Ansible Role will deploy Rancher RKE2 Kubernetes

安装
ansible-galaxy install lablabs.rke2
许可证
mit
下载
776.7k
拥有者