场景:在 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 可以直接在控制台设置。
代码语言:txt复制outboundTrafficPolicy:
mode: REGISTRY_ONLY
创建 Service Entry,开放 fox 命名空间对 baidu 的访问权限。
代码如下:
代码语言:txt复制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 也可以访问 )。
代码语言:txt复制# 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 不可以访问
代码语言:txt复制# 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 只可以为 “.” 或 “*”,分别对应着 当前命名空间 和 所有命名空间 有效。