概述

Istio 在网格中部署的Pod中注入initContainer,istio-init。该istio-init容器设置荚的网络流量重定向到/从Istio三轮代理。这就要求将用户或服务帐户部署到网格上的Pod具有足够的Kubernetes RBAC权限才能部署具有NET_ADMIN和NET_RAW功能的容器。对于某些组织的安全合规性,要求Istio用户具有提升的Kubernetes RBAC权限是有问题的。Istio CNI插件是istio-init执行相同网络功能但不要求Istio用户启用提升的Kubernetes RBAC权限的容器的替代。

Istio CNI插件在Kubernetes Pod生命周期的网络设置阶段执行Istio Mesh Pod流量重定向,从而消除了 将Pod部署到Istio Mesh中的用户的需求NET_ADMIN和NET_RAW功能。Istio CNI插件取代了istio-init容器提供的功能。

配置istio启用istio-cni

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:components:cni:enabled: truevalues:cni:excludeNamespaces:- istio-system- kube-systemlogLevel: infoistioctl install -f istio-cni.yaml

此时查看启用自动注入的pod会发现init container的名称(istio-validation)有别于不启用istio-cni的名称(istio-init),

且执行命令多了以下参数,

- --run-validation  # 校验流量是否劫持
- --skip-rule-apply # 不执行iptables策略

install-cni

install-cni程序会根据获取配置通过模板对原始cni配置文件进行修改,配置模板存储在istio-cni-config configmap中,渲染后添加的配资如下

{"kubernetes": {"cni_bin_dir": "/opt/cni/bin","exclude_namespaces": ["istio-system","kube-system"],"kubeconfig": "/etc/cni/net.d/ZZZ-istio-cni-kubeconfig"},"log_level": "info","name": "istio-cni","type": "istio-cni"}

分别执行以下操作:

  • 拷贝所需要的相关二进制命令,包含istio-cni/istio-cni-repair/istio-iptables三个命令
  • 创建所需要的kubeconfig,默认为/etc/cni/net.d/ZZZ-istio-cni-kubeconfig
  • 生成cniconfig,即添加了一个kubernetes cni plugin,
  • 永久等待

istio-cni

当kubelet调用cni时会执行上述插件,
通过cni传过来的参数获取相关配置,如果pod包含istio-init则不进行相关操作

  • 包含sidecar.istio.io/inject=true 注释
  • 包含istio-init initcontainer
  • 命名空间在Exclude列表中
  • 包含 sidecar.istio.io/status 注释

通过NewRedirect生成Redirect信息

redirect结构如下,保存着后续iptables所需的信息

type Redirect struct {targetPort           stringredirectMode         stringnoRedirectUID        stringincludeIPCidrs       stringincludePorts         stringexcludeIPCidrs       stringexcludeInboundPorts  stringexcludeOutboundPorts stringkubevirtInterfaces   string
}

然后调用istio.Program方法进入命名空间执行istio-iptables命令

