--- apiVersion: apps/v1 kind: DaemonSet metadata: annotations: deprecated.daemonset.template.generation: "1" kubernetes.io/description: | This daemon installs and configures auxiliary CNI plugins on each node. release.openshift.io/version: 4.18.25 creationTimestamp: "2025-10-11T10:27:13Z" generation: 1 labels: networkoperator.openshift.io/generates-operator-status: stand-alone managedFields: - apiVersion: apps/v1 fieldsType: FieldsV1 fieldsV1: f:metadata: f:annotations: f:kubernetes.io/description: {} f:release.openshift.io/version: {} f:labels: f:networkoperator.openshift.io/generates-operator-status: {} f:ownerReferences: k:{"uid":"216d30b3-cc7f-49b9-949f-43cde8dd9ab2"}: {} f:spec: f:selector: {} f:template: f:metadata: f:annotations: f:cluster-autoscaler.kubernetes.io/enable-ds-eviction: {} f:target.workload.openshift.io/management: {} f:labels: f:app: {} f:component: {} f:openshift.io/component: {} f:type: {} f:spec: f:containers: k:{"name":"kube-multus-additional-cni-plugins"}: .: {} f:args: {} f:command: {} f:image: {} f:name: {} f:resources: f:requests: f:cpu: {} f:memory: {} f:securityContext: f:privileged: {} f:terminationMessagePolicy: {} f:hostNetwork: {} f:initContainers: k:{"name":"bond-cni-plugin"}: .: {} f:command: {} f:env: k:{"name":"DEFAULT_SOURCE_DIRECTORY"}: .: {} f:name: {} f:value: {} k:{"name":"RHEL8_SOURCE_DIRECTORY"}: .: {} f:name: {} f:value: {} k:{"name":"RHEL9_SOURCE_DIRECTORY"}: .: {} f:name: {} f:value: {} f:image: {} f:name: {} f:terminationMessagePolicy: {} f:volumeMounts: k:{"mountPath":"/entrypoint"}: .: {} f:mountPath: {} f:name: {} k:{"mountPath":"/host/etc/os-release"}: .: {} f:mountPath: {} f:name: {} f:readOnly: {} k:{"mountPath":"/host/opt/cni/bin"}: .: {} f:mountPath: {} f:name: {} k:{"name":"cni-plugins"}: .: {} f:command: {} f:env: k:{"name":"DEFAULT_SOURCE_DIRECTORY"}: .: {} f:name: {} f:value: {} k:{"name":"RHEL8_SOURCE_DIRECTORY"}: .: {} f:name: {} f:value: {} k:{"name":"RHEL9_SOURCE_DIRECTORY"}: .: {} f:name: {} f:value: {} f:image: {} f:name: {} f:terminationMessagePolicy: {} f:volumeMounts: k:{"mountPath":"/entrypoint"}: .: {} f:mountPath: {} f:name: {} k:{"mountPath":"/host/etc/cni/tuning/"}: .: {} f:mountPath: {} f:name: {} f:readOnly: {} k:{"mountPath":"/host/etc/os-release"}: .: {} f:mountPath: {} f:name: {} f:readOnly: {} k:{"mountPath":"/host/opt/cni/bin"}: .: {} f:mountPath: {} f:name: {} k:{"mountPath":"/sysctls"}: .: {} f:mountPath: {} f:name: {} k:{"name":"egress-router-binary-copy"}: .: {} f:command: {} f:env: k:{"name":"DEFAULT_SOURCE_DIRECTORY"}: .: {} f:name: {} f:value: {} k:{"name":"RHEL8_SOURCE_DIRECTORY"}: .: {} f:name: {} f:value: {} k:{"name":"RHEL9_SOURCE_DIRECTORY"}: .: {} f:name: {} f:value: {} f:image: {} f:name: {} f:terminationMessagePolicy: {} f:volumeMounts: k:{"mountPath":"/entrypoint"}: .: {} f:mountPath: {} f:name: {} k:{"mountPath":"/host/etc/os-release"}: .: {} f:mountPath: {} f:name: {} f:readOnly: {} k:{"mountPath":"/host/opt/cni/bin"}: .: {} f:mountPath: {} f:name: {} k:{"name":"routeoverride-cni"}: .: {} f:command: {} f:env: k:{"name":"DEFAULT_SOURCE_DIRECTORY"}: .: {} f:name: {} f:value: {} k:{"name":"RHEL8_SOURCE_DIRECTORY"}: .: {} f:name: {} f:value: {} k:{"name":"RHEL9_SOURCE_DIRECTORY"}: .: {} f:name: {} f:value: {} f:image: {} f:name: {} f:terminationMessagePolicy: {} f:volumeMounts: k:{"mountPath":"/entrypoint"}: .: {} f:mountPath: {} f:name: {} k:{"mountPath":"/host/etc/os-release"}: .: {} f:mountPath: {} f:name: {} f:readOnly: {} k:{"mountPath":"/host/opt/cni/bin"}: .: {} f:mountPath: {} f:name: {} k:{"name":"whereabouts-cni"}: .: {} f:command: {} f:env: k:{"name":"CNI_BIN_DIR"}: .: {} f:name: {} f:value: {} k:{"name":"CNI_CONF_DIR"}: .: {} f:name: {} f:value: {} k:{"name":"KUBERNETES_SERVICE_HOST"}: .: {} f:name: {} f:value: {} k:{"name":"KUBERNETES_SERVICE_PORT"}: .: {} f:name: {} f:value: {} k:{"name":"NODENAME"}: .: {} f:name: {} f:valueFrom: f:fieldRef: {} k:{"name":"SLEEP"}: .: {} f:name: {} f:value: {} k:{"name":"WHEREABOUTS_NAMESPACE"}: .: {} f:name: {} f:value: {} f:image: {} f:name: {} f:resources: f:requests: f:cpu: {} f:memory: {} f:terminationMessagePolicy: {} f:volumeMounts: k:{"mountPath":"/etc/whereabouts/config"}: .: {} f:mountPath: {} f:name: {} k:{"mountPath":"/host/etc/cni/net.d"}: .: {} f:mountPath: {} f:name: {} k:{"mountPath":"/host/opt/cni/bin"}: .: {} f:mountPath: {} f:name: {} k:{"name":"whereabouts-cni-bincopy"}: .: {} f:command: {} f:env: k:{"name":"DEFAULT_SOURCE_DIRECTORY"}: .: {} f:name: {} f:value: {} k:{"name":"RHEL8_SOURCE_DIRECTORY"}: .: {} f:name: {} f:value: {} k:{"name":"RHEL9_SOURCE_DIRECTORY"}: .: {} f:name: {} f:value: {} f:image: {} f:name: {} f:resources: f:requests: f:cpu: {} f:memory: {} f:terminationMessagePolicy: {} f:volumeMounts: k:{"mountPath":"/entrypoint"}: .: {} f:mountPath: {} f:name: {} k:{"mountPath":"/host/etc/os-release"}: .: {} f:mountPath: {} f:name: {} f:readOnly: {} k:{"mountPath":"/host/opt/cni/bin"}: .: {} f:mountPath: {} f:name: {} f:nodeSelector: {} f:priorityClassName: {} f:serviceAccountName: {} f:terminationGracePeriodSeconds: {} f:tolerations: {} f:volumes: k:{"name":"cni-binary-copy"}: .: {} f:configMap: f:defaultMode: {} f:name: {} f:name: {} k:{"name":"cni-sysctl-allowlist"}: .: {} f:configMap: f:defaultMode: {} f:name: {} f:name: {} k:{"name":"cnibin"}: .: {} f:hostPath: f:path: {} f:name: {} k:{"name":"multus-cni-dir"}: .: {} f:hostPath: f:path: {} f:name: {} k:{"name":"os-release"}: .: {} f:hostPath: f:path: {} f:type: {} f:name: {} k:{"name":"system-cni-dir"}: .: {} f:hostPath: f:path: {} f:name: {} k:{"name":"tuning-conf-dir"}: .: {} f:hostPath: f:path: {} f:type: {} f:name: {} k:{"name":"whereabouts-configmap"}: .: {} f:configMap: f:name: {} f:name: {} f:updateStrategy: f:rollingUpdate: f:maxUnavailable: {} f:type: {} manager: cluster-network-operator/operconfig operation: Apply time: "2025-10-11T10:27:13Z" - apiVersion: apps/v1 fieldsType: FieldsV1 fieldsV1: f:status: f:currentNumberScheduled: {} f:desiredNumberScheduled: {} f:numberAvailable: {} f:numberReady: {} f:observedGeneration: {} f:updatedNumberScheduled: {} manager: kube-controller-manager operation: Update subresource: status time: "2025-10-11T10:39:49Z" name: multus-additional-cni-plugins namespace: openshift-multus ownerReferences: - apiVersion: operator.openshift.io/v1 blockOwnerDeletion: true controller: true kind: Network name: cluster uid: 216d30b3-cc7f-49b9-949f-43cde8dd9ab2 resourceVersion: "20113" uid: 41f9b9b4-1ebd-4b55-87f4-44f6863ad7ee spec: revisionHistoryLimit: 10 selector: matchLabels: app: multus-additional-cni-plugins template: metadata: annotations: cluster-autoscaler.kubernetes.io/enable-ds-eviction: "false" target.workload.openshift.io/management: '{"effect": "PreferredDuringScheduling"}' creationTimestamp: null labels: app: multus-additional-cni-plugins component: network openshift.io/component: network type: infra spec: containers: - args: - | trap : TERM INT; sleep infinity & wait command: - /bin/bash - -ec - -- image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:bd0854905c4929cfbb163b57dd290d4a74e65d11c01d86b5e1e177a0c246106e imagePullPolicy: IfNotPresent name: kube-multus-additional-cni-plugins resources: requests: cpu: 10m memory: 10Mi securityContext: privileged: true terminationMessagePath: /dev/termination-log terminationMessagePolicy: FallbackToLogsOnError dnsPolicy: ClusterFirst hostNetwork: true initContainers: - command: - /entrypoint/cnibincopy.sh env: - name: RHEL8_SOURCE_DIRECTORY value: /usr/src/egress-router-cni/rhel8/bin/ - name: RHEL9_SOURCE_DIRECTORY value: /usr/src/egress-router-cni/rhel9/bin/ - name: DEFAULT_SOURCE_DIRECTORY value: /usr/src/egress-router-cni/bin/ image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:fbde693d384ae08cdaf9126a9a6359bb5515793f63108ef216cbddf1c995af3e imagePullPolicy: IfNotPresent name: egress-router-binary-copy resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: FallbackToLogsOnError volumeMounts: - mountPath: /entrypoint name: cni-binary-copy - mountPath: /host/opt/cni/bin name: cnibin - mountPath: /host/etc/os-release name: os-release readOnly: true - command: - /bin/bash - -c - /entrypoint/cnibincopy.sh && cp -n /sysctls/allowlist.conf /host/etc/cni/tuning/ env: - name: RHEL8_SOURCE_DIRECTORY value: /usr/src/plugins/rhel8/bin/ - name: RHEL9_SOURCE_DIRECTORY value: /usr/src/plugins/rhel9/bin/ - name: DEFAULT_SOURCE_DIRECTORY value: /usr/src/plugins/bin/ image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:6128c3fda0a374e4e705551260ee45b426a747e9d3e450d4ca1a3714fd404207 imagePullPolicy: IfNotPresent name: cni-plugins resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: FallbackToLogsOnError volumeMounts: - mountPath: /entrypoint name: cni-binary-copy - mountPath: /host/opt/cni/bin name: cnibin - mountPath: /host/etc/os-release name: os-release readOnly: true - mountPath: /host/etc/cni/tuning/ name: tuning-conf-dir - mountPath: /sysctls name: cni-sysctl-allowlist - command: - /entrypoint/cnibincopy.sh env: - name: RHEL8_SOURCE_DIRECTORY value: /bondcni/rhel8/ - name: RHEL9_SOURCE_DIRECTORY value: /bondcni/rhel9/ - name: DEFAULT_SOURCE_DIRECTORY value: /bondcni/rhel9/ image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:9c713df8493f490d2cd316861e6f63bc27078cda759dd9dd2817f101f233db28 imagePullPolicy: IfNotPresent name: bond-cni-plugin resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: FallbackToLogsOnError volumeMounts: - mountPath: /entrypoint name: cni-binary-copy - mountPath: /host/opt/cni/bin name: cnibin - mountPath: /host/etc/os-release name: os-release readOnly: true - command: - /entrypoint/cnibincopy.sh env: - name: RHEL8_SOURCE_DIRECTORY value: /usr/src/route-override/rhel8/bin/ - name: RHEL9_SOURCE_DIRECTORY value: /usr/src/route-override/rhel9/bin/ - name: DEFAULT_SOURCE_DIRECTORY value: /usr/src/route-override/bin/ image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:0b95ed8eaa90077acc5910504a338c0b5eea8a9b6632868366d72d48a4b6f2c4 imagePullPolicy: IfNotPresent name: routeoverride-cni resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: FallbackToLogsOnError volumeMounts: - mountPath: /entrypoint name: cni-binary-copy - mountPath: /host/opt/cni/bin name: cnibin - mountPath: /host/etc/os-release name: os-release readOnly: true - command: - /entrypoint/cnibincopy.sh env: - name: RHEL8_SOURCE_DIRECTORY value: /usr/src/whereabouts/rhel8/bin/ - name: RHEL9_SOURCE_DIRECTORY value: /usr/src/whereabouts/rhel9/bin/ - name: DEFAULT_SOURCE_DIRECTORY value: /usr/src/whereabouts/bin/ image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:7983420590be0b0f62b726996dd73769a35c23a4b3b283f8cf20e09418e814eb imagePullPolicy: IfNotPresent name: whereabouts-cni-bincopy resources: requests: cpu: 10m memory: 10Mi terminationMessagePath: /dev/termination-log terminationMessagePolicy: FallbackToLogsOnError volumeMounts: - mountPath: /entrypoint name: cni-binary-copy - mountPath: /host/opt/cni/bin name: cnibin - mountPath: /host/etc/os-release name: os-release readOnly: true - command: - /bin/sh - -c - | #!/bin/sh set -u -e CNI_BIN_DIR=${CNI_BIN_DIR:-"/host/opt/cni/bin/"} WHEREABOUTS_KUBECONFIG_FILE_HOST=${WHEREABOUTS_KUBECONFIG_FILE_HOST:-"/etc/cni/net.d/whereabouts.d/whereabouts.kubeconfig"} CNI_CONF_DIR=${CNI_CONF_DIR:-"/host/etc/kubernetes/cni/net.d"} WHEREABOUTS_RECONCILER_CRON=${WHEREABOUTS_RECONCILER_CRON:-30 4 * * *} # Make a whereabouts.d directory (for our kubeconfig) mkdir -p $CNI_CONF_DIR/whereabouts.d WHEREABOUTS_KUBECONFIG=$CNI_CONF_DIR/whereabouts.d/whereabouts.kubeconfig WHEREABOUTS_CONF_FILE=$CNI_CONF_DIR/whereabouts.d/whereabouts.conf WHEREABOUTS_KUBECONFIG_LITERAL=$(echo "$WHEREABOUTS_KUBECONFIG" | sed -e s'|/host||') # Write the nodename to the whereabouts.d directory for standardized hostname reference across cloud providers echo $NODENAME > $CNI_CONF_DIR/whereabouts.d/nodename SERVICE_ACCOUNT_PATH=/var/run/secrets/kubernetes.io/serviceaccount KUBE_CA_FILE=${KUBE_CA_FILE:-$SERVICE_ACCOUNT_PATH/ca.crt} SERVICE_ACCOUNT_TOKEN=$(cat $SERVICE_ACCOUNT_PATH/token) SERVICE_ACCOUNT_TOKEN_PATH=$SERVICE_ACCOUNT_PATH/token SKIP_TLS_VERIFY=${SKIP_TLS_VERIFY:-false} function log() { echo "$(date -Iseconds) ${1}" } function error() { log "ERR: {$1}" } function warn() { log "WARN: {$1}" } function generateKubeConfig { # Check if we're running as a k8s pod. if [ -f "$SERVICE_ACCOUNT_PATH/token" ]; then # We're running as a k8d pod - expect some variables. if [ -z ${KUBERNETES_SERVICE_HOST} ]; then error "KUBERNETES_SERVICE_HOST not set"; exit 1; fi if [ -z ${KUBERNETES_SERVICE_PORT} ]; then error "KUBERNETES_SERVICE_PORT not set"; exit 1; fi if [ "$SKIP_TLS_VERIFY" == "true" ]; then TLS_CFG="insecure-skip-tls-verify: true" elif [ -f "$KUBE_CA_FILE" ]; then TLS_CFG="certificate-authority-data: $(cat $KUBE_CA_FILE | base64 | tr -d '\n')" fi # Kubernetes service address must be wrapped if it is IPv6 address KUBERNETES_SERVICE_HOST_WRAP=$KUBERNETES_SERVICE_HOST if [ "$KUBERNETES_SERVICE_HOST_WRAP" != "${KUBERNETES_SERVICE_HOST_WRAP#*:[0-9a-fA-F]}" ]; then KUBERNETES_SERVICE_HOST_WRAP=\[$KUBERNETES_SERVICE_HOST_WRAP\] fi # Write a kubeconfig file for the CNI plugin. Do this # to skip TLS verification for now. We should eventually support # writing more complete kubeconfig files. This is only used # if the provided CNI network config references it. touch $WHEREABOUTS_KUBECONFIG chmod ${KUBECONFIG_MODE:-600} $WHEREABOUTS_KUBECONFIG cat > $WHEREABOUTS_KUBECONFIG < $WHEREABOUTS_CONF_FILE <