×

关于组播

使用IP组播,数据可以同时广播到多个IP地址。

  • 目前,组播最适合用于低带宽协调或服务发现,而不是高带宽解决方案。

  • 默认情况下,网络策略会影响命名空间中的所有连接。但是,组播不受网络策略的影响。如果在与网络策略相同的命名空间中启用组播,则始终允许它,即使存在`deny-all`网络策略。集群管理员应在启用组播之前考虑其不受网络策略影响的含义。

在AWS Pod上的Red Hat OpenShift Service之间默认禁用组播流量。如果您使用的是OVN-Kubernetes网络插件,则可以基于每个项目启用组播。

启用Pod之间的组播

您可以为您的项目启用Pod之间的组播。

先决条件
  • 安装OpenShift CLI (oc)。

  • 您必须使用具有cluster-admindedicated-admin角色的用户登录到集群。

步骤
  • 运行以下命令以启用项目的组播。将<namespace>替换为您要为其启用组播的项目的命名空间。

    $ oc annotate namespace <namespace> \
        k8s.ovn.org/multicast-enabled=true

    或者,您可以应用以下YAML来添加注释

    apiVersion: v1
    kind: Namespace
    metadata:
      name: <namespace>
      annotations:
        k8s.ovn.org/multicast-enabled: "true"
验证

要验证是否已为项目启用组播,请完成以下步骤

  1. 将当前项目更改为您已为其启用组播的项目。将<project>替换为项目名称。

    $ oc project <project>
  2. 创建一个充当组播接收器的Pod。

    $ cat <<EOF| oc create -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: mlistener
      labels:
        app: multicast-verify
    spec:
      containers:
        - name: mlistener
          image: registry.access.redhat.com/ubi9
          command: ["/bin/sh", "-c"]
          args:
            ["dnf -y install socat hostname && sleep inf"]
          ports:
            - containerPort: 30102
              name: mlistener
              protocol: UDP
    EOF
  3. 创建一个充当组播发送器的Pod。

    $ cat <<EOF| oc create -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: msender
      labels:
        app: multicast-verify
    spec:
      containers:
        - name: msender
          image: registry.access.redhat.com/ubi9
          command: ["/bin/sh", "-c"]
          args:
            ["dnf -y install socat && sleep inf"]
    EOF
  4. 在新终端窗口或选项卡中,启动组播侦听器。

    1. 获取Pod的IP地址

      $ POD_IP=$(oc get pods mlistener -o jsonpath='{.status.podIP}')
    2. 输入以下命令启动组播侦听器

      $ oc exec mlistener -i -t -- \
          socat UDP4-RECVFROM:30102,ip-add-membership=224.1.0.1:$POD_IP,fork EXEC:hostname
  5. 启动组播发送器。

    1. 获取Pod网络IP地址范围

      $ CIDR=$(oc get Network.config.openshift.io cluster \
          -o jsonpath='{.status.clusterNetwork[0].cidr}')
    2. 要发送组播消息,请输入以下命令

      $ oc exec msender -i -t -- \
          /bin/bash -c "echo | socat STDIO UDP4-DATAGRAM:224.1.0.1:30102,range=$CIDR,ip-multicast-ttl=64"

      如果组播正常工作,则之前的命令将返回以下输出

      mlistener