lablabs.rke2
RKE2 Ansible角色
这个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
库存文件示例
这个角色依赖于节点分布到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
这个剧本将在一个服务器(主)和多个代理(工作)节点的集群上部署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-server
和rke2-agent
)已被重启,以确保进程使用新值。
故障排除
剧本在启动代理上的RKE2服务时陷入停滞
如果剧本在“启动其余节点上的RKE2服务”任务处开始挂起,然后在“等待其余节点准备就绪”任务时失败,则可能是节点网络上存在某些限制。
请检查所需的RKE2服务器节点入站规则,链接如下:https://docs.rke2.io/install/requirements/#networking。
许可证
MIT
作者信息
由Labyrinth Labs于2021年创建
ansible-galaxy install lablabs.rke2