ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Cilium ClusterMesh 启用指南:深入解析 `cilium clustermesh enable` 命令与 Helm 底层实现

Cilium ClusterMesh 启用指南:深入解析 `cilium clustermesh enable` 命令与 Helm 底层实现 Cilium ClusterMesh 启用指南深入解析cilium clustermesh enable命令与 Helm 底层实现【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium本文是 Cilium CLI 命令参考文档 Documentation/cmdref/cilium_clustermesh_enable.md 的深度解读。ClusterMesh 是 Cilium 的多集群互联Multi Cluster Management能力用于跨 Kubernetes 集群打通服务发现、网络策略与可观测性cilium clustermesh enable则是在单个集群内通过 Helm 启用 ClusterMesh 控制面clustermesh-apiserver的命令。读完本文你将掌握该命令的全部参数含义与默认值、其底层如何生成 Helm values 并触发升级以及从启用、连接、状态检查到禁用的完整多集群操作闭环。命令概览为集群启用 ClusterMesh 能力cilium clustermesh enable的作用是在当前集群中启用 ClusterMesh 能力其实现方式是直接修改 Cilium 的 Helm release通过 Helm Upgrade 动作而非创建独立的 Kubernetes 资源。这一点与后续的cilium clustermesh connect连接远端集群不同enable只负责把本集群的控制面搭建起来真正与其他集群建立互联关系的是connect命令。在命令树中enable与status、connect、disconnect、disable、inspect-policy-default-local-cluster同属cilium clustermesh的子命令见 cilium_clustermesh.md 与 cilium-cli/cli/clustermesh.go其 CLI 定义位于 cilium-cli/cli/clustermesh.go。命令语法cilium clustermesh enable [flags]命令自身不带位置参数所有行为均通过 flags 控制。执行后CLI 会调用clustermesh.EnableWithHelm(ctx, RootK8sClient, params)若失败则输出Unable to enable ClusterMesh: error并终止。参数详解enable 专属参数Flag类型默认值说明--enable-kvstoremeshbooltrue启用 KVStoreMesh一个将远端集群信息缓存在本地 kvstore 中的扩展组件。注意从 Cilium v1.21 起 KVStoreMesh 将无条件启用--service-type stringstring自动检测控制面暴露方式取值{ LoadBalancer \| NodePort }-h, --helpbool-显示帮助信息--enable-kvstoremesh的深层语义该参数在源码中有独立的是否被用户显式修改跟踪逻辑。命令执行时通过cmd.Flags().Changed(enable-kvstoremesh)判断用户是否显式传入该 flag见 cilium-cli/cli/clustermesh.go结果存入Parameters.EnableKVStoreMeshChanged。之所以需要区分是因为kvstoremesh.enabled这个 Helm value 的默认值在 Cilium 1.16 中发生过变化只有用户显式指定时CLI 才会把clustermesh.apiserver.kvstoremesh.enabled写入 Helm values否则完全依赖 chart 内置默认值见 cilium-cli/clustermesh/clustermesh.go。这样既保证了向后兼容也避免了无意间覆盖用户通过 Helm 直接设置的配置。--service-type的自动检测逻辑当参数为空时generateEnableHelmValues会根据集群 Flavor 自动推断控制面的 Service 类型并附加相应注解见 cilium-cli/clustermesh/clustermesh.goGKE使用LoadBalancer并添加networking.gke.io/load-balancer-type: Internal与networking.gke.io/internal-load-balancer-allow-global-access: true后者允许跨区域访问AKS使用LoadBalancer添加service.beta.kubernetes.io/azure-load-balancer-internal: true将服务暴露在 Azure VPC 内网EKS使用LoadBalancer添加service.beta.kubernetes.io/aws-load-balancer-scheme: internal其他类型无法自动推断直接报错提示cannot auto-detect service type, please specify using --service-type option。若用户显式指定--service-type则仅接受LoadBalancer与NodePort两种取值其他值报错service type %q is not valid其中 NodePort 会额外打印警告Using service type NodePort may fail when nodes are removed from the cluster!见 cilium-cli/clustermesh/clustermesh.go。这是因为 NodePort 模式下访问信息依赖于节点地址节点变更会导致端点失效。从父命令继承的全局参数Flag默认值说明--as string空模拟impersonate该用户执行操作可以是普通用户或 ServiceAccount--as-group stringArray空模拟用户所属的组可重复指定多个--context string当前上下文Kubernetes 配置上下文--helm-release-name stringciliumHelm release 名称适用于直接通过 Helm 安装 Cilium 的场景--kubeconfig string默认路径kubeconfig 文件路径-n, --namespace stringkube-systemCilium 所在命名空间也可通过环境变量CILIUM_NAMESPACE设置其中--helm-release-name对应的Parameters.HelmReleaseName专门用于引用通过 Helm 直接安装的 Cilium 实例或覆盖 Cilium CLI 在 install/upgrade/enable 时的默认 release 名见 cilium-cli/clustermesh/clustermesh.go。底层实现CLI 如何用 Helm启用 ClusterMeshenable命令的核心逻辑链为newCmdClusterMeshEnableWithHelm→clustermesh.EnableWithHelm→generateEnableHelmValueshelm.Upgrade1. 生成 Helm valuesgenerateEnableHelmValues该函数见 cilium-cli/clustermesh/clustermesh.go首先构造基础 valuesclustermesh: useAPIServer: true config: enabled: true这组 values 与 Helm chart 中clustermesh.useAPIServer默认false和clustermesh.config.enabled默认false形成对应关系可对照 install/kubernetes/cilium/values.yaml 与 install/kubernetes/cilium/values.yaml 查看。随后根据--service-type的取值或自动检测结果写入clustermesh.apiserver.service.type及云厂商注解。证书方面CLI 默认启用自动证书生成certgen cronJob 模式对应 values 为clustermesh: apiserver: tls: auto: enabled: true method: cronJob schedule: 0 0 1 */4 * # 每月 1 日执行每 4 个月轮换一次即证书会由 cronJob 每 4 个月自动续期无需人工干预见 cilium-cli/clustermesh/clustermesh.go。2. 执行 Helm UpgradeEnableWithHelmupgradeParams : helm.UpgradeParameters{ Namespace: params.Namespace, Name: params.HelmReleaseName, Values: helmVals, ResetValues: false, ReuseValues: true, } _, err helm.Upgrade(ctx, k8sClient.HelmActionConfig, upgradeParams)关键点在于ReuseValues: true与ResetValues: false见 cilium-cli/clustermesh/clustermesh.go这意味着 enable 操作只增量叠加上述 values而不会重置或丢弃用户此前通过 Helm 设置的任何其他配置属于非破坏性操作。3. 对应部署的 Kubernetes 资源启用后集群中会出现clustermesh-apiserverDeployment 及其关联组件。相关资源名在 cilium-cli/defaults/defaults.go 中定义Deployment/Pod 选择器k8s-appclustermesh-apiserverServiceclustermesh-apiserverSecretcilium-clustermeshagent/operator 连接远端集群的配置、cilium-kvstoremeshKVStoreMesh 连接远端集群的配置证书 Secretclustermesh-apiserver-server-cert、clustermesh-apiserver-admin-cert、clustermesh-apiserver-client-cert、clustermesh-apiserver-remote-cert其中cilium-clustermeshSecret 正是后续connect操作与clustermesh status命令读取远端集群接入信息的数据来源见 cilium-cli/clustermesh/clustermesh.go。完整工作流从 enable 到多集群互通enable通常不是孤立使用而是多集群组网流程的第一步。典型操作顺序为# 1. 在每个集群上先为 ClusterMesh 配置集群标识 # 注意cluster.id 必须唯一且为 1-255 的数值cluster.name 必须全局唯一 cilium install --set cluster.id1 --set cluster.namecluster1 # 2. 在每个集群上启用 ClusterMesh 控制面 cilium clustermesh enable --context kind-cluster1 cilium clustermesh enable --context kind-cluster2 # 3. 建立集群间的互联 cilium clustermesh connect --context kind-cluster1 \ --destination-context kind-cluster2 # 4. 检查状态 cilium clustermesh status --context kind-cluster1 --wait # 5. 需要时禁用 cilium clustermesh disable前置条件cluster.id 与 cluster.nameenable本身不会校验集群标识但底层的GetClusterConfig会读取 Cilium ConfigMap 中的cluster-id与cluster-name键若cluster-id为0或cluster-name为default会打印警告⚠️ Cluster not configured for clustermesh, use --set cluster.id and --set cluster.name with cilium install.而在connect阶段validateInfoForConnect会严格执行校验集群 ID 必须为 1 到max-connected-clusters之间的数值、两端集群 ID/名称不得相同、且两端max-connected-clusters必须一致见 cilium-cli/clustermesh/clustermesh.go。因此在 enable 之前务必先为每个集群设置唯一且合法的cluster.id与cluster.name。与 connect 的关系enable 只是就绪需要区分的是enable部署并暴露 clustermesh-apiserver含自动证书connect才负责把远端集群的接入信息IP、端口、CA、集群名/ID写入本集群的clustermesh.config.clusters。从源码看connect会合并远端集群配置并再次触发 Helm Upgrade见 cilium-cli/clustermesh/clustermesh.go而disable则反向执行clustermesh.useAPIServerfalse与clustermesh.config.enabledfalse见 cilium-cli/clustermesh/clustermesh.go。与 Helm values 的对应关系启用后可以在 Cilium Helm values 中看到如下结构完整注释示例见 install/kubernetes/cilium/values.yamlclustermesh: useAPIServer: true config: enabled: true domain: mesh.cilium.io clusters: cluster1: enabled: true address: cluster1.mesh.cilium.io # 或使用 ips 列表 port: 2379 apiserver: service: type: LoadBalancer tls: auto: enabled: true method: cronJob kvstoremesh: enabled: true # 由 --enable-kvstoremesh 控制KVStoreMesh 容器相关的运行参数如healthPort: 9881、etcdQPS: 100、额外的extraArgs/extraEnv等同样可以在 install/kubernetes/cilium/values.yaml 中查看。--enable-kvstoremesh的作用正是控制其中的clustermesh.apiserver.kvstoremesh.enabled字段。注意事项与常见陷阱KVStoreMesh 默认开启--enable-kvstoremesh默认值为true且官方已声明从 Cilium v1.21 起无条件启用。若你的环境对 etcd 资源占用敏感需在升级前评估。ServiceType 的选择生产环境优先LoadBalancer云厂商GKE/AKS/EKS会自动附加内网 LB 注解以保持流量不出 VPC。NodePort 在节点变动场景下可能导致连接失败。证书自动轮换默认 cronJob 模式每 4 个月轮换一次证书cron 表达式0 0 1 */4 *请勿手动干预该 Secret以免破坏自动续期。非破坏性升级enable 使用ReuseValues: true不会覆盖既有 Helm values若希望完全接管配置可改用--helm-release-name指定实际 release 后直接通过 Helm 操作。启用后仍需 connect仅执行enable不会建立任何集群互联必须配合cilium clustermesh connect双向bidirectional、全网状mesh或单向unicast三种连接模式完成组网并通过cilium clustermesh status验证节点、服务、身份等资源的同步状态。【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表