高级选项和配置

本节包含描述您可以运行和管理 RKE2 的不同方式的高级信息。

证书轮换

默认情况下,RKE2 中的证书在 12 个月后过期。

如果证书已过期或在过期前剩余少于 90 天,则在 RKE2 重启时会轮换证书。

证书也可以手动轮换。为此,最好先停止 rke2-server 进程,轮换证书,然后再重新启动该进程:

systemctl stop rke2-server
rke2 certificate rotate
systemctl start rke2-server

要续订代理证书,请在代理节点中重启 rke2-agent。每次代理启动时,代理证书都会被续订。

systemctl restart rke2-agent

也可以通过传递 --service 标志来轮换单个服务,例如:rke2 certificate rotate --service api-server。有关更多详细信息,请参见 证书管理

自动部署清单

/var/lib/rancher/rke2/server/manifests 中找到的任何文件将以类似于 kubectl apply 的方式自动部署到 Kubernetes。

有关使用清单目录部署 Helm 图表的信息,请参阅关于 Helm. 的部分。

配置 containerd

版本门控

RKE2 从 2025 年 2 月的版本开始包含 containerd 2.0:v1.31.6+rke2r1 和 v1.32.2+rke2r1。
请注意,containerd 2.0 更倾向于配置版本 3,而 containerd 1.7 更倾向于配置版本 2。

RKE2 将在 /var/lib/rancher/rke2/agent/etc/containerd/config.toml 为 containerd 生成一个配置文件,使用特定于当前集群和节点配置的值。

对于高级自定义,您可以在同一目录中创建一个 containerd 配置模板:

  • 对于 containerd 2.0,请在 config-v3.toml.tmpl 中放置版本 3 的配置模板。请参阅 containerd 2.0 文档以获取更多信息。

  • 对于 containerd 1.7 及更早版本,请在 config.toml.tmpl 中放置版本 2 配置模板。请参阅 containerd 1.7 文档以获取更多信息。

Containerd 2.0 与之前的配置版本向后兼容,如果未找到 config-v3.toml.tmpl,RKE2 将继续从 config.toml.tmpl 渲染旧版 2 配置。

模板文件使用 text/template 库渲染到 containerd 配置中。请参阅 ContainerdConfigTemplateV3ContainerdConfigTemplatetemplates.go 中的默认模板内容。模板使用 ContainerdConfig 结构作为其点值(数据参数)执行。

基础模板

您可以扩展 RKE2 基础模板,而不是从源代码中复制粘贴完整的标准模板。如果您需要在现有配置的基础上进行构建,并在末尾添加几行,这将非常有用。

#/var/lib/rancher/rke2/agent/etc/containerd/config-v3.toml.tmpl

{{ template "base" . }}

[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.'custom']
  runtime_type = "io.containerd.runc.v2"
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.'custom'.options]
  BinaryName = "/usr/bin/custom-container-runtime"
  SystemdCgroup = true

为了获得最佳效果,请勿仅仅将预渲染的 config.toml 复制到模板中并进行所需的更改。使用基础模板,或提供基于上述默认值的完整模板。

配置 HTTP 代理

如果您在一个仅通过 HTTP 代理具有外部连接的环境中运行 RKE2,您可以在 RKE2 systemd 服务上配置代理设置。这些代理设置将被 RKE2 使用,并传递给嵌入的 containerd 和 kubelet,以及控制平面、etcd 和 kube-proxy 静态 Pod。

将必要的 HTTP_PROXYHTTPS_PROXYNO_PROXY 变量添加到您 systemd 服务的环境文件中,通常是:

  • /etc/default/rke2-server

  • /etc/default/rke2-agent

RKE2 将自动将集群内部 Pod 和服务 IP 范围以及集群 DNS 域添加到 NO_PROXY 条目列表中。您应该确保 Kubernetes 节点本身使用的 IP 地址范围(即节点的公共和私有 IP)包含在 NO_PROXY 列表中,或者节点可以通过代理访问。

HTTP_PROXY=http://your-proxy.example.com:8888
HTTPS_PROXY=http://your-proxy.example.com:8888
NO_PROXY=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16

如果您希望为 containerd 配置代理设置而不影响 RKE2 和 Kubelet,您可以在变量前加上 CONTAINERD_

CONTAINERD_HTTP_PROXY=http://your-proxy.example.com:8888
CONTAINERD_HTTPS_PROXY=http://your-proxy.example.com:8888
CONTAINERD_NO_PROXY=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16

