如何使用Calico编写最小的NetworkPolicy来对带有LoadBalancer类型的服务的Kubernetes应用程序进行防火墙保护?

时间:2018-06-28 15:32:43

标签: kubernetes project-calico kubernetes-networkpolicy

我有一个运行Calico的Kubernetes集群作为配置为IP-in-IP封装的覆盖和NetworkPolicy实现,并且我尝试使用以下服务公开一个简单的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地址作为跨节点通信的源地址,如Calico上的ipv4IPIPTunnelAddr字段所示节点对象here(我通过观察通过负载均衡器建立的与nginx应用程序的连接的源IP来推论得出)。因此,我的NetworkPolicy需要允许此类连接。

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

  • Calico版本:3.1.1
  • Kubernetes版本:1.9.7
  • Etcd版本:3.2.17
  • 云提供商:AWS

1 个答案:

答案 0 :(得分:1)

恐怕我们现在还没有一种简单的方法来动态地匹配隧道IP。如果可能的话,最好的解决方案是放弃IPIP。删除该叠加层后,一切都会变得简单得多。

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