第四章 Istio出口流量管理

news2025/1/23 10:35:21

文章目录

  • 访问外部服务
    • Envoy 代理将请求传递给网格外服务
    • 配置服务条目以提供对外部服务的受控访问
      • 访问外部 HTTP 服务
    • 直接访问外部服务
  • 出口网关
    • 清理 HTTP 网关
    • 其他

访问外部服务

为了更好的做好网络访问控制,k8s结合Istio出口网络升级示意图
在这里插入图片描述

来自 Istio 的 pod 的所有出站流量都会重定向到其 sidecar 代理,因此集群外部 URL 的可访问性取决于代理的配置。默认情况下,Istio 配置 Envoy 代理来传递未知服务的请求。
一般来说服务访问网格外部服务默认放行,但是如果想要严格管控网格流量,需要对出方向进行管控。

这里展示三种不同的方式访问外部服务:

  • 允许 Envoy 代理将请求传递给网格外服务。
  • 配置服务条目以提供对外部服务的受控访问。
  • 直接访问外部服务。

Envoy 代理将请求传递给网格外服务

Istio 有一个配置: meshConfig.outboundTrafficPolicy.mode用于配置外部服务的 sidecar 处理,如果此选项设置为ALLOW_ANY,Istio 代理将允许对未知服务的调用通过。如果该选项设置为REGISTRY_ONLY,则 Istio 代理会阻止任何没有 HTTP 服务或网格内定义的服务条目的主机。 ALLOW_ANY是默认值,目的是允许快速开始使用 Istio,而无需控制对外部服务的访问。

配置服务条目以提供对外部服务的受控访问

Service Entry(服务条目)允许在Istio的内部服务注册表中添加额外的服务记录,以便网格中自动发现的服务可以访问或路由到这些手动指定的服务。如果我们想要控制出口网络,必须先要设置ServiceEntry
正常情况我们对外访问先设置为ALLOW_ANY。这样,就可以开始在某些外部服务上使用 Istio 功能,而不会阻止任何其他服务。配置完所有服务条目后,可以将模式切换为REGISTRY_ONLY阻止任何其他无意/恶意的访问。

访问外部 HTTP 服务

  1. 创建一个ServiceEntry以允许访问外部 HTTP 服务(httpbin-ext.yml)
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: httpbin-ext
spec:
  hosts:
  - httpbin.org
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: DNS
  location: MESH_EXTERNAL

网格内服务访问httpbin.org时,Sidecar 代理将忽略原始目标 IP 地址并将流量定向到httpbin.org,通过DNS解析,执行 DNS 查询以获取httpbin.org 真实IP 地址。
2. 从k8s内部向外部 HTTP 服务发出请求:

$ kubectl exec "$SOURCE_POD" -c sleep -- curl -sS http://httpbin.org/headers
{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    ...
    "X-Envoy-Decorator-Operation": "httpbin.org:80/*",
    ...
  }
}

请注意 Istio sidecar 代理添加的标头:X-Envoy-Decorator-Operation。
3. 检查 sidecar 代理的日志:

$ kubectl logs "$SOURCE_POD" -c istio-proxy | tail
[2019-01-24T12:17:11.640Z] "GET /headers HTTP/1.1" 200 - 0 599 214 214 "-" "curl/7.60.0" "17fde8f7-fa62-9b39-8999-302324e6def2" "httpbin.org" "35.173.6.94:80" outbound|80||httpbin.org - 35.173.6.94:80 172.30.109.82:55314 -

请注意 HTTP 请求相关的条目httpbin.org/headers。

直接访问外部服务

与Envoy 直通外部服务(使用ALLOW_ANY流量策略指示 Istio sidecar 代理直通未知服务的调用)不同,这种方法完全绕过了 sidecar,实质上禁用了指定 IP 的所有 Istio 功能。无法像使用该ALLOW_ANY方法那样逐步添加特定目的地的服务条目。因此,仅当由于性能或其他原因无法使用 sidecar 配置外部访问时,才建议将此配置方法作为最后的手段。

简单方法是将global.proxy.includeIPRanges配置选项设置为用于内部集群服务的一个或多个 IP 范围。这些 IP 范围值取决于集群运行的平台。允许这些IP直接访问外部服务
--set values.global.proxy.includeIPRanges="172.16.0.0/16"

要以更安全的方式实施出口流量控制,必须通过出口网关引导出口流量,并查看其他注意事项

出口网关

Istio 使用入口和出口网关 来配置在服务网格边缘执行的负载均衡器。入口网关允许定义所有传入流量流经的网格的入口点。出口网关是一个对称的概念;它定义了网格的出口点。出口网关允许 Istio 功能(例如监控和路由规则)应用于网格出口流量。

  1. 检查Istio出口网关是否部署
$ kubectl get pod -l istio=egressgateway -n istio-system

