互站网,泉州市第一建设有限公司网站,赣州哪里做网站,网站搭建素材群文章目录 访问外部服务Envoy 代理将请求传递给网格外服务配置服务条目以提供对外部服务的受控访问访问外部 HTTP 服务 直接访问外部服务 出口网关清理 HTTP 网关其他 访问外部服务
为了更好的做好网络访问控制#xff0c;k8s结合Istio出口网络升级示意图
来自 Istio 的 pod… 文章目录 访问外部服务Envoy 代理将请求传递给网格外服务配置服务条目以提供对外部服务的受控访问访问外部 HTTP 服务 直接访问外部服务 出口网关清理 HTTP 网关其他 访问外部服务
为了更好的做好网络访问控制k8s结合Istio出口网络升级示意图
来自 Istio 的 pod 的所有出站流量都会重定向到其 sidecar 代理因此集群外部 URL 的可访问性取决于代理的配置。默认情况下Istio 配置 Envoy 代理来传递未知服务的请求。 一般来说服务访问网格外部服务默认放行但是如果想要严格管控网格流量需要对出方向进行管控。
这里展示三种不同的方式访问外部服务
允许 Envoy 代理将请求传递给网格外服务。配置服务条目以提供对外部服务的受控访问。直接访问外部服务。
Envoy 代理将请求传递给网格外服务
Istio 有一个配置: meshConfig.outboundTrafficPolicy.mode用于配置外部服务的 sidecar 处理如果此选项设置为ALLOW_ANYIstio 代理将允许对未知服务的调用通过。如果该选项设置为REGISTRY_ONLY则 Istio 代理会阻止任何没有 HTTP 服务或网格内定义的服务条目的主机。 ALLOW_ANY是默认值目的是允许快速开始使用 Istio而无需控制对外部服务的访问。
配置服务条目以提供对外部服务的受控访问
Service Entry服务条目允许在Istio的内部服务注册表中添加额外的服务记录以便网格中自动发现的服务可以访问或路由到这些手动指定的服务。如果我们想要控制出口网络必须先要设置ServiceEntry 正常情况我们对外访问先设置为ALLOW_ANY。这样就可以开始在某些外部服务上使用 Istio 功能而不会阻止任何其他服务。配置完所有服务条目后可以将模式切换为REGISTRY_ONLY阻止任何其他无意/恶意的访问。
访问外部 HTTP 服务
创建一个ServiceEntry以允许访问外部 HTTP 服务httpbin-ext.yml
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:name: httpbin-ext
spec:hosts:- httpbin.orgports:- number: 80name: httpprotocol: HTTPresolution: DNSlocation: 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.includeIPRanges172.16.0.0/16
要以更安全的方式实施出口流量控制必须通过出口网关引导出口流量并查看其他注意事项
出口网关
Istio 使用入口和出口网关 来配置在服务网格边缘执行的负载均衡器。入口网关允许定义所有传入流量流经的网格的入口点。出口网关是一个对称的概念它定义了网格的出口点。出口网关允许 Istio 功能例如监控和路由规则应用于网格出口流量。
检查Istio出口网关是否部署
$ kubectl get pod -l istioegressgateway -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: egressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- httpbin.org
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: egressgateway-for-httpbin
spec:host: istio-egressgateway.istio-system.svc.cluster.localsubsets:- name: httpbin定义 VirtualService将流量从 sidecar 引导至出口网关以及从出口网关引导至外部服务
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: direct-httpbin-through-egress-gateway
spec:hosts:- httpbin.orggateways:- istio-egressgateway- meshhttp:- match:- gateways:- meshport: 80route:- destination:host: istio-egressgateway.istio-system.svc.cluster.localsubset: httpbinport:number: 80weight: 100- match:- gateways:- istio-egressgatewayport: 80route:- destination:host: httpbin.orgport:number: 80weight: 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 设备以丢弃并非源自出口网关的数据包。