Kubernetes 之 Egress 思考

本文涉及的产品
公网NAT网关,每月750个小时 15CU
云防火墙,500元 1000GB
简介: “网络周边安全”是任何一个企业运维团队所必须关注的重点。当我们谈到网络界面控制时,我们往往潜意识地先会想到入站安全(入口)。然而,基于流量的运作,例如,何时可以离开网络(出口)以及流向哪里同样至关重要。在这篇文章中,我们将不深入讨论为什么控制出口流量如此重要的理论细节,毕竟,前人已经说的口都干了。因此,本文仅从技术演进层面来探讨关于在云原生生态中“出口”的选型及实现场景。

   “网络周边安全”是任何一个企业运维团队所必须关注的重点。当我们谈到网络界面控制时,我们往往潜意识地先会想到入站安全(入口)。然而,基于流量的运作,例如,何时可以离开网络(出口)以及流向哪里同样至关重要。在这篇文章中,我们将不深入讨论为什么控制出口流量如此重要的理论细节,毕竟,前人已经说的口都干了。因此,本文仅从技术演进层面来探讨关于在云原生生态中“出口”的选型及实现场景。

   在实际的业务场景中,我们往往会遇到如下场景:无论是基于不同业务之间的相互调度所需、或者是基于非法流量及边界业务管控,我们都需要建立我们自己的出口防火墙,以保障我们的业务能够正常运转。具体如下图所示:

    撇开运行时环境状态以及技术壁垒,其实,对于我们而言,往往有多种实现方式,只不过所实现的代价有所不同。在基于云原生生态体系,我们可能需要在 Kubernetes 内部创建一个应用程序,以方便路由所有出站流量以及 DNS 流量。从可用性角度而言,为了满足应用程序的可靠性,往往需要部署多个实例予以支撑,使得其在多实例间均衡输出流量。但此种方案往往会产生状态一致性问题,当一个实例发现一个需要允许的新 IP 时,理想情况下,在 DNS 查询完成之前,它需要非常快速地将其与其他实例建立通信,这是有可能的,但是,会给系统增加很多复杂性,其性价比不高。

   对于流量出口方面的规划,时至今日,无论基于何种业务场景,目前,主要有以下3种模型可供选择,因此,需要基于自身的需求进行方案的选型,具体如下所示:

    1、限制出口流量

    2、NAT 映射

    3、出口网关

    限制出口流量

   限制群集的传出连接是一项常见的安全要求和最佳做法。通常,这是通过使用网络策略为每个微服务定义出口规则来实现的,通常将其与确保默认情况下拒绝出站连接的默认拒绝策略结合使用,直到定义了明确允许特定流量的策略。

    使用 Kubernetes 网络策略限制对特定外部资源的访问时的一个限制是,需要在策略规则内将外部资源指定为 IP 地址(或IP地址范围)。如果与外部资源关联的 IP 地址发生了变化,则引用这些 IP 地址的每个策略都需要使用新的IP地址进行更新。可以使用 Calico 网络集或 Calico Enterprise 在策略规则中对域名的支持来规避此限制。

   除了使用网络策略外,服务网格通常还允许我们自定义配置每个 Pod 可以访问哪些外部服务。对于 Istio,可以集成 Calico 在服务网格层上实施网络策略,包括 L5-7 规则,作为在规则中使用 IP 地址的另一种选择。

   请注意,除了到目前为止提到的所有内容之外,外围防火墙还可以用于限制传出连接,例如,仅允许连接到特定的外部 IP 地址范围或外部服务。但是,由于外围防火墙通常无法区分各个 Pod,因此这些规则同样适用于群集中的所有 Pod 。这提供了一定程度的防御,但不能替代对网络策略的要求。

NAT 映射

   通常,NAT网络地址转换)是在数据包通过执行 NAT 的设备时将数据包中的 IP 地址映射到其他 IP 地址的过程。依据不同场景的使用情况,NAT 可以应用于源 IP 地址或目标 IP 地址,也可以应用于两个地址。

   在 Kubernetes 出口的上下文中,如果 Pod 具有无法在集群外部路由的 IP 地址(例如,如果 Pod 网络是覆盖网络),则使用 NAT 允许 Pod 连接到集群外部的服务。例如,如果覆盖网络中的 Pod 尝试连接到群集外部的 IP 地址,则托管 Pod 的节点将使用SNAT(源网络地址转换)将数据包的不可路由源 IP 地址映射到 IP 地址。在数据包上转发之前,该节点的 IP 地址。然后,该节点将相反方向的响应数据包映射回原始的 Pod IP 地址,因此数据包在两个方向上都端对端流动,而 Pod 或外部服务均不知道正在发生映射。

   在大多数群集中,此 NAT 行为是在整个群集中静态配置的。使用 Calico 时,可以使用 IP 池在特定地址范围内以更精细的级别配置 NAT 行为。这有效地使“不可路由”的范围比“仅在集群内部而不是在集群外部”更严格地定义,这在某些企业部署方案中很有用。

