在 istio 中限制 namespace 访问外部资源

时间:2022-07-22
本文章向大家介绍在 istio 中限制 namespace 访问外部资源,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

场景:在 istio 集群中,需要使用 namespace 来隔离资源,为特定 namespace 开放集群外访问白名单。

在 istio 的 Service Entry 文档中,我们可以找到相关的功能,关键字是 exportTo,以下是试验过程:

本示例使用了 腾讯云 tcm-demo 做为试验,具体参见:https://github.com/TencentCloudContainerTeam/tcm-demo

需要至少部署 2 个 namespace 的应用,本示例部署了 base 和 fox 两个命名空间及应用。

首先将 Istio 集群的外部访问设置为 REGISTRY_ONLY(修改 ConfigMap 的 istio 配置),腾讯云 TCM 可以直接在控制台设置。

outboundTrafficPolicy:
  mode: REGISTRY_ONLY

创建 Service Entry,开放 fox 命名空间对 baidu 的访问权限。

代码如下:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: baidu-external
  namespace: fox
spec:
  hosts:
  - www.baidu.com
  exportTo:
  - "."
  ports:
  - number: 443
    name: https
    protocol: TLS
  resolution: DNS
  location: MESH_EXTERNAL

通过测试:

1 带有 sidecar 的 fox 命名空间下的 pod 可以访问 (没有 sidecar 的 pod 也可以访问 )。

# wget -qSO- https://www.baidu.com
  HTTP/1.1 200 OK
  Content-Length: 2443
  Content-Type: text/html
  Server: bfe
  Date: Wed, 05 Aug 2020 08:09:24 GMT
  Connection: close
  
<!DOCTYPE html>
...

2 带有 sidecar 的 其他命名空间下的 pod 不可以访问

# wget -qSO- https://www.baidu.com
ssl_client: www.baidu.com: handshake failed: unexpected EOF
wget: error getting response: Connection reset by peer

上面的配置中,起到关键作用的是 namespace 和 exportTo 两项配置。

按照官方文档:当前 exportTo 只可以为 “.” 或 “*”,分别对应着 当前命名空间 和 所有命名空间 有效。