节点标签和污点

RKE2 代理可以使用选项 node-labelnode-taint 进行配置,这将为 kubelet 添加标签和污点。这两个选项仅在注册时添加标签和/或污点,并且只能添加一次,之后不能通过 rke2 命令删除。

如果您想在节点注册后更改节点标签和污点,您应该使用 kubectl。有关如何添加 污点节点标签 的详细信息,请参阅官方 Kubernetes 文档。

代理节点注册的工作原理

代理节点通过 rke2 agent 进程发起的 websocket 连接进行注册,连接由作为代理进程一部分运行的客户端负载均衡器维护。

代理使用加入词元的集群秘密部分以及一个随机生成的节点特定密码向服务器注册,该密码存储在 /etc/rancher/node/password 的代理上。服务器将把单个节点的密码存储为 Kubernetes 秘密,任何后续尝试必须使用相同的密码。节点密码秘密存储在 kube-system 名称空间中,名称使用模板 <host>.node-password.rke2。当相应的 Kubernetes 节点被删除时,这些秘密将被删除。

如果代理的 /etc/rancher/node 目录被删除,则应在启动之前为代理重新创建密码文件,或者从服务器或 Kubernetes 集群中删除该条目(具体取决于 RKE2 版本)。

使用安装脚本启动服务器

安装脚本提供了 systemd 的单元,但默认情况下不启用或启动服务。

在使用 systemd 运行时,日志将创建在 /var/log/syslog 中,并使用 journalctl -u rke2-serverjournalctl -u rke2-agent 查看。

使用安装脚本安装的示例:

curl -sfL https://get.rke2.io | sh -
systemctl enable rke2-server
systemctl start rke2-server

禁用服务器图表

在集群引导期间部署的与 rke2 捆绑的服务器图表可以被禁用并替换为其他选项。一个常见的用例是用替代品替换捆绑的 rke2-ingress-nginx 图表。

要禁用任何捆绑的系统图表,请在引导之前在配置文件中设置 disable 参数。禁用所有可用系统图表的示例是:

# /etc/rancher/rke2/config.yaml
disable:
  - rke2-coredns
  - rke2-ingress-nginx
  - rke2-metrics-server
  - rke2-snapshot-controller
  - rke2-snapshot-controller-crd
  - rke2-snapshot-validation-webhook

集群操作员有责任确保组件被小心地禁用或替换,因为服务器图表在集群可操作性中扮演着重要角色。 有关集群中各个系统图表角色的更多信息,请参阅 架构概述

在分类的 AWS 区域或具有自定义 AWS API 端点的网络上的安装

在公共 AWS 区域,为确保 RKE2 具备云功能,并能够自动配置某些云资源,请配置 RKE2:

# /etc/rancher/rke2/config.yaml
cloud-provider-name: aws

在分类区域(如 SC2S 或 C2S)上安装 RKE2 时,需要注意一些额外的前提条件,以确保 RKE2 知道如何以及在哪里安全地与适当的 AWS 端点通信:

  1. 确保满足所有常见的 AWS 云提供商 前提条件。这些与区域无关,并且始终是必需的。

  2. 通过创建 cloud.conf 文件,确保 RKE2 知道将 API 请求发送到 ec2elasticloadbalancing 服务,以下是 us-iso-east-1(C2S)区域的示例:

    # /etc/rancher/rke2/cloud.conf
    [Global]
    [ServiceOverride "ec2"]
      Service=ec2
      Region=us-iso-east-1
      URL=https://ec2.us-iso-east-1.c2s.ic.gov
      SigningRegion=us-iso-east-1
    [ServiceOverride "elasticloadbalancing"]
      Service=elasticloadbalancing
      Region=us-iso-east-1
      URL=https://elasticloadbalancing.us-iso-east-1.c2s.ic.gov
      SigningRegion=us-iso-east-1

    或者,如果您使用 私有 AWS 端点,请确保为每个私有端点使用适当的 URL

  3. 确保适当的 AWS CA 包已加载到系统的 root CA 信任存储中。 这可能已经根据您使用的 AMI 为您完成。

    # on CentOS/RHEL 7/8
    cp <ca.pem> /etc/pki/ca-trust/source/anchors/
    update-ca-trust
  4. 配置 RKE2 使用步骤 1 中创建的自定义 cloud.confaws 云提供商:

    # /etc/rancher/rke2/config.yaml
    ...
    cloud-provider-name: aws
    cloud-provider-config: "/etc/rancher/rke2/cloud.conf"
    ...
  5. 正常安装 RKE2(很可能是在 隔离 的情况下)。

  6. 通过确认集群节点标签上存在 AWS 元数据来验证安装成功,使用 kubectl get nodes --show-labels