如果没有返回 Pod,请部署 Istio 出口网关。(由于各家云厂商有自己的构建方法,此处不做介绍)
2. 创建ServiceEntry
假设我们还是使用上文的httpbin-ext配置
3. Gateway为httpbin.org创建出口、端口 80,并为定向到出口网关的流量创建目标规则。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: istio-egressgateway
spec:
  selector:
    istio: egressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - httpbin.org
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: egressgateway-for-httpbin
spec:
  host: istio-egressgateway.istio-system.svc.cluster.local
  subsets:
  - name: httpbin
  1. 定义 VirtualService将流量从 sidecar 引导至出口网关,以及从出口网关引导至外部服务:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: direct-httpbin-through-egress-gateway
spec:
  hosts:
  - httpbin.org
  gateways:
  - istio-egressgateway
  - mesh
  http:
  - match:
    - gateways:
      - mesh
      port: 80
    route:
    - destination:
        host: istio-egressgateway.istio-system.svc.cluster.local
        subset: httpbin
        port:
          number: 80
      weight: 100
  - match:
    - gateways:
      - istio-egressgateway
      port: 80
    route:
    - destination:
        host: httpbin.org
        port:
          number: 80
      weight: 100

清理 HTTP 网关

$ kubectl delete gateway istio-egressgateway
$ kubectl delete serviceentry httpbin
$ kubectl delete virtualservice direct-httpbin-through-egress-gateway
$ kubectl delete destinationrule egressgateway-for-httpbin

其他

请注意,在 Istio 中定义出口Gateway本身并不为运行出口网关服务的节点提供任何特殊处理。集群管理员或云提供商应在专用节点上部署出口网关,并引入额外的安全措施以使这些节点比网格的其他节点更安全。

Istio无法安全地强制所有出口流量实际上都流经出口网关。Istio 仅通过其 sidecar 代理启用此类流程。如果攻击者绕过sidecar代理,就可以直接访问外部服务,而无需遍历出口网关。这样,攻击者就逃脱了 Istio 的控制和监视。集群管理员或云提供商必须确保没有流量绕过出口网关离开网格。Istio 外部的机制必须强制执行此要求。例如,集群管理员可以配置防火墙来拒绝所有非来自出口网关的流量。Kubernetes网络策略还可以禁止所有非源自出口网关的出口流量(请参阅 下一节的示例)。此外,集群管理员或云提供商可以配置网络,以确保应用程序节点只能通过网关访问互联网。为此,集群管理员或云提供商可以阻止将公共 IP 分配给网关以外的 Pod,并可以配置 NAT 设备以丢弃并非源自出口网关的数据包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1102011.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux入门到精通-第四章-gcc编译器

目录 参考gcc概述gcc的工作流程 参考 gcc编译器 gcc概述 编辑器vi、记事本)是指我用它来写程序的 (编辑码),而我们写的代码语句,电脑是不懂的,我们需要把它转成电脑能懂的语句,编译器就是这样的转化工具。就是说,我…

4.MidBook项目经验之MonogoDB和easyExcel导入导出

1.数据字典(固定的数据,省市级有层级关系的) //mp表如果没有这个字段,防报错,eleUI需要这个字段TableField(exist false) //父根据id得到子数据 ,从controller开始自动生成代码-->service//hasChildren怎么判断,只需要判断children的parentid的count数量>0就可以了//优化…

uniapp订单循环列表倒计时

目录 效果图片插件uni-countdown代码最后 效果图片 插件uni-countdown 地址 代码 <template><view class""><!-- 下面循环两个列表 --><view class"item" v-for"(item, index) in listData" :key"index">&…

企业c#语言源代码防泄密解决方案

在当今数字化时代&#xff0c;企业的核心业务往往依赖于软件应用程序。为了保护企业的知识产权和敏感信息&#xff0c;源代码的保密至关重要。对于制造类企业尤其是智能制造业来讲&#xff0c;最近几年是高速发展的时期&#xff0c;很多公司在做工厂流水线设备时&#xff0c;就…

远程VPN登录,IPsec,VPN,win10

windows10 完美解决L2TP无法连接问题 windows10 完美解决L2TP无法连接问题 - 哔哩哔哩

点击切换播放图片

<template><!-- banner组件 --><div class"wrap-box"><div class"image-container"><img :src"currentImage" alt"Image"></div><div class"controls"><div class"btn&q…

Deploy、Service与Ingress

Deployment 自愈 介绍:控制Pod&#xff0c;使Pod拥有多副本&#xff0c;自愈&#xff0c;扩缩容等能力 # 清除所有Pod&#xff0c;比较下面两个命令有何不同效果&#xff1f; kubectl run mynginx --imagenginxkubectl create deployment mytomcat --imagetomcat:8.5.68 # 自…

安防视频监控EasyCVR平台修改默认数据为MySQL,但忘记登录密码该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频监控平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录…

Windows设置开机自启