func (ipt *iptables) Program(netns string, rdrct *Redirect) error {netnsArg := fmt.Sprintf("--net=%s", netns)nsSetupExecutable := fmt.Sprintf("%s/%s", nsSetupBinDir, nsSetupProg)nsenterArgs := []string{netnsArg, //指定网络命名空间nsSetupExecutable, //istio-iptables命令路径"-p", rdrct.targetPort, //这些实际上就是istio-iptables的参数"-u", rdrct.noRedirectUID,"-m", rdrct.redirectMode,"-i", rdrct.includeIPCidrs,"-b", rdrct.includePorts,"-d", rdrct.excludeInboundPorts,"-o", rdrct.excludeOutboundPorts,"-x", rdrct.excludeIPCidrs,"-k", rdrct.kubevirtInterfaces,}log.Info("nsenter args",zap.Reflect("nsenterArgs", nsenterArgs))out, err := exec.Command("nsenter", nsenterArgs...).CombinedOutput() //执行命令if err != nil {log.Error("nsenter failed",zap.String("out", string(out)),zap.Error(err))log.Infof("nsenter out: %s", out)} else {log.Infof("nsenter done: %s", out)}return err
}

进入对应的网络命名空间执行istio-iptables命令进行端口劫持相关操作,实现了和istio-init init container相同的功能,同样执行的是istio-iptables命令

istio-cni-repair

该程序相当于一个故障处理程序,主要解决以下两个问题

  • 如果应用程序容器在istio-cni安装完成之前启动,则Kubelet不了解Istio CNI插件。结果是出现了没有Istio iptables规则的应用程序容器。该Pod可以访问网络,而其他Pod可以访问该网络,从而有效地绕过了所有Istio策略。这是一个安全问题,因为它无提示地绕过所有策略检查。
  • 当kubernetes响应负载的突然增加时,应用程序pod和Istio CNI安装程序之间的竞争更有可能发生。节点启动后,Kubernetes将有许多可调度的Pod分配给该节点,这些Pod都与CNI安装程序竞争。如果某个节点突然终止,例如在GKE可抢占节点的情况下,则可能出现这种情况。

上述问题解决思路

  • 通过init容器检测到iptables在pod中未正确配置,退出并返回错误(推荐方式)
  • 物理安装,不通过daemonset安装
  • 使用netd安装CNI

istio-cni-repair执行逻辑

istio-cni-repair的目的就是为了检测返回错误的pod,主要执行以下逻辑.

  • 初始化client-set
  • 生成RepairController,根据标签检测istio-validation容器崩溃的pod
  • 搜索istio-validation容器崩溃的pod
  • 根据label-pods/delete-pods参数决定是否删除pod

总结

虽然istio-cni可以减少pod的授权,但是也带来了其他问题,增加了复杂性,如果对容器权限不敏感的情况下,不推荐使用istio-cni。

参考:

缓解istio cni race设计草案

istio源码

istio官方文档

istio-cni详解相关推荐

  1. Istio 组件详解

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 1. istio 组件构成 以下是istio 1.1 官方架构图: 虽然Istio 支持多个平台, 但将其与 Kubernetes 结合使用,其优势会 ...

  2. 详解4种微服务框架接入Istio方案

    本文分享自华为云社区<传统微服务框架接入Istio方案详解>,作者:香菜聊游戏 . 微服务的概念和原理 微服务带来的问题 微服务带来的好处: 解耦了业务,解耦了代码和架构,业务更紧凑,逻辑 ...

  3. Istio 中的授权策略详解

    本文节选自 ServiceMesher 社区出品的开源电子书<Istio Handbook--Istio 服务网格进阶实践>,阅读地址:https://www.servicemesher. ...

  4. Istio 中的 Sidecar 注入及透明流量劫持过程详解

    图片来源:上海五角场 by Jimmy Song 本文基于 Istio 1.5.1 版本,将为大家介绍以下内容: 什么是 sidecar 模式和它的优势在哪里. Istio 中是如何做 sidecar ...

  5. grpc通信原理_容器原理架构详解(全)

    目录 1 容器原理架构 1.1 容器与虚拟化 1.2 容器应用架构 1.3 容器引擎架构 1.4 Namespace与Cgroups 1.5 容器镜像原理 2 K8S原理架构 2.1 K8S主要功能 ...

  6. k8s架构及服务详解

    1.容器及其三要素 1.1.容器是什么 容器的本质是一种特殊的进程. 在linux容器中有三个重要的概念:Namespace.Cgroups.rootfs. Namespace做隔离,让进程只能看到N ...

  7. flannel 介绍(UTP、VXLAN、Host Gateway模式详解)

    flannel 介绍(UTP.VXLAN.Host Gateway模式详解) 使用kubernetes安装flannel flannel backend 详解(flannel 各种模式详解) 1.UD ...

  8. 【云原生之k8s】k8s基础详解

    [云原生之k8s]k8s基础详解 前言 一.kubernetes介绍 (1)kubernetes简介 (2)应用部署方式的演变 二.kubernetes组件 (1)kubernetes架构 (2)ma ...

  9. authorizationPolicy详解

    欢迎关注我的公众号: 目前刚开始写一个月,一共写了18篇原创文章,文章目录如下: istio多集群探秘,部署了50次多集群后我得出的结论 istio多集群链路追踪,附实操视频 istio防故障利器,你 ...

  10. 详解Docker的基本原理与实践操作

    详解Docker的基本原理与实践操作,Web时代,应用变得越来越强大,与此同时也越来越复杂.集群部署.隔离环境.灰度发布以及动态扩容缺一不可,而容器化则成为中间的必要桥梁. 本文我们就来探索Docke ...

最新文章

  1. R 语言爬虫 之 cnblog博文爬取
  2. 服务器集群负载均衡(F5,LVS,DNS,CDN)区别以及选型
  3. 『参考』使用.net CF自带库判断设备的连接状态
  4. 在JavaScript中删除对象
  5. 《系统集成项目管理工程师》必背100个知识点-02项目组织方式和特点
  6. 使用Spinner和setDropDownViewResource
  7. VTK:网格之FillHoles
  8. 使用 .toLocaleString() 轻松实现多国语言价格数字格式化
  9. Android相对布局(RelativeLayout)常用属性、练习使用按键、文本框等控件、线性布局(LinearLayout)属性
  10. E百科 | 第2期 扒一扒能加速互联网的QUIC协议
  11. java读取src xml文件路径_Java获取路径方法相对路径读取xml文件方法
  12. 记录kylin成功启动,访问页面404问题
  13. (97)FPGA手写RAM(Verilog)
  14. Linux 命令(27)—— echo 命令
  15. Backward_chaining
  16. 米思齐MT1637简单显示字符串和时间
  17. 高级远程办公解决方案 ETX ,用于桌面虚拟化和远程访问图形要求苛刻的应用程序
  18. 金融牌照之基金销售、基金支付、基金管理牌照简析
  19. Android self_adaption of screen
  20. 项目过程管理(七)排期和立项

热门文章

  1. 10.Java面向对象进阶2
  2. 程序设计类实验辅助c语言,程序设计基础与实验
  3. Google 三架马车:GFS、BigTable、MapReduce
  4. yolov3 训练终端参数涵义
  5. 支付模块需要考虑到的测试点
  6. 为什么内马尔要离开巴萨去巴黎?
  7. Div CSS网页布局对网站搜索引擎优化的影响
  8. std::function 学习笔记(3)
  9. PS制作精美的网页按钮设计教程
  10. 雷军:创业者要牢记的两个关键词