我有一个运行的 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 并不能阻止它。 应该是?应该使用出口网关来实现我想要实现的目标吗?
这可以通过虚拟服务来实现,例如:
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 页面上的流量管理文章提供了有关虚拟服务的更多信息。