Hotdry.

Article

K3k 嵌套 Kubernetes 控制平面:架构解析与生产环境参数配置

深入解析 K3k 在 Kubernetes 中运行 K3s 的嵌套集群方案,涵盖 control plane 隔离机制、网络命名空间复用与层级调度原理。

2026-05-02systems

K3k 是 Rancher 推出的开源项目,旨在现有 Kubernetes 集群中创建和管理隔离的 K3s 虚拟集群。这种嵌套架构为多租户环境、CI/CD 管道隔离以及快速实验提供了轻量级解决方案。本文将从控制平面隔离、网络命名空间复用和层级调度三个维度深入解析其架构设计与生产配置要点。

核心架构:两种部署模式对比

K3k 提供两种虚拟集群部署模式,理解两者差异是掌握控制平面隔离机制的关键。

Shared 模式(默认) 采用无代理 K3s 服务器配置,服务器不运行 kubelet、容器运行时或 CNI,而是通过 K3k 专用的 Virtual Kubelet 提供程序将工作负载调度到宿主机集群执行。这种模式下,虚拟集群的控制平面组件(如 API Server、Controller Manager、Scheduler)与宿主机共享底层节点资源,但逻辑上保持独立。

Virtual 模式 则在宿主机集群中以 Pod 形式部署完整的 K3s 集群,包含服务器组件和代理组件。每个虚拟集群拥有独立的控制平面和工作节点,隔离程度更高但资源开销也相应增加。

从控制平面隔离角度看,Shared 模式通过命名空间级别的 ResourceQuota 和 Network Policy 实现逻辑隔离,所有虚拟集群的 Pod 实际上运行在同一个宿主机命名空间中;而 Virtual 模式通过独立的 K3s 服务器 Pod 实现物理隔离,每个虚拟集群的控制平面完全独立运行。

控制平面隔离机制深度解析

在 Shared 模式下,控制平面隔离的核心在于 “无代理服务器” 配置。K3s 服务器启动时添加 --disable-agent 参数后,不会启动 kubelet 和容器运行时,此时服务器仅负责处理 API 请求、运行控制器和调度器。K3k 通过 Virtual Kubelet -provider 将虚拟集群中的 Pod 规范 “翻译” 为宿主集群的 Pod 资源并创建。

这种设计的控制平面隔离实现依赖以下关键机制:

首先,虚拟集群的 API Server 拥有独立的 Etcd 存储,数据通过 K3s 内置的轻量级 Etcd 或 SQLite 存储,与宿主机集群的 Etcd 完全隔离。K3k 在创建虚拟集群时会初始化独立的数据库存储,确保集群状态不相互干扰。

其次,Controller Manager 和 Scheduler 正常运行,能够处理虚拟集群内部的资源调度需求,但实际 Pod 创建请求会被 Virtual Kubelet 拦截并转发到宿主机集群执行。这种 “拦截 - 转发” 机制实现了控制平面的逻辑隔离。

Virtual 模式的隔离更直接 —— 每个虚拟集群运行在独立的 K3s 服务器 Pod 中,拥有完整的控制平面组件。服务器 Pod 通常需要较高权限以访问系统资源,这是因为 Kubernetes 内部组件的运行需求。K3k 官方文档指出,当前 Virtual 模式存在权限提升风险,服务器 Pod 以特权模式运行是出于功能需求而非安全最佳实践。

网络命名空间复用与隔离策略

网络隔离是嵌套 Kubernetes 集群最复杂的技术挑战之一。K3k 针对两种模式采用了截然不同的策略。

Shared 模式下,所有虚拟集群共享宿主机的 CNI 插件和网络命名空间。K3k 利用 Kubernetes Network Policy 实现虚拟集群间的网络隔离 —— 每个虚拟集群的 Pod 被分配唯一的命名标识(包含 Pod 名称、命名空间和集群名称),防止命名冲突。网络策略配置确保不同虚拟集群的 Pod 无法相互通信,也无法访问宿主机集群的 Pod。

配置 Network Policy 时的关键参数包括:podSelector 用于匹配虚拟集群内的 Pod,policyTypes 需要同时包含 Ingress 和 Egress 规则,ingressegress 规则中定义允许的流量模式。建议为每个虚拟集群创建独立的 Network Policy,限制所有入站和出站流量仅允许同一虚拟集群内的通信。

Virtual 模式下,每个虚拟集群运行独立的 CNI 插件,提供完整的网络隔离。虽然这些虚拟网络最终运行在宿主机集群的网络基础设施之上,但配置和流量管理完全独立。这种方式提供了更强的隔离性,但也意味着无法直接利用宿主机集群的网络能力(如 Service 网格集成)。

层级调度机制与资源配置

K3k 的调度采用双层架构:宿主机集群的调度器负责将虚拟集群的控制平面组件(K3s 服务器 Pod 或 Virtual Kubelet Pod)调度到合适的节点;虚拟集群内部的调度器则负责将工作负载 Pod 调度到虚拟节点。

在 Shared 模式下,资源管理通过 Kubernetes 原生的 ResourceQuota 和 LimitRange 实现。由于同一虚拟集群的所有工作负载共享宿主机集群的同一个命名空间,ResourceQuota 限制该命名空间的总资源消耗,LimitRange 为未明确指定资源请求的 Pod 设置默认值。

生产环境中,建议为每个虚拟集群配置以下资源参数:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: k3k-cluster-quota
  namespace: k3k-mycluster
spec:
  hard:
    requests.cpu: "4"
    requests.memory: 8Gi
    limits.cpu: "8"
    limits.memory: 16Gi
    pods: "50"
    services: "10"
---
apiVersion: v1
kind: LimitRange
metadata:
  name: k3k-cluster-limits
  namespace: k3k-mycluster
spec:
  limits:
  - default:
      memory: 512Mi
      cpu: 500m
    defaultRequest:
      memory: 256Mi
      cpu: 250m
    type: Pod

Virtual 模式的资源管理更直接 —— 对虚拟集群所在的 Pod 设置资源限制即可。虚拟集群内的工作负载使用这些预设的资源池:

apiVersion: k3k.io/v1beta1
kind: Cluster
metadata:
  name: mycluster
  namespace: k3k-mycluster
spec:
  virtualCluster:
    serverResources:
      limits:
        cpu: "2"
        memory: 4Gi
      requests:
        cpu: "1"
        memory: 2Gi
    agentResources:
      limits:
        cpu: "2"
        memory: 4Gi
      requests:
        cpu: "1"
        memory: 2Gi

模式选型与安全考量

选择 Shared 或 Virtual 模式需要权衡隔离级别与资源效率。Shared 模式适合对隔离要求不高但需要高资源利用率的场景,如开发测试环境、多租户开发空间。Virtual 模式适合需要强隔离的生产工作负载,或者需要独立控制平面配置的场景。

安全方面,Shared 模式通过 Pod Security Admission 强制执行 Pod 安全标准,建议配置 enforce: baselineenforce: restricted 级别。Network Policy 应默认拒绝所有流量,仅显式开放必要的服务端口。

K3k 项目仍在积极开发中,Virtual 模式的存储支持尚在开发中,GPU 资源隔离也是正在探索的方向。在生产环境中采用前,建议评估具体业务场景的资源隔离需求与运维复杂度。


资料来源:本文技术细节主要参考 K3k 官方 GitHub 仓库及架构文档(https://github.com/rancher/k3k)。

systems