出口网关

  Kubernetes 出口的另一种方法是通过一个或多个出口网关路由所有出站连接。网关SNAT(源网络地址转换)连接,因此连接到的外部服务会将连接视为来自出口网关。主要用例是通过出口网关在其允许的连接方面执行直接的安全角色或与外围防火墙(或其他外部实体)结合来提高安全性。例如,以便外围防火墙可以看到来自知名 IP 地址(出口网关)的连接,而不是来自其动态 Pod IP 地址的连接。

   接下来,我们以 Istio 为例,简要阐述一下 Egress Gateway 实现场景,具体场景如下:在我们的 Case 中的应用程序命名空间中有两个应用程序:APP-A 和 APP-B,我们希望可以实现以下目标:

    1、默认情况下,拒绝从场景中的应用程序命名空间访问所有外部服务。

    2、显式允许以下应用程序→外部服务连接:应用程序 A→http://github.com网站;应用程序 A→http://httpbin.org网站;应用程序 B→http://谷歌网站。

    3、确保所有对外部服务的调用都通过专用出口网关。

    4、能够有效支持 HTTPS 和普通 HTTP 调用。

     简要结构示意图如下所示:

(此图源自网络)

   基于上述结构示意图,在实际的业务场景中,只需正确配置一些 Istio 资源,如出口网关部署和服务、边车、网关、虚拟服务和服务入口,以便能够借助 Istio 实现对我们的出口流量的管控与追踪。

   因此,我们可以简单试想下,若存在一个应用程序列表和一个希望从应用程序访问的外部服务列表,然后简单地选择允许哪些连接。我们可以借助自动的出口控制机制,例如, UI 或 CLI,或者其他声明性方法,并确定它们之间允许哪些连接,所有必要的资源都将在后台自动创建和维护,基于此种场景,何尝不是一种先进的理念呢?

   在安全层面,可以借助 Sidecar 代理,限制某些连接的访问以实现服务流量能够运行在专用的网关通道。同时,基于授权策略,使得我们能够对 Mesh 中的工作负载进行访问控制。

   综上所述,在后续的微服务发展历程中,我们可以毫无压力地将“服务网格”视为云原生生态领域堆栈体系中的具有划时代意义的关键组件。毕竟,若能够基于云操作化和自动化服务 Mesh,势必将会使得基于不同业务场景所构建和运行基于 Istio 的 Mesh 变得轻而易举,从而解放劳动力。站在另外角度,从某种意义上而言,无论是基于安全而言还是生态的成熟性,着实解决了某些业务领域的痛点。

   综上所述,基于容器 K8S 生态中 “Egress“ 机制的相关思考,本文到此为止,大家有任何问题或建议,可以随时留言、沟通。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
Kubernetes 负载均衡 应用服务中间件
【K8S系列】第十三讲:Ingress详解
【K8S系列】第十三讲:Ingress详解
7220 0
|
Rust API 开发者
【一起学Rust | 框架篇 | ws-rs框架】属于Rust的Websocket框架——ws-rs
【一起学Rust | 框架篇 | ws-rs框架】属于Rust的Websocket框架——ws-rs
1436 0
|
人工智能 算法 机器人
语音识别接口 - ASR性能指标WER/SER
做人工智能测试,准确一点,做语音聊天机器人、智能音箱等测试,一定会接触到语音误别即ASR (Automatic Speech Recognition)。本篇主要讲ASR的几个最重要的指标字错率、句错率。
2191 0
|
存储 缓存 关系型数据库
RBD与Cephfs
RBD与Cephfs
259 6
|
12月前
|
消息中间件 安全 Kafka
Kafka支持SSL/TLS协议技术深度解析
SSL(Secure Socket Layer,安全套接层)及其继任者TLS(Transport Layer Security,传输层安全)是为网络通信提供安全及数据完整性的一种安全协议。这些协议在传输层对网络连接进行加密,确保数据在传输过程中不被窃取或篡改。
818 0
|
Kubernetes jenkins 持续交付
Jenkins 与 Kubernetes 的集成:实现高效的资源管理和自动化部署
【8月更文第31天】随着微服务架构的普及,Kubernetes 已经成为了容器编排的事实标准。Kubernetes 提供了一种强大的方式来管理容器化的应用程序,而 Jenkins 则是持续集成与持续部署(CI/CD)领域的一个重要工具。将 Jenkins 与 Kubernetes 集成,不仅可以充分利用 Kubernetes 的资源管理能力,还能通过 Jenkins 实现自动化构建、测试和部署,从而提高开发效率和部署速度。本文将详细介绍如何将 Jenkins 集成到 Kubernetes 环境中,并提供具体的代码示例。
1122 0
|
运维 Kubernetes 调度
【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路
【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路
|
监控 安全 物联网
云上智能安防:构建未来安全防护的新纪元
促进安防行业的创新与发展:云上智能安防系统的出现,推动了安防行业的创新与发展。通过引入云计算、大数据、物联网和人工智能等先进技术,安防行业实现了从传统模式向智能化、网络化和可视化的转变。这将有助于安防行业更好地满足市场需求,提升行业整体竞争力
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的汽车维修预约服务系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的汽车维修预约服务系统的详细设计和实现(源码+lw+部署文档+讲解等)
154 0
|
消息中间件 监控 Cloud Native
阿里云云原生微服务高级工程师认证(ACP级-Alibaba Cloud Certification Professional)考试大纲
介绍阿里云云原生微服务高级工程师认证(ACP级-Alibaba Cloud Certification Professional)所需具备的知识及学习方法等。
940 1