0

我有一个运行 Calico 作为覆盖和 NetworkPolicy 实现的 Kubernetes 集群,为 IP-in-IP 封装配置,我正在尝试使用以下服务公开一个简单的 nginx 应用程序:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx

我正在尝试编写一个仅允许通过负载均衡器进行连接的 NetworkPolicy。在没有覆盖的集群上,这可以通过允许来自用于将 IP 分配给工作程序实例本身的 CIDR 的连接来实现 - 这允许连接在特定工作程序上访问服务的 NodePort 并转发到后面的容器之一通过 IPTables 规则服务。但是,当使用配置为 IP-in-IP 的 Calico 时,通过 NodePort 建立的连接使用 Calico 的 IP-in-IP 隧道 IP 地址作为跨节点通信的源地址,如此ipv4IPIPTunnelAddr处 Calico Node 对象上的字段所示(I通过观察通过负载均衡器连接到 nginx 应用程序的源 IP 来推断这一点)。因此,我的 NetworkPolicy 需要允许这样的连接。

我的问题是如何在不ipv4IPIPTunnelAddr事先知道值且不允许来自集群中所有 Pod 的连接的情况下允许这些类型的连接(因为这些ipv4IPIPTunnelAddr值是从集群的 Pod CIDR 范围中提取的)。如果工作实例出现并死亡,这些 IP 的列表肯定会发生变化,我不希望我的 NetworkPolicy 规则依赖于它们。

  • 印花布版本:3.1.1
  • Kubernetes 版本:1.9.7
  • 等版本:3.2.17
  • 云提供商:AWS
4

1 回答 1

1

恐怕我们现在没有一种简单的方法来动态匹配隧道 IP。如果可能,最好的解决方案是远离 IPIP;一旦你移除了那个覆盖层,一切都会变得简单得多。

如果您想知道,我们需要强制节点使用隧道 IP,因为如果您要起诉 IPIP,我们假设您的网络不允许直接的 pod 到节点返回流量(因为网络不会不要期待它可能会丢弃数据包的 pod IP)

于 2018-06-29T09:27:26.627 回答