1

我有安装了 Istio 的 Kubernetes 集群。我有两个 pod,例如 sleep1 和 sleep2(安装了 curl 的容器)。我想将 istio 配置为允许从 sleep1 到 www.google.com 的流量,并禁止从 sleep2 到 www.google.com 的流量。

所以,我创建了 ServiceEntry:

---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: google
spec:
  hosts: 
  - www.google.com
  - google.com
  ports: 
  - name: http-port
    protocol: HTTP
    number: 80
  resolution: DNS

网关

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: istio-egressgateway
spec:
  selector:
    istio: egressgateway
  servers:
  - port:
      number: 80
      name: http-port
      protocol: HTTP
    hosts:
    - "*"

两个虚拟服务(mesh->egress,egress->google)

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: mesh-to-egress
spec:
  hosts: 
  - www.google.com
  - google.com
  gateways:
  - mesh
  http:
  - match:
    - gateways:
      - mesh
      port: 80
    route:
    - destination:
        host: istio-egressgateway.istio-system.svc.cluster.local
        port:
          number: 80
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: egress-to-google-int
spec:
  hosts: 
  - www.google.com
  - google.com
  gateways:
  - istio-egressgateway
  http:
  - match: 
    - gateways:
      - istio-egressgateway
      port: 80
    route:
    - destination:
        host: google.com
        port:
          number: 80
      weight: 100

结果,我可以从两个 pod 卷曲 google。

又是一个问题:我可以允许从 sleep1 到 www.google.com 的流量并禁止从 sleep2 到 www.google.com 的流量吗?我知道这可能与 kubernetes NetworkPolicy 和黑/白名单(https://istio.io/docs/tasks/policy-enforcement/denial-and-list/)有关,但这两种方法都禁止(允许)流量到特定的 ips 或者我错过了什么?

4

2 回答 2

3

sleep1您可以为和创建不同的服务帐户sleep2。然后您创建一个 RBAC 策略来限制对该istio-egressgateway策略的访问,因此sleep2将无法通过出口网关访问任何出口流量。这应该与禁止来自集群的任何出口流量一起工作,这些流量不是来自出口网关。请参阅https://istio.io/docs/tasks/traffic-management/egress/egress-gateway/#additional-security-considerations

如果您想允许sleep2访问其他服务,但不允许访问www.google.com,您可以使用 Mixer 规则和处理程序,请参阅此博客文章。它显示了如何允许特定的 URL 路径到特定的服务帐户。

于 2019-09-08T13:37:46.543 回答
2

我认为您在拒绝选项上可能走在正确的轨道上。它也不限于 IP,因为我们可能会看到简单拒绝基于属性的拒绝的基于属性的示例

因此,例如,如果我们为 Sleep2 -> www.google.com 编写一个简单的拒绝规则:

apiVersion: "config.istio.io/v1alpha2"
kind: handler
metadata:
  name: denySleep2Google
spec:
  compiledAdapter: denier
  params:
    status:
      code: 7
      message: Not allowed
---
apiVersion: "config.istio.io/v1alpha2"
kind: instance
metadata:
  name: denySleep2GoogleRequest
spec:
  compiledTemplate: checknothing
---
apiVersion: "config.istio.io/v1alpha2"
kind: rule
metadata:
  name: denySleep2
spec:
  match: destination.service.host == "www.google.com" && source.labels["app"]=="sleep2"
  actions:
  - handler: denySleep2Google
    instances: [ denySleep2GoogleRequest ]

请检查,看看这是否有帮助。此外,“规则”条目中的“匹配”字段基于属性周围的 istio 表达式语言。一些词汇可以在这个文档中找到。

于 2019-09-09T01:58:13.250 回答