Enabling multicast for a project

About multicast

With IP multicast, data is broadcast to many IP addresses simultaneously.

At this time, multicast is best used for low-bandwidth coordination or service discovery and not a high-bandwidth solution.

Multicast traffic between OKD pods is disabled by default. If you are using the OVN-Kubernetes default Container Network Interface (CNI) network provider, you can enable multicast on a per-project basis.

Enabling multicast between pods

You can enable multicast between pods for your project.

Prerequisites

  • Install the OpenShift CLI (oc).

  • You must log in to the cluster with a user that has the cluster-admin role.

Procedure

  • Run the following command to enable multicast for a project. Replace <namespace> with the namespace for the project you want to enable multicast for.

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

    You can alternatively apply the following YAML to add the annotation:

    1. apiVersion: v1
    2. kind: Namespace
    3. metadata:
    4. name: <namespace>
    5. annotations:
    6. k8s.ovn.org/multicast-enabled: true

Verification

To verify that multicast is enabled for a project, complete the following procedure:

  1. Change your current project to the project that you enabled multicast for. Replace <project> with the project name.

    1. $ oc project <project>
  2. Create a pod to act as a multicast receiver:

    1. $ cat <<EOF| oc create -f -
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: mlistener
    6. labels:
    7. app: multicast-verify
    8. spec:
    9. containers:
    10. - name: mlistener
    11. image: registry.access.redhat.com/ubi8
    12. command: ["/bin/sh", "-c"]
    13. args:
    14. ["dnf -y install socat hostname && sleep inf"]
    15. ports:
    16. - containerPort: 30102
    17. name: mlistener
    18. protocol: UDP
    19. EOF
  3. Create a pod to act as a multicast sender:

    1. $ cat <<EOF| oc create -f -
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: msender
    6. labels:
    7. app: multicast-verify
    8. spec:
    9. containers:
    10. - name: msender
    11. image: registry.access.redhat.com/ubi8
    12. command: ["/bin/sh", "-c"]
    13. args:
    14. ["dnf -y install socat && sleep inf"]
    15. EOF
  4. Start the multicast listener.

    1. Get the IP address for the Pod:

      1. $ POD_IP=$(oc get pods mlistener -o jsonpath='{.status.podIP}')
    2. To start the multicast listener, in a new terminal window or tab, enter the following command:

      1. $ oc exec mlistener -i -t -- \
      2. socat UDP4-RECVFROM:30102,ip-add-membership=224.1.0.1:$POD_IP,fork EXEC:hostname
  5. Start the multicast transmitter.

    1. Get the pod network IP address range:

      1. $ CIDR=$(oc get Network.config.openshift.io cluster \
      2. -o jsonpath='{.status.clusterNetwork[0].cidr}')
    2. To send a multicast message, enter the following command:

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

      If multicast is working, the previous command returns the following output:

      1. mlistener