Kubernetes pod 可以关联多个 IP 地址吗?

ser*_*y_o 2 kubernetes

简短的问题:

Kubernetes Pod 有没有办法关联多个 IP 地址?

即使只有环回?

更长的解释:

我有一个应用程序需要部署在 Kubernetes Pod 中并使用 Cassandra。Cassandra 本身位于防火墙后面,出于管理原因,无法打开该防火墙以从托管 K8S 环境的外部云进行直接 IP 访问。相反,我必须开发一个通过自定义隧道的中继。

应用程序内的 Cassandra 驱动程序将不会指向真正的 Cassandra 集群,而是指向中继,然后中继将建立隧道连接。

我非常喜欢在 Pod 本身内部运行中继(在应用程序容器内部更好),以最大程度地减少数据遍历的数量,因为数据传输速率会相当高,并且还可以最大程度地减少明显故障的数量要管理的点和组件,还提供与应用程序副本共同缩放的措施(应用程序是自动缩放的,可能会扩展到大量副本)。

然而问题是Cassandra驱动程序通过节点IP地址连接到Cassandra集群中的每个节点,例如,如果Cassandra集群是三个节点,则驱动程序连接到node1:9042、node2:9042和node3:9042。端口号由所有连接强制共享。驱动程序不允许指定node1:9042、node2:9043 和node3:9044。因此,我无法让驱动程序连接到 thispod:9042、thispod:9043 和 thispod:9044。如果可能的话,我可以在容器内运行一个中继,侦听三个端口,然后转发连接。但是,由于 Cassandra 驱动程序的限制,中继侦听端点必须具有不同的 IP 地址(我宁愿避免必须制作驱动程序的自定义修改版本来解除此限制)。

这给我们带来了一个问题:Pod 是否可以关联额外的 IP 地址?

地址的类型并不重要,只要容器或 Pod 内可以向该地址发送数据并从该地址接收数据即可。通信本质上是容器或 Pod 内的环回。如果它是非容器化环境,而是普通的 Linux VM,我可以创建额外的环回接口来解决问题。但容器内部无法创建接口。

有没有办法让 Kubernetes 将额外的 IP 地址关联到 pod?

Mar*_* K. 6

要将其他 IP 地址与 pod 关联,您可以使用Multus CNI。它允许您将多个网络接口附加到 pod。它需要一个默认的 CNI 来进行 Pod 到 Pod 的通信(即 Calico、Flannel)。

它的工作原理是创建一个NetworkAttachmentDefinition CRD,然后将其添加到pod 清单中的注释字段中。除此之外,您还可以为接口定义默认路由。用法示例:

CRD定义

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: macvlan-conf
spec:
  config: '{
      "cniVersion": "0.3.0",
      "type": "macvlan",
      "master": "eth0",
      "mode": "bridge",
      "ipam": {
        "type": "host-local",
        "subnet": "192.168.1.0/24",
        "rangeStart": "192.168.1.200",
        "rangeEnd": "192.168.1.216",
        "routes": [
          { "dst": "0.0.0.0/0" }
        ],
        "gateway": "192.168.1.1"
      }
    }'
Run Code Online (Sandbox Code Playgroud)

Pod 清单:

apiVersion: v1
kind: Pod
metadata:
  name: samplepod
  annotations:
    k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
  containers:
  - name: samplepod
    command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
    image: alpine
Run Code Online (Sandbox Code Playgroud)

当您在 pod 运行时执行它时,您可以看到创建了一个附加接口:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1440 qdisc noqueue state UP 
    link/ether 86:75:ed:87:a1:1a brd ff:ff:ff:ff:ff:ff
    inet 192.168.171.65/32 scope global eth0
       valid_lft forever preferred_lft forever
3: net1@tunl0: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1460 qdisc noqueue state UP 
    link/ether 1a:58:6e:88:fb:f5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.200/24 scope global net1
       valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)