Windows设置开机自启 一&#xff1a;添加服务二&#xff1a;添加注册表三&#xff1a;添加本地组策略四&#xff1a;添加启动文件夹五&#xff1a;添加任务计划程序 启动优先级&#xff1a;服务>注册表>启动文件夹>任务计划 一&#xff1a;添加服务 注&#xff1a;命…

代码随想录算法训练营第五十六天| 1143.最长公共子序列 、 1035.不相交的线 、53. 最大子序和 动态规划

代码随想录算法训练营第五十六天| 1143.最长公共子序列 、 1035.不相交的线 、53. 最大子序和 动态规划 文章目录 代码随想录算法训练营第五十六天| 1143.最长公共子序列 、 1035.不相交的线 、53. 最大子序和 动态规划[toc]1143.最长公共子序列1035.不相交的线53. 最大子序和 …

【重磅!】2023亚洲品牌500强在香港隆重发布,后羿品牌与华为、抖音、比亚迪、贵州茅台等入选登榜!

9月25日&#xff0c;由专业品牌评价机构Asiabrand发起主办&#xff0c;中国亚洲经济发展协会、一带一路总商会、《环球时报》社、东盟-中国总商会、亚太第一卫视和香港中小企业发展促进会联合主办的“第18届亚洲品牌盛典”在香港隆重举行。众多国际知名品牌齐聚一堂&#xff0c…

低代码:让软件开发不再遥不可及

近些年来&#xff0c;低代码的发展趋势可谓是蒸蒸日上&#xff01;当然&#xff0c;热门的技术总会伴随着质疑的声音&#xff0c;诞生至今&#xff0c;大家各抒己见&#xff0c;也不乏有针锋相对的意思。这本质上是一件有助于推动低代码发展的事情。 业内的朋友们一定知道&…

Peter算法小课堂—蠕动区间

蠕动区间 蠕动区间&#xff08;尺取法、双游标&#xff09;是一个经典的优化算法。 我们以毛毛虫&#x1f41b;举例说明 具体的&#xff0c;我们看题目 例题 最小区间 这一题&#xff0c;我们用暴力法&#xff0c;复杂度O(N^2) 先给出暴力法代码 int ansn1; for(int tail…

Three.js图案溶解shader

上图提供两种方式溶解显示 上面一排是根据现实的图案红色通道也就是r值进行溶解 下面一排提供额外的溶解纹理 可以通过简单更改呈现多种溶解图案 代码仓库 gitee b站账号&#xff1a;https://space.bilibili.com/374230437 interface IMapPath {map: string;dissolve?: string…

Oracle database 开启归档日志 archivelog

Oracle database 开启归档日志 archivelog 归档日志模式 (Archivelog Mode)。归档日志模式是一种数据库运行模式&#xff0c;它允许数据库将日志文件保存到归档日志目录中&#xff0c;以便在需要时进行恢复和还原操作。通过开启归档日志模式&#xff0c;可以提高数据库的可靠性…

2023年中国康养产业发展历程、65岁以上人口数量及市场规模分析[图]

​​康养产业在中国吸引了越来越多的资本入场&#xff0c;形成了以房地产业、保险金融业、生物及智能制造为核心的科创企业为代表的康养资本三大主力军。康养资本的快速涌入为康养产业注入了活力&#xff0c;具有资本密集特征和高科技含量的庞大康养产业正日趋成熟。 康养产业…

户外运动盛行,运动品牌如何利用软文推广脱颖而出?

全民健康意识的提升和城市居民对亲近自然的渴望带来户外运动的盛行&#xff0c;这也使运动品牌的市场保持强劲发展势头&#xff0c;那么在激烈的市场竞争中&#xff0c;运动品牌应该如何脱颖而出呢&#xff1f;下面就让媒介盒子告诉你&#xff01; 一、 分享户外运动干货 用户…

【vue+nestjs】gitee第三方授权登录【超详细】

项目场景&#xff1a; 前端使用vue3ts 后端使用nestjs 1.配置gitee第三方设置 1.找到账号设置 2.找到数据管理下的第三方应用 3.点击创建&#xff0c;进入配置 2.代码演示 特别注意: 如果你跟我一样是前后端分离的模式开发的&#xff0c;应用回调地址填写的应该是你的前…

MATLAB——神经网络参考代码

欢迎关注“电击小子程高兴的MATLAB小屋” %% I. 清空环境变量 clear all clc %% II. 训练集/测试集产生 %% % 1. 导入数据 load spectra_data.mat %% % 2. 随机产生训练集和测试集 temp randperm(size(NIR,1)); %打乱60个样本排序 % 训练集——50个样本 P_train NIR(…

Bootstrap Collapse的使用

1、效果图&#xff1a; 2、当点击B或C时&#xff0c;A自动收缩&#xff1a; 3、html代码&#xff1a; <div class"panel-group" id"accordion" role"tablist" aria-multiselectable"true"><div class"panel panel-de…