控制平面组件资源请求/限制

在 RKE2 的 server 子命令下可用以下选项。这些选项允许为 RKE2 中的控制平面组件指定 CPU 请求和限制。

   --control-plane-resource-requests value       (components) Control Plane resource requests [$RKE2_CONTROL_PLANE_RESOURCE_REQUESTS]
   --control-plane-resource-limits value         (components) Control Plane resource limits [$RKE2_CONTROL_PLANE_RESOURCE_LIMITS]

值是一个以逗号分隔的 [controlplane-component]-(cpu|memory)=[desired-value] 列表。controlplane-component 的可能值为:

kube-apiserver
kube-scheduler
kube-controller-manager
kube-proxy
etcd
cloud-controller-manager

因此,示例配置的值可能如下所示:

# /etc/rancher/rke2/config.yaml
control-plane-resource-requests:
  - kube-apiserver-cpu=500m
  - kube-apiserver-memory=512M
  - kube-scheduler-cpu=250m
  - kube-scheduler-memory=512M
  - etcd-cpu=1000m

CPU/内存的单位值与 Kubernetes 资源单位相同(见: Kubernetes 中的资源限制)。

额外的控制平面组件卷挂载

在 RKE2 的 server 子命令下可用以下选项。这些选项指定将节点文件系统中的目录挂载到与前缀名称对应的静态 Pod 组件中。

标志 环境变量

kube-apiserver-extra-mount

RKE2_KUBE_APISERVER_EXTRA_MOUNT

kube-apiserver 额外卷挂载

kube-scheduler-extra-mount

RKE2_KUBE_SCHEDULER_EXTRA_MOUNT

kube-scheduler 额外卷挂载

kube-controller-manager-extra-mount

RKE2_KUBE_CONTROLLER_MANAGER_EXTRA_MOUNT

kube-proxy-extra-mount

RKE2_KUBE_PROXY_EXTRA_MOUNT

etcd 额外挂载

RKE2_ETCD_EXTRA_MOUNT

cloud-controller-manager-extra-mount

RKE2_CLOUD_CONTROLLER_MANAGER_EXTRA_MOUNT

可读写主机路径卷挂载

/source/volume/path/on/host:/destination/volume/path/in/staticpod

只读主机路径卷挂载

为了将卷挂载为只读,请在卷挂载的末尾添加 :ro/source/volume/path/on/host:/destination/volume/path/in/staticpod:ro

可以通过在配置文件中将标志值作为数组传递,为同一组件指定多个卷挂载。

版本门控

在 2024 年 4 月之前的版本(v1.27.13+rke2r1,v1.28.9+rke2r1,v1.29.4+rke2r1)中,仅可以挂载目录。

# /etc/rancher/rke2/config.yaml
kube-apiserver-extra-mount:
   - "/tmp/foo:/root/foo"
   - "/tmp/bar.txt:/etc/bar.txt:ro"

额外的控制平面组件环境变量

在 RKE2 的 server 子命令下可用以下配置选项。这些选项以标准格式指定额外的环境变量,即 KEY=VALUE,用于与前缀名称对应的静态 Pod 组件。

标志 环境变量

kube-apiserver-extra-env

RKE2_KUBE_APISERVER_EXTRA_ENV

kube-scheduler-extra-env

RKE2_KUBE_SCHEDULER_EXTRA_ENV

kube-controller-manager-extra-env

RKE2_KUBE_CONTROLLER_MANAGER_EXTRA_ENV

kube-proxy-extra-env

RKE2_KUBE_PROXY_EXTRA_ENV

etcd-extra-env

RKE2_ETCD_EXTRA_ENV

cloud-controller-manager-extra-env

RKE2_CLOUD_CONTROLLER_MANAGER_EXTRA_ENV

可以通过在配置文件中将标志值作为数组传递,为同一组件指定多个环境变量。

# /etc/rancher/rke2/config.yaml
kube-apiserver-extra-env:
  - "MY_FOO=FOO"
  - "MY_BAR=BAR"
kube-scheduler-extra-env: "TZ=America/Los_Angeles"