Cilium 术语详解:Labels、Endpoint 与 Identity 如何构成策略执行的基础
Cilium 术语详解Labels、Endpoint 与 Identity 如何构成策略执行的基础【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium本文基于 Cilium 官方文档 terminology.rst 系统梳理 Cilium 中三个最核心的基础概念标签Labels、端点Endpoint和安全身份Identity。理解这三者的定义、相互关系以及集群内的协调机制是读懂 Cilium 网络策略、Hubble 可观测性和故障排查输出的前提读完后你能准确解释k8s:appfrontend这类标签从哪来、reserved:host等特殊身份代表什么以及为什么共享同一组标签的 Pod 会共享同一个集群级唯一的数字身份。1. Labels标签Cilium 寻址与选择资源的基本单位Cilium 中标签是一种通用、灵活且高度可扩展的方式来寻址大量资源因为它允许对资源进行任意分组和集合创建。在 Cilium 中凡是需要被描述、寻址或选择的对象都基于标签来完成Endpoint端点被分配一组标签这些标签来源于 Kubernetes、Cilium 保留身份或其他 Cilium 管理的来源网络策略Network Policy基于标签来选择允许相互通信的 endpoint 对策略自身也通过标签来标识。1.1 标签的结构与匹配规则一个标签是由key键和value值组成的字符串对可以格式化为keyvalue这样的单一字符串key 是必需的且必须唯一。通常使用反向域名reverse domain name的命名习惯来保证唯一性例如io.cilium.mykeymyvaluevalue 是可选的可以省略例如io.cilium.mykeykey 的命名建议只使用字符集[a-z0-9-.]。匹配规则值得注意用标签选择资源时key 和 value 必须同时匹配。例如若策略要应用到所有带标签my.corp.foo的 endpoint则my.corp.foobar不会命中该选择器key 相同但 value 不匹配。标签的核心数据结构位于 pkg/labels/labels.go配套有 pkg/labels/set.go 提供基于集合的匹配能力还有针对 label 的校验逻辑 pkg/labels/validation.go。1.2 Label Source标签来源用前缀避免冲突一个标签可以来自多种来源例如 endpoint 可以从与之关联的 Kubernetes Pod 派生标签。不同来源之间可能使用重叠的 key为避免冲突Cilium 在导入标签时会为所有 label key 加上source:前缀来标明来源例如k8s:rolefrontend。也就是说一个以foo: bar启动的 Kubernetes Pod在 Cilium endpoint 上会表现为标签k8s:foobar。当前支持的标签来源前缀前缀含义k8s:来源于 Kubernetes 的标签reserved:特殊保留标签对应下文的特殊身份unspec:来源未指定的标签在利用标签识别其他资源时选择器中可以显式指定来源来把匹配范围限定到某一类来源如果不提供来源则默认为any:即匹配所有来源的标签若提供了来源则选择器标签与目标标签的来源必须一致。Kubernetes 标签的来源转换在 pkg/labels/k8s.go 中实现。2. Endpoint端点Cilium 网络中可被策略寻址的抽象2.1 端点的定义与独立 IP 的意义Cilium 通过为应用容器分配 IP 地址使其在网络中可用。多个应用容器可以共享同一个 IP 地址——最典型的例子就是 Kubernetes Pod。所有共享同一地址的应用容器被归组为 Cilium 所称的一个endpoint。为每个 endpoint 分配独立 IP 带来一个直接好处endpoint 可以使用完整的四层端口范围。这意味着运行在同一集群节点上的多个应用容器都可以绑定80这类知名端口而互不冲突。关于地址分配Cilium 的默认行为是同时为每个 endpoint 分配 IPv6 和 IPv4 地址也可以通过--enable-ipv4false选项配置为仅分配 IPv6 地址。如果同时分配了两种地址两者都可用于访问该 endpoint策略规则、负载均衡等行为对两个地址一视同仁。2.2 端点标识节点内唯一的 endpoint id出于标识目的Cilium 会为本节点上的所有 endpoint 分配一个内部 endpoint id该 id 仅在单个集群节点范围内唯一。endpoint 的完整生命周期管理创建、恢复、删除由 pkg/endpointmanager 目录下的代码实现。2.3 端点元数据Endpoint Metadataendpoint 会自动从与其关联的工作负载派生元数据这些元数据随后可用于安全策略、负载均衡和路由层面的 endpoint 识别。当前支持的元数据获取机制系统说明KubernetesPod 标签经由 k8s API 获取元数据以标签的形式附加到 endpoint 上。例如一个以appbenchmark启动的 Kubernetes Pod会表现为一个带有标签k8s:appbenchmark的 Cilium endpoint。endpoint 自身的实现与 BPF 程序生成位于 pkg/endpoint 与 pkg/endpointstate。3. Identity身份策略执行与连通性控制的核心抽象3.1 身份是什么所有 endpoint 都会被分配一个identity身份identity 用于在 endpoint 之间强制执行基本的连通性在传统网络术语中相当于三层L3层面的执行。identity 由标签来标识并被赋予一个集群级唯一的数字标识符endpoint 会被分配与自身安全相关标签security relevant labels相匹配的那个 identity——所有共享同一组安全相关标签的 endpoint 共享同一个 identity这一概念让策略执行能够扩展到海量 endpoint随着应用横向扩缩容大量 endpoint 通常会共享相同的一组安全标签策略规则只需针对 identity 计算一次而不必针对每个 endpoint 单独计算。3.2 身份是如何派生的endpoint 的 identity 基于该 endpoint 所代表的 Pod 或工作负载的标签派生。当 Pod 或工作负载启动时Cilium 会收到编排系统发出的事件并据此创建一个 endpoint 将其映射到网络上随后解析该 endpoint 的 identity当 Pod 或工作负载的标签发生变化时identity 会被重新确认并按需自动修改。3.3 Security Relevant Labels安全相关标签并非 Pod 或工作负载上的所有标签对派生 identity 都有意义——标签也可能被用来存储工作负载启动时间这类元数据。因此 Cilium 需要知道哪些标签在派生 identity 时是有意义的用户需要指定一组有意义标签的字符串前缀标准行为是包含所有以id.为前缀的标签例如id.service1、id.service2、id.groupA.service44这组有意义标签的前缀列表在 agent 启动时通过命令行选项指定。3.4 特殊身份Reserved Identities所有受 Cilium 管理的 endpoint 都会被分配一个 identity。为了允许与不受 Cilium 管理的网络端点通信Cilium 定义了特殊的保留身份它们以字符串reserved:为前缀。完整的保留身份表如下身份数字 ID说明reserved:unknown0无法派生 identity 的情况reserved:host1本地主机。任何源自本地主机 IP 或指向本地主机 IP 的流量reserved:world2集群之外的任意网络端点reserved:unmanaged3不受 Cilium 管理的端点例如在 Cilium 安装之前启动的 Kubernetes Podreserved:health4Cilium agent 产生的健康检查流量reserved:init5identity 尚未解析完成的新端点。表示派生安全身份所需的元数据尚不完整的阶段典型如启动引导期。只有当 endpoint 创建时标签未知时才会分配 init 身份reserved:remote-node6所有远程集群主机的集合。任何源自任意已连接集群中本地节点之外的主机 IP 或指向其的流量reserved:kube-apiserver7承载 kube-apiserver 后端的远程节点reserved:ingress8分配给 Ingress 代理用作连接源地址的 IP这些保留身份在源码中集中定义于 pkg/identity/numericidentity.goReservedIdentityHost、ReservedIdentityWorld、ReservedIdentityUnmanaged等常量取自 datapath 层的数字 ID如datapath.IdentityWorldID并且通过 pkg/identity/reserved.go 中的AddReservedIdentity/reservedIdentityCache在包初始化时init()调用iterateReservedIdentityLabels构建数字 ID 到标签的缓存。此外源码中还定义了一组面向策略聚合的保留身份ReservedIdentityAggregateCluster、ReservedIdentityAggregateWorld等注释明确说明它们不会直接应用于流量仅用于策略 map 的聚合参见 pkg/policy/aggregate.go 的用法。3.5 Well-known Identities内置知名身份Cilium 还自动感知一批知名身份well-known identities无需访问 kvstore 等外部依赖即可直接下发安全身份。其目的是允许 Cilium 引导自身在集群中为关键服务提供带策略执行能力的网络连通性而不依赖任何外部组件DeploymentNamespaceServiceAccountCluster Name数字 IDLabelskube-dnskube-systemkube-dnscilium-cluster102k8s-appkube-dnskube-dns (EKS)kube-systemkube-dnscilium-cluster103k8s-appkube-dns、eks.amazonaws.com/componentkube-dnscore-dnskube-systemcorednscilium-cluster104k8s-appkube-dnscore-dns (EKS)kube-systemcorednscilium-cluster106k8s-appkube-dns、eks.amazonaws.com/componentcorednscilium-operatorcilium-namespacecilium-operatorcilium-cluster105namecilium-operator、io.cilium/appoperator注若未通过cluster-name选项定义cilium-cluster默认值会设置为default。源码层面这些知名身份定义在 pkg/identity/numericidentity.go 中以iota 100起始的常量段中ReservedKubeDNS102、ReservedEKSKubeDNS103、ReservedCoreDNS104、ReservedCiliumOperator105、ReservedEKSCoreDNS106等并通过WellKnown.add(...)注册。从源码注释可以推断每个组件实际上有两个identity 变体——第一个用于 Kubernetes 1.21 或NamespaceDefaultLabelNamefeature gate 关闭的场景第二个用于 Kubernetes ≥ 1.21 且该 gate 启用的场景后者额外携带命名空间默认标签。3.6 集群内的 Identity 管理identity 在整个集群范围内有效即使多个 Pod 或容器分布在多个集群节点上只要它们共享与 identity 相关的标签就会解析并共享同一个 identity。这要求集群节点之间进行协调。identity 的解析借助分布式键值存储完成该存储支持若此值此前从未出现过则生成一个新的唯一标识符这样的原子操作。每个集群节点据此构造 identity 相关的标签子集并查询键值存储来派生 identity若这组标签此前未被查询过则创建新 identity否则返回首次查询时创建的 identity。从源码结构看identity 的缓存、分配与集群同步逻辑分布在 pkg/identity/cacheidentity 缓存与分配器与 pkg/identity/identitymanager集群级管理两个包中。4. Node节点与 Node Address4.1 节点的定义Cilium 将节点定义为集群中的一个独立成员。每个节点都必须运行cilium-agent并以近乎自治的方式工作。为保持简单和可扩展性不同节点上 Cilium agent 之间的状态同步被压缩到最少且仅通过 Key-Value 存储或数据包元数据进行。4.2 节点地址检测Cilium 会自动检测节点的 IPv4 和 IPv6 地址。检测到的节点地址会在cilium-agent启动时打印出来Local node-name: worker0 Node-IPv6: f00d::ac10:14:0:1 External-Node IPv4: 172.16.0.20 Internal-Node IPv4: 10.200.28.238节点状态与跨节点同步的实现在 pkg/node 与 pkg/nodediscovery 中维护。5. 三者关系小结Labels是描述与选择的基本语言source:keyvalue格式key 唯一、value 可选选择时 key 与 value 必须同时匹配Endpoint是网络执行单元共享 IP 的容器被归组拥有节点内唯一的 endpoint id并从 Kubernetes 等来源自动派生标签元数据Identity是策略执行单元由安全相关标签默认id.前缀派生集群级唯一让策略规模与 endpoint 数量解耦对不受管端点则用reserved:*特殊身份表达对 kube-dns、cilium-operator 等关键组件则内置 100 段的 well-known identity 保证引导期的连通性Node是自治执行体通过 kvstore 或包元数据做最小化同步identity 的集群一致性正是经由 kvstore 的原子首次查询即分配操作达成的。排查时cilium-dbg identity list、cilium-dbg endpoint list等命令见 cmdref 生成的命令参考输出的数字 ID 与k8s:、reserved:标签正对应本文所述的身份与标签体系可直接对照 pkg/identity/numericidentity.go 中的常量定义进行解读。【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考