允许某些服务通过 Istio 连接到其他服务的最简单方法

问题描述 投票:0回答:1

我有一个运行的 kubernetes 集群,并为所使用的命名空间启用了 Istio 注入。 每个 Pod 有两个容器,一个是常用容器,另一个是额外的 Envoy 代理容器。 我想强制访问服务,我有 17 个服务,并且我希望服务 A(第一个)只能连接到大约 10 个可能的服务(16 个服务中的 10 个)。 我创建了一个包含以下内容的 Sidecar yaml 文件:

apiVersion: networking.istio.io/v1alpha3
kind: Sidecar
metadata:
  name: service-a-sidecar
  namespace: default
spec:
  workloadSelector:
    labels:
      app: service-a
  egress:
  - hosts:
    - "./service-b.default.svc.cluster.local"
    - "./service-c.default.svc.cluster.local"
    - "./service-d.default.svc.cluster.local"
    - "istio-system/*"

我希望 service-a 能够连接到 service-e,但我尚未将其添加到此 sidecar YAML 文件中,因为我有一些调用暗示 service-a => service-e 连接,我想验证这一点该文件将阻止连接。 所以我应用这个文件

 kubectl apply -f this.yaml

并杀死应用程序标签等于 service-a 的 pod。 当它重新启动时,我在应用程序中执行一些操作,这将意味着 service-a 和 service-e 之间的通信。上面的 sidecar 并不能阻止它。 应该是?应该使用出口网关来实现我想要实现的目标吗?

istio istio-sidecar
1个回答
0
投票

这可以通过虚拟服务来实现,例如:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: a-e-blocker
spec:
  gateways:
  - mesh
  hosts:
  - service-b.default.svc.cluster.local
  http:
  - name: match-service-a
    match:
    - sourceLabels:
        service: a
    directResponse:
      status: 503
      body:
        string: "Not allowed"
        

这将创建一条适用于服务 b 的规则,并将匹配来自标签为

service: a
的流量(请注意,您必须将此标签添加到服务 a 才能正常工作)。当匹配时,它将返回
503
的响应。

Istio 页面上的流量管理文章提供了有关虚拟服务的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.