保护 Kubernetes 主机

Protect Kubernetes hosts

我有一个带有 calico 的 kubernetes 集群。我想防止路由通过外部接口到达集群的内部 clusterIPs。我打算使用 this.

应该为哪些接口定义hostendpoint?是只有 Kubernetes 被通告的接口,还是集群中所有的外部接口?

你提到的文章中的例子有:spec.interfaceName: eth0。你试过了吗?

For each host point that you want to secure with policy, you must create a HostEndpoint object. To do that, you need the name of the Calico node on the host that owns the interface; in most cases, it is the same as the hostname of the host.

In the following example, we create a HostEndpoint for the host named my-host with the interface named eth0, with IP 10.0.0.1. Note that the value for node: must match the hostname used on the Calico node object.

When the HostEndpoint is created, traffic to or from the interface is dropped unless policy is in place.

apiVersion: projectcalico.org/v3
kind: HostEndpoint
metadata:
  name: my-host-eth0
  labels:
    role: k8s-worker
    environment: production
spec:
  interfaceName: eth0
  node: my-host
  expectedIPs: ["10.0.0.1"]

您应该为每个您希望block/filter 传输流量的网络接口以及集群中的每个节点定义一个 HostEndpoint,因为这种类型的给定 HostEndpoint 仅保护一个接口单个节点。

此外,由于在 Calico 中定义 HostEndpoint 会立即阻止所有网络流量流向该节点和网络接口(默认情况下一些“故障安全”端口除外),因此请确保在定义之前准备好网络策略您的 HostEndpoints,因此将允许您要允许的流量。您需要考虑是否需要允许流量 to/from 每个节点上的 kubelet,to/from 您的 DNS 服务器等

一个常见的模式是将 HostEndpoints 用于 public 网络接口,因为它们是最暴露的,而不是用于您的私有网络接口,因为理想情况下,它们用于您的 pod 到 pod 和节点到节点的流量Kubernetes 集群需要才能正常运行。