1

我有一个坐在边缘的服务。该服务需要通过 Internet 向某处发送一些内容。

我正在使用 Canal CNI。

我可以定义一个允许出口到互联网而不是集群的其余部分的 NetworkPolicy 吗?

4

1 回答 1

3

像下面这样的东西会起作用:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: only-allow-internet
spec:
  policyTypes:
    - Egress
  # match all pods in the namespace
  podSelector: {}
  egress:
    - to:
        - ipBlock:
            # allow all IPs
            cidr: 0.0.0.0/0
            except:
              # except the private IP ranges: https://en.wikipedia.org/wiki/Private_network
              - 10.0.0.0/8
              - 192.168.0.0/16
              - 172.16.0.0/20

它允许所有 IP(因为每个 IP 都匹配0.0.0.0/0),但 IANA 定义为私有 IP 范围的私有 IP 范围除外。

请注意,这也会破坏 DNS 查找,因为默认情况下 kubernetes pod 使用 Kubernetes 内部的 DNS 服务器。您可以通过在 pod中运行以下命令来验证它:

$ nslookup google.com
$ nslookup google.com 8.8.8.8

第一个将超时,而第二个将起作用。

默认情况下,Kubernetes DNS IP 为10.96.0.10. 您可以通过检查/etc/resolv.confpod 内部来验证它。因此,如果您希望 DNS 查找正常工作,您可能需要NetworkPolicy进一步自定义、定义更具体的 IP 范围以允许 DNS 查找。

或者,您可以在 pod 定义级别定义 DNS。详细信息在这里:https ://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-config

此外,您只能阻止集群 pod/服务范围,而不是阻止所有私有 IP 范围。您可以在kube-apiserver参数中找到它们。

于 2019-07-25T14:15:33.270 回答