
Istio CNI Helm Chart 深度指南istio-cni 的安装、配置、Profile 机制与 Ambient/GKE 适配【免费下载链接】istioConnect, secure, control, and observe services.项目地址: https://gitcode.com/GitHub_Trending/is/istio本文基于 Istio 仓库中的 istio-cni Chart README 及其配套模板、values 与源码展开介绍如何用 Helm 安装 Istio CNI 插件、如何理解 Chart 的 profile 分层配置机制以及如何为 Ambient 模式、GKE 等平台完成正确配置。读完本文你将能够独立完成istio/cniChart 的安装与调参并能对照源码理解 DaemonSet 的权限模型、ConfigMap 环境变量映射和修复控制器repair的三种工作模式。一、这个 Chart 到底安装什么istio-cniChart 位于 manifests/charts/istio-cniChart.yaml中定义其名称为cni描述为 Helm chart for istio-cni components。CNIContainer Network Interface插件的作用是在 Pod 创建时接管网络配置直接改写节点的 iptables 规则将 Pod 流量重定向到 sidecar/ztunnel从而摆脱传统 Istio 依赖 iptables 在 init 容器istio-init里执行的方案缩短 Pod 启动时间并规避 init 容器需要高权限的问题。Chart 的 templates 目录渲染出以下资源资源模板文件说明DaemonSetdaemonset.yaml每节点一个install-cni容器负责向节点下发 CNI 二进制与配置文件ConfigMapconfigmap-cni.yaml把 values 中的 CNI 配置渲染为环境变量供 DaemonSet 消费ClusterRole / Bindingclusterrole.yaml、clusterrolebinding.yaml基础角色 repair 角色 ambient 角色随功能开关裁剪ServiceAccountserviceaccount.yamlDaemonSet 使用的服务账号NetworkPolicy可选networkpolicy.yamlglobal.networkPolicy.enabled: true时创建ResourceQuota可选resourcequota.yamlresourceQuotas.enabled: true时创建GKE profile 默认开启NetworkAttachmentDefinition可选network-attachment-definition.yaml仅在provider: multus时创建Chart 内所有默认值统一收敛在 values.yaml 中后续各节会逐项讲解关键参数。二、安装 Chart2.1 添加 Helm 仓库按照 README 的 Setup Repo Infohelm repo add istio https://istio-release.storage.googleapis.com/charts helm repo update2.2 执行安装以发布名istio-cni安装helm install istio-cni istio/cni -n kube-system为什么强烈建议安装在kube-systemDaemonSet 模板中固定设置了priorityClassName: system-node-critical见 daemonset.yaml 第 88 行该优先级类只对kube-system命名空间中的 Pod 生效——这也是 CNI 作为节点级关键组件每个 Pod 启动都依赖它能被优先调度的保障。如果集群策略允许在kube-system之外使用system-node-critical也可以安装到其他命名空间但默认不推荐。此外模板开头有resourceScope门控daemonset.yaml 第 1 行只有global.resourceScope为all或namespace时才渲染 DaemonSetClusterRole 则要求all或cluster。这是为集群管理员与网格管理员分权场景准备的把值设为namespace时集群级资源需由管理员另行创建。安装完成后NOTES.txt 会提示用以下命令查看状态helm status istio-cni -n kube-system helm get all istio-cni -n kube-system2.3 查看支持的配置项helm show values istio/istio-cni三、核心配置参数详解对照 values.yamlvalues.yaml 有一个特殊结构所有默认值都嵌套在_internal_defaults_do_not_set之下并附带醒目注释——这是为 Helm 无法在内置默认值与用户输入之间插入 profile 层所做的规避方案详见第四节。对用户而言配置时直接写顶层字段即可绝不能带_internal_defaults_do_not_set前缀例如应传--set chainedtrue而不是--set _internal_defaults_do_not_set.chainedtrue。3.1 CNI 路径与配置文件参数默认值说明cniBinDir/opt/cni/bin放置install-cni/插件二进制的节点目录会作为 DaemonSet 的 hostPath 挂载点cniConfDir/etc/cni/net.dCNI 配置文件目录cniConfFileName要写入的 CNI 配置文件名默认取 conf 目录中找到的第一个文件示例10-calico.conflistcniNetnsDir/var/run/netns节点 netns 目录Ambient 模式下以HostToContainer传播挂载istioOwnedCNIConfigfalse启用后由 Istio 托管 CNI 配置文件文件名为istioOwnedCNIConfigFileName默认02-istio-cni.conflistexcludeNamespaces[kube-system]跳过注入/重定向的命名空间列表会经 ConfigMap 以EXCLUDE_NAMESPACES逗号分隔下发chainedtrue以插件链chained方式写入配置还是作为独立文件部分发行版如 OpenShift不支持链式需设为falseproviderdefaultCNI 提供方可选default或multusmultus 会额外创建 NetworkAttachmentDefinition这些值最终都被 configmap-cni.yaml 渲染为环境变量CHAINED_CNI_PLUGIN、EXCLUDE_NAMESPACES、CNI_CONF_NAME、ISTIO_OWNED_CNI_CONFIG等DaemonSet 通过envFrom.configMapRef引入daemonset.yaml 第 167-169 行。值得注意的是模板对CNI_CONF_NAME有条件渲染——K8S 1.24 doesnt like empty values第 23 行即旧版 API Server 不接受空值所以只在显式设置时输出。3.2 Ambient 相关开关ambient: enabled: false # 是否启用 ambient 流量重定向 enablementSelectors: # 判定ambient 生效的 Pod/命名空间选择器 - podSelector: matchLabels: {istio.io/dataplane-mode: ambient} - podSelector: matchExpressions: - { key: istio.io/dataplane-mode, operator: NotIn, values: [none] } namespaceSelector: matchLabels: {istio.io/dataplane-mode: ambient} configDir: # ambient 配置目录默认 /etc/ambient-config dnsCapture: true # ambient 下的 DNS 重定向 ipv6: true # ambient 下的 IPv6 支持 reconcileIptablesOnStartup: true # 启动时调和节点上残留的冲突 iptables 规则 shareHostNetworkNamespace: false # 是否与宿主节点共享网络命名空间 enableAmbientDetectionRetry: false # 检测 ambient Pod 出错时是否重试这些值同样经 ConfigMap 映射为AMBIENT_ENABLED、AMBIENT_DNS_CAPTURE、AMBIENT_IPV6等环境变量configmap-cni.yaml 第 17-22 行。3.3 Repair修复控制器repair: enabled: true # 三种互斥模式只能选一种 labelPods: false # 给坏 Pod 打 cni.istio.io/uninitializedtrue 标签由用户手动处理 deletePods: false # 直接删除坏 Pod让其重新调度授予 DaemonSet 删除任意 Pod 的权限 repairPods: true # 默认动态重放网络配置修复已启动的坏 Pod无需额外 RBAC # 但依赖 securityContext 中的 SYS_ADMIN 等能力 initContainerName: istio-validation brokenPodLabelKey: cni.istio.io/uninitialized brokenPodLabelValue: true三模式的权限差异在 RBAC 模板中精确体现clusterrole.yaml 第 26-57 行repairPods模式不申请任何额外权限模板内注释 No privileges neededdeletePods增加pods: deletelabelPods使用更低权限的pods/status: patch,update。DaemonSet 侧则通过REPAIR_NODE_NAME、REPAIR_RUN_AS_DAEMON等环境变量daemonset.yaml 第 171-178 行把修复控制器以守护方式拉起。修复能力本身由 cni/repair 包实现二进制入口为 cni/cmd/install-cni/main.go调用cni/pkg/cmd的 root command。3.4 安全与运行参数参数默认值说明seccompProfile{}可设为type: RuntimeDefaultseLinuxOptions{}部分平台需要type: spc_tuseAppArmorAnnotationtrueK8s 1.29 及更早版本需经 annotation 设置 AppArmor1.30 可关闭改由securityContext.appArmorProfile设置resourcescpu 100m / mem 100Miinstall-cni容器资源tolerationsNoSchedule/NoExecute/CriticalAddonsOnly保证 DaemonSet 调度到所有节点updateStrategyRollingUpdate, maxUnavailable: 1DaemonSet 滚动更新策略terminationGracePeriodSeconds30值调大可给 CNI 清理留更多时间避免滚动更新时出现 failed to find plugin istio-cnilogging.level/global.logging.levelinfo控制istio-cni-node日志级别映射为--log_output_level启动参数logAsJsonfalse追加--log_as_json启动参数global.nativeNftablesfalse启用 nftables 替代 iptables 规则对应 tools/istio-nftables 组件global.networkPolicy.enabledfalse是否创建默认 NetworkPolicyresourceQuotas关闭pods: 5000GKE 上启用限制system-node-criticalPod 数量env{}额外注入 Pod 的环境变量也会写入 ConfigMap关于安全上下文的取舍DaemonSet 模板中有完整的注释说明daemonset.yaml 第 113-148 行privileged被显式置为false先drop: [ALL]再按功能最小化添加NET_ADMINipset/路由表访问、NET_RAW修改nat表、SYS_PTRACErepair/ambient 需要描述 Pod 网络命名空间、SYS_ADMIN打开/proc下的网络命名空间以进入 Pod netns、DAC_OVERRIDEroot 丢弃所有能力后仍能读写宿主目录。四、ProfileIstio Chart 的分层配置机制README 对 profile 的定义是一组打包好的值预设通过--set profileprofile启用例如demoprofile 提供面向测试环境的预设更多功能开启、资源要求降低。所有 Istio Chart 使用同一套 profile 名称即使某个 profile 对某个 Chart 没有实际影响以保证跨 Chart 的一致性。优先级从高到低用户显式设置的值-f/--setprofile 预设Chart 内置默认值这套机制的实现就藏在 zzz_profile.yaml 中文件名前缀zzz_使其最后渲染、直接改写.Values。模板头部注释解释了动机Helm 把内置默认值和用户输入合并成了同一个.Values无法在中间插入 profile 层。变通方案是把默认值全部塞进_internal_defaults_do_not_set然后按默认值 ← profile ← 用户输入的顺序做mustMergeOverwrite合并后写回.Values第 24-56 行。两个实用细节防护性报错如果你误写了--set defaults.xxx...这类前缀模板会直接fail并打印你设置的所有默认值第 18-23 行而不是静默失效。profile 文件的查找位置模板按files/profile-name.yaml读取不存在则报 unknown profile。该 chart 内置的 profile 可见于 manifests/charts/istio-cni/filesprofile-ambient.yaml、profile-demo.yaml、profile-preview.yaml、profile-stable.yaml、profile-remote.yaml、各profile-compatibility-version-1.2x.yaml以及profile-platform-gke.yaml、profile-platform-openshift.yaml等平台预设。此外模板还支持独立的platform与compatibilityVersion两个维度与 profile 依次合并。五、启用 Ambient 模式5.1 使用 ambient profilehelm install istio-cni istio/cni -n kube-system --set profileambient对应的 profile-ambient.yaml 对 CNI chart 的直接效果是cni.ambient.enabled: true同时它还会为 pilot 注入PILOT_ENABLE_AMBIENT: true、设置 HBONE 元数据等说明 ambient 需要 Pilot、CNI、ztunnel 三件套协同部署顶层定义可见 manifests/profiles/ambient.yaml。启用后DaemonSet 行为发生实质变化均可在 daemonset.yaml 中逐条验证额外挂载宿主的/var/run/netnsHostToContainer传播与/var/run/ztunnel第 219-225 行cni-netns-dir卷用DirectoryOrCreate类型注释解释了原因CNI 可能在首个非 hostNetwork Pod 出现前不会 bind mount 该目录不能因此阻塞 Agent Pod 创建repairPods或 ambient 任一开启时都会只读挂载宿主/proc第 237-242 行用于进入 Pod 网络命名空间若同时设置ambient.shareHostNetworkNamespace: truePod 转为hostNetwork: truednsPolicy: ClusterFirstWithHostNet且不再注入ALLOW_SWITCH_TO_HOST_NS第 73-76 行、第 179-182 行额外渲染一个 ambient 专用 ClusterRoleclusterrole.yaml 第 60-82 行只允许pods/status的 patch/update 及读取本 DaemonSet。5.2 使用 Calico 时的额外要求README 特别指出Calico 场景必须允许源地址伪造source spoofing否则 ambient 的重定向流量会被 RPF 检查丢弃operator 部署的 Calicokubectl patch felixconfigurations default --typejson -p[{op: add, path: /spec/workloadSourceSpoofing, value: Any}]manifest 部署的 Calico在calico-nodeDaemonSet 的spec.template.spec.containers.env中添加环境变量FELIX_WORKLOADSOURCESPOOFINGAny。其效果是带指定 annotation 的 Pod 跳过 RPF 检查。六、GKE 平台注意事项README 的 GKE notes 只有两条但每一条背后都有模板代码支撑kube-system命名空间在 GKE 上为强制要求而非一般建议。helm template场景必须显式--set cni.cniBinDir/home/kubernetes/binhelm install则可自动检测。自动检测逻辑在 daemonset.yaml 第 6-14 行模板检查.Capabilities.KubeVersion.GitVersion是否包含-gke是则cniBinDir默认取/home/kubernetes/bin否则取/opt/cni/bin若用户显式设置了cniBinDir以用户值为准。helm template在本地渲染时拿不到集群版本信息检测退化为默认值因此需要手动指定。配套的 profile-platform-gke.yaml 则刻意把cniBinDir置为空字符串注释写明 intentionally unset for gke to allow template-based autodetection to work并开启resourceQuotas.enabled: true——即 GKE 上会渲染出限制system-node-critical优先级 Pod 数量的 ResourceQuota。七、DaemonSet 的运行时画像综合模板与 ConfigMap可以完整描述istio-cni-node在节点上的形态容器单一install-cni容器镜像默认{{ global.hub }}/install-cni:{{ tag }}当前仓库中镜像构建入口见 cni/ 与 docker/ 下各 Dockerfile更完整的 CNI 文档见 cni/README.md探针readinessProbe请求 8000 端口/readyzmetrics 监听 15014 端口并打上prometheus.io/scrape: true注解关键 hostPathCNI bin 目录、/etc/cni/net.d、/var/run/istio-cniUDS 日志/ambient 事件通道、/proc、/var/run/netns监控GOMEMLIMIT通过resourceFieldRef与内存上限联动让 Go 运行时按限额回收内存。NetworkPolicynetworkpolicy.yaml启用后只放行 15014Prometheus与 8000readiness的入站流量出站全放行注释说明 API Server 地址因发行版而异暂不收紧。八、小结与验证清单围绕 istio-cni README 的核心操作链可以归纳为helm install istio-cni istio/cni -n kube-system需要system-node-critical调度保障用helm show values istio/istio-cni查看参数配置一律使用顶层字段--set chainedfalse而非--set defaults.chainedfalse或带_internal_defaults_do_not_set前缀平台/场景适配GKE 用--set profilegke或手动cniBinDir/home/kubernetes/binhelm template下必须手动Ambient 用--set profileambient并按需处理 Calico 的 source spoofingOpenShift 等不支持插件链的发行版将chained设为false安装后用helm status/helm get all验证观察 DaemonSet 就绪与节点上 CNI 二进制/配置文件是否正确落盘需要收紧安全面时可开启global.networkPolicy.enabled并按平台调整seLinuxOptions、seccompProfile与 AppArmor 设置方式。所有结论均可在仓库内直接溯源Chart 模板位于 manifests/charts/istio-cni/templates默认值与注释在 values.yamlprofile 合并逻辑在 zzz_profile.yamlCNI 组件源码含 repair 控制器、iptables/nftables 规则生成位于 cni/pkg。【免费下载链接】istioConnect, secure, control, and observe services.项目地址: https://gitcode.com/GitHub_Trending/is/istio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考