我如何使用 Calico 编写一个最小的 NetworkPolicy 来为具有 LoadBalancer 类型服务的 Kubernetes 应用程序设置防火墙?
How can I write a minimal NetworkPolicy to firewall a Kubernetes application with a Service of type LoadBalancer using Calico?
我有一个 Kubernetes 集群 运行 Calico 作为覆盖层和 NetworkPolicy 实现配置为 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 的连接来实现 - 这允许连接命中特定工作人员上的服务节点端口并转发到后面的容器之一通过 IPTables 规则提供服务。但是,当使用为 IP-in-IP 配置的 Calico 时,通过 NodePort 建立的连接使用 Calico 的 IP-in-IP 隧道 IP 地址作为跨节点通信的源地址,如 Calico 上的 ipv4IPIPTunnelAddr
字段所示节点对象 here(我通过观察通过负载均衡器连接到 nginx 应用程序的源 IP 推断出这一点)。因此,我的 NetworkPolicy 需要允许此类连接。
我的问题是如何在事先不知道 ipv4IPIPTunnelAddr
值并且不允许来自集群中所有 Pods 的连接的情况下允许这些类型的连接(因为 ipv4IPIPTunnelAddr
值是从集群的 Pod CIDR 范围中提取)。如果工作实例出现并死亡,此类 IP 的列表肯定会发生变化,我不希望我的 NetworkPolicy 规则依赖于它们。
- 印花布版本:3.1.1
- Kubernetes 版本:1.9.7
- etcd版本:3.2.17
- 云提供商:AWS
恐怕我们现在没有简单的方法来动态匹配隧道 IP。如果可能,最好的解决方案是远离 IPIP;删除该覆盖层后,一切都会变得简单得多。
如果您想知道,我们需要强制节点使用隧道 IP,因为如果您起诉 IPIP,我们假设您的网络不允许直接 pod 到节点 return 流量(因为网络不会期望 pod IP,它可能会丢弃数据包)
我有一个 Kubernetes 集群 运行 Calico 作为覆盖层和 NetworkPolicy 实现配置为 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 的连接来实现 - 这允许连接命中特定工作人员上的服务节点端口并转发到后面的容器之一通过 IPTables 规则提供服务。但是,当使用为 IP-in-IP 配置的 Calico 时,通过 NodePort 建立的连接使用 Calico 的 IP-in-IP 隧道 IP 地址作为跨节点通信的源地址,如 Calico 上的 ipv4IPIPTunnelAddr
字段所示节点对象 here(我通过观察通过负载均衡器连接到 nginx 应用程序的源 IP 推断出这一点)。因此,我的 NetworkPolicy 需要允许此类连接。
我的问题是如何在事先不知道 ipv4IPIPTunnelAddr
值并且不允许来自集群中所有 Pods 的连接的情况下允许这些类型的连接(因为 ipv4IPIPTunnelAddr
值是从集群的 Pod CIDR 范围中提取)。如果工作实例出现并死亡,此类 IP 的列表肯定会发生变化,我不希望我的 NetworkPolicy 规则依赖于它们。
- 印花布版本:3.1.1
- Kubernetes 版本:1.9.7
- etcd版本:3.2.17
- 云提供商:AWS
恐怕我们现在没有简单的方法来动态匹配隧道 IP。如果可能,最好的解决方案是远离 IPIP;删除该覆盖层后,一切都会变得简单得多。
如果您想知道,我们需要强制节点使用隧道 IP,因为如果您起诉 IPIP,我们假设您的网络不允许直接 pod 到节点 return 流量(因为网络不会期望 pod IP,它可能会丢弃数据包)