Beispiel: Calico installieren und Netzwerk-Policys einrichten

Erfahren Sie, wie Sie Calico installieren und Netzwerkrichtlinien auf einem Cluster einrichten, das Sie mit der Kubernetes Engine (OKE) erstellt haben.

Im Kubernetes-Networkingmodell wird davon ausgegangen, dass Container (Pods) eindeutige und weiterleitbare IP-Adressen innerhalb eines Clusters aufweisen. Im Kubernetes-Networkingmodell kommunizieren Container untereinander mit diesen IP-Adressen, unabhängig davon, ob die Container auf demselben Knoten in einem Cluster oder auf einem anderen Knoten bereitgestellt sind. Kubernetes hat die Container Network Interface-(CNI-)Spezifikation für die Netzwerkressourcenverwaltung übernommen. Das CNI besteht aus einer Spezifikation und Bibliotheken zum Schreiben von Plugins zur Konfiguration von Netzwerkschnittstellen in Linux-Containern sowie einer Reihe von unterstützten Plugins.

Standardmäßig akzeptieren Pods Traffic aus jeder Quelle. Um die Clustersicherheit zu verbessern, können Pods "isoliert" werden, indem sie in einer Netzwerk-Policy ausgewählt werden (Kubernetes NetworkPolicy-Ressource). Eine Netzwerk-Policy ist eine Spezifikation, wie Gruppen mit Pods untereinander und mit anderen Netzwerkendpunkten kommunizieren können. NetworkPolicy-Ressourcen verwenden Labels, um Pods auszuwählen und Regeln zu definieren, mit denen angegeben wird, welcher Traffic für die ausgewählten Pods zulässig ist. Wenn eine NetworkPolicy in einem Cluster-Namespace ein bestimmtes Pod auswählt, lehnt dieses Pod alle Verbindungen ab, die von keiner NetworkPolicy zugelassen werden. Andere Pods im Namespace, die nicht von einer NetworkPolicy ausgewählt wurden, akzeptieren weiterhin den gesamten Traffic. Weitere Informationen zu Netzwerk-Policys finden Sie in der Kubernetes-Dokumentation.

Netzwerk-Policys werden vom CNI-Netzwerkprovider implementiert. Eine einfache Erstellung der NetworkPolicy-Ressource ohne einen CNI-Netzwerkprovider zur Implementierung bewirkt nichts. Beachten Sie, dass nicht alle CNI-Netzwerkprovider die NetworkPolicy-Ressource implementieren.

Wenn Sie Cluster mit der Kubernetes-Engine erstellen, wählen Sie einen Netzwerktyp aus. Der von Ihnen ausgewählte Netzwerktyp bestimmt den CNI-Netzwerkprovider und das zugehörige CNI-Plug-in, das für Podnetworking verwendet wird, wie folgt:

  • VCN-natives Podnetzwerk: Verwendet das OCI-VCN-native Podnetzwerk-CNI-Plug-in, um Worker-Knoten mit Podsubnetzen in einem Oracle Cloud Infrastructure-VCN zu verbinden. Daher können Pod-IP-Adressen in einem VCN direkt von anderen VCNs, die mit diesem VCN verbunden sind (Peered) und von On-Premise-Netzwerken weitergeleitet werden. Siehe CNI-Plug-in für OCI-VCN-natives Podnetworking für Podnetworking verwenden.
  • Flannel-Overlay: Mit dem Flannel-CNI-Plug-in wird die Kommunikation zwischen Pods im Flannel-Overlay-Netzwerk gekapselt, einem einfachen virtuellen Overlay-Netzwerk für privates Overlay, das IP-Adressen an Container anhängt. Auf die Pods im privaten Overlay-Netzwerk kann nur von anderen Pods im selben Cluster zugegriffen werden. Siehe Flannel-CNI-Plug-in für Podnetworking verwenden.

Obwohl sowohl das OCI-VCN-native Pod-Networking-CNI-Plug-in als auch das Flannel-CNI-Plug-in die Anforderungen des Kubernetes-Netzwerkmodells erfüllen, unterstützen keine der beiden Kubernetes-NetworkPolicy-Ressourcen. Wenn Sie die Sicherheit von Clustern, die Sie mit Kubernetes Engine erstellen, durch Implementierung von Netzwerk-Policys verbessern möchten, müssen Sie einen Netzwerkprovider, der NetworkPolicy-Ressourcen im Cluster unterstützt, installieren und konfigurieren. Ein solcher Provider ist Calico (eine Liste anderer Netzwerkprovider finden Sie in der Kubernetes-Dokumentation).

Calico ist eine Open-Source-Networking- und Netzwerksicherheitslösung für Container, virtuelle Maschinen und native hostbasierte Workloads. Weitere Informationen zu Calico finden Sie in der Calico-Dokumentation.

Hinweis

  • Sie können Calico mit verwalteten Knotenpools verwenden, jedoch nicht mit virtuellen Knotenpools.
  • Nur die Verwendung der Open-Source-Version von Calico wird unterstützt. Die Verwendung von Calico Enterprise wird nicht unterstützt.

  • Wenn Sie ein Cluster erstellt und Flannel-Overlay als Netzwerktyp ausgewählt haben, können Sie Calico anstelle des Flannel-CNI-Plug-ins installieren (siehe Calico anstelle des Flannel-CNI-Plug-ins installieren). Beachten Sie jedoch, dass die Änderung des CNI-Plugins von Flannel zu Calico nur für neue Knoten gilt, die anschließend im Cluster erstellt werden. Daher wird empfohlen, Flannel nicht durch Calico in Clustern zu ersetzen, die bereits Worker-Knoten aufweisen.

Calico-Kompatibilität

In der Tabelle sind die Versionen des Calico-Netzwerk-Plug-ins aufgeführt, die Oracle erfolgreich auf Clustern getestet hat, die mit Kubernetes Engine erstellt wurden. Oracle unterstützt nur erfolgreich getestete Calico-Versionen. Für jede Calico-Version zeigt die Tabelle die Kubernetes-Version an, die in erfolgreichen Tests auf Clustern ausgeführt wurde.

Beachten Sie, dass nur die Verwendung der Open-Source-Version von Calico unterstützt wird. Die Verwendung von Calico Enterprise wird nicht unterstützt.

Weitere Informationen finden Sie unter Beispiel: Calico installieren und Netzwerk-Policys einrichten.

Calico-Version Auf Clustern getestet (und unterstützt), auf denen Kubernetes 1.30 ausgeführt wird? Getestet (und unterstützt) auf Clustern, auf denen Kubernetes 1.31 ausgeführt wird? Auf Clustern getestet (und unterstützt), auf denen Kubernetes 1.32 ausgeführt wird? Getestet (und unterstützt) auf Clustern mit Kubernetes 1.33?
3.25.1 (nicht getestet) (nicht getestet) (nicht getestet) (nicht getestet)
3.26.1 (nicht getestet) (nicht getestet) (nicht getestet) (nicht getestet)
3.26.4 (nicht getestet) (nicht getestet) (nicht getestet) (nicht getestet)
3.27.2 (nicht getestet) (nicht getestet) (nicht getestet) (nicht getestet)
3.28.0 Ja (nicht getestet) (nicht getestet) (nicht getestet)
3.28.2 (nicht getestet) Ja (nicht getestet) (nicht getestet)
3.29.2 (nicht getestet) (nicht getestet) Ja (nicht getestet)
3.30.0 (nicht getestet) (nicht getestet) (nicht getestet) Ja

Installieren von Calico anstelle des flannel CNI-Plugins

Nachdem Sie ein erweitertes Cluster mit der Kubernetes-Engine (mit der Konsole oder der API) erstellt und Flannel-Overlay als Netzwerktyp ausgewählt haben, können Sie Calico anschließend im Cluster installieren, um Netzwerk-Policys zu unterstützen.

Bevor Sie Calico anstelle des flannel CNI Plugins installieren, müssen Sie zuerst das flannel CNI Plugin deaktivieren. Beachten Sie, dass die Änderung des CNI-Plugins von Flannel in Calico nur für neue Knoten gilt, die anschließend im Cluster erstellt werden. Daher wird empfohlen, Flannel nicht durch Calico in Clustern zu ersetzen, die bereits Worker-Knoten aufweisen.

Aus Gründen der Benutzerfreundlichkeit finden Sie unten eine Calico-Installationsanleitung. Beachten Sie, dass die Calico-Installationsanleitungen zwischen den Calico-Versionen variieren. Informationen zur Installation unterschiedlicher Versionen von Calico finden Sie immer in der Calico-Installationsdokumentation.

  1. Deaktivieren Sie das flannel CNI Plugin Cluster Add-on. Siehe Cluster-Add-on deaktivieren (und entfernen).

  2. Falls noch nicht geschehen, führen Sie die Schritte zum Einrichten der kubeconfig-Konfigurationsdatei des Clusters aus, und legen Sie (gegebenenfalls) die Umgebungsvariable KUBECONFIG so fest, dass sie auf die Datei verweist. Beachten Sie, dass Sie Ihre eigene kubeconfig-Datei einrichten müssen. Sie können nicht mit einer kubeconfig-Datei, die von einem anderen Benutzer eingerichtet wurde, auf ein Cluster zugreifen. Siehe Clusterzugriff einrichten.
  3. Entfernen Sie das Flannel-Daemonset aus dem Namespace des kube-Systems, indem Sie Folgendes eingeben:
    kubectl delete -n kube-system daemonset kube-flannel-ds
  4. Laden Sie in einem Terminalfenster das Calico-Manifest für den Kubernetes-API-Datenspeicher herunter, indem Sie Folgendes eingeben:

    curl https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml -o calico.yaml

    Beachten Sie, dass die URL je nach der Version von Calico, die Sie installieren möchten, unterschiedlich ist.

  5. Wenn Sie ein Oracle Linux 8-Image für Worker-Knoten im Cluster ausgewählt haben, legen Sie wie folgt eine zusätzliche Umgebungsvariable in der Datei calico.yaml fest:
    1. Öffnen Sie die Datei calico.yaml in einem Texteditor Ihrer Wahl.
    2. Fügen Sie die folgende Umgebungsvariable zum Abschnitt env für den Container calico-node im Manifest des Manifests calico-node DaemonSet hinzu:

                  - name: FELIX_IPTABLESBACKEND
                    value: "NFT"
    3. Speichern und schließen Sie die geänderte Datei calico.yaml.
  6. Installieren und konfigurieren Sie Calico durch Eingabe des folgenden Befehls:

    kubectl apply -f calico.yaml

Calico neben dem CNI-Plug-in für OCI-VCN-natives Podnetworking installieren

Nachdem Sie ein Cluster mit der Kubernetes-Engine (mit der Konsole oder der API) erstellt und VCN-natives Podnetzwerk als Netzwerktyp ausgewählt haben, können Sie Calico anschließend neben dem OCI-VCN-nativen Podnetzwerk-CNI-Plug-in im Cluster installieren, um Netzwerk-Policys zu unterstützen.

Aus Gründen der Benutzerfreundlichkeit finden Sie unten eine Calico-Installationsanleitung. Beachten Sie, dass die Calico-Installationsanleitungen zwischen den Calico-Versionen variieren. Informationen zur Installation unterschiedlicher Versionen von Calico finden Sie immer in der Calico-Installationsdokumentation.

  1. Falls noch nicht geschehen, führen Sie die Schritte zum Einrichten der kubeconfig-Konfigurationsdatei des Clusters aus, und legen Sie (gegebenenfalls) die Umgebungsvariable KUBECONFIG so fest, dass sie auf die Datei verweist. Beachten Sie, dass Sie Ihre eigene kubeconfig-Datei einrichten müssen. Sie können nicht mit einer kubeconfig-Datei, die von einem anderen Benutzer eingerichtet wurde, auf ein Cluster zugreifen. Siehe Clusterzugriff einrichten.
  2. Laden Sie in einem Terminalfenster das ausschließlich für Calico-Policy geltende Manifest für den Kubernetes-API-Datenspeicher herunter, indem Sie Folgendes eingeben:

    curl https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico-policy-only.yaml -o calico-policy-only.yaml

    Beachten Sie, dass die URL je nach der Version von Calico, die Sie installieren möchten, unterschiedlich ist.

  3. Die Datei calico-policy-only.yaml enthält Calico-Komponenten, die nicht erforderlich sind, wenn Calico neben dem CNI-Plug-in für OCI-VCN-native Podnetworking verwendet wird. Daher müssen Sie diese Komponenten entfernen. Außerdem müssen Sie einige zusätzliche Umgebungsvariablen festlegen.
    1. Öffnen Sie die Datei calico-policy-only.yaml in einem Texteditor Ihrer Wahl.
    2. Entfernen Sie den Abschnitt initContainers aus dem Manifest der Datei calico-node DaemonSet.
    3. Entfernen Sie Folgendes aus dem Abschnitt env für den Container calico-node aus dem Manifest der Datei calico-node DaemonSet:
                # Typha support: controlled by the ConfigMap.
                - name: FELIX_TYPHAK8SSERVICENAME
                    valueFrom:
                        configMapKeyRef:
                            name: calico-config
                            key: typha_service_name
    4. Entfernen Sie den folgenden Abschnitt envFrom für den Container calico-node aus dem Manifest der Datei calico-node DaemonSet:
                envFrom:
                - configMapRef:
                    # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode.
                    name: kubernetes-services-endpoint
                    optional: true
    5. Entfernen Sie die folgenden Volumes aus dem Abschnitt volumes des Manifests der Datei calico-node DaemonSet:
      • cni-bin-dir
      • cni-net-dir
      • cni-log-dir

      Bevor Sie die Änderung vornehmen, sieht der Abschnitt volumes des Manifests calico-node DaemonSet folgendermaßen aus:

            ...
            volumes:
              # Used by calico-node.
              - name: lib-modules
                hostPath:
                  path: /lib/modules
              - name: var-run-calico
                hostPath:
                  path: /var/run/calico
              - name: var-lib-calico
                hostPath:
                  path: /var/lib/calico
              - name: xtables-lock
                hostPath:
                  path: /run/xtables.lock
                  type: FileOrCreate
              - name: sys-fs
                hostPath:
                  path: /sys/fs/
                  type: DirectoryOrCreate
              - name: bpffs
                hostPath:
                  path: /sys/fs/bpf
                  type: Directory
              # mount /proc at /nodeproc to be used by mount-bpffs initContainer to mount root cgroup2 fs.
              - name: nodeproc
                hostPath:
                  path: /proc
              # Used to install CNI.
              - name: cni-bin-dir
                hostPath:
                  path: /opt/cni/bin
              - name: cni-net-dir
                hostPath:
                  path: /etc/cni/net.d
              # Used to access CNI logs.
              - name: cni-log-dir
                hostPath:
                  path: /var/log/calico/cni
              # Used to create per-pod Unix Domain Sockets
              - name: policysync
                hostPath:
                  type: DirectoryOrCreate
                  path: /var/run/nodeagent
                ...

      Nachdem Sie die Änderung vorgenommen haben, prüfen Sie, ob der Abschnitt volumes des Manifests calico-node DaemonSet wie folgt aussieht:

            ...
            volumes:
              # Used by calico-node.
              - name: lib-modules
                hostPath:
                  path: /lib/modules
              - name: var-run-calico
                hostPath:
                  path: /var/run/calico
              - name: var-lib-calico
                hostPath:
                  path: /var/lib/calico
              - name: xtables-lock
                hostPath:
                  path: /run/xtables.lock
                  type: FileOrCreate
              - name: sys-fs
                hostPath:
                  path: /sys/fs/
                  type: DirectoryOrCreate
              - name: bpffs
                hostPath:
                  path: /sys/fs/bpf
                  type: Directory
              # mount /proc at /nodeproc to be used by mount-bpffs initContainer to mount root cgroup2 fs.
              - name: nodeproc
                hostPath:
                  path: /proc
              # Used to create per-pod Unix Domain Sockets
              - name: policysync
                hostPath:
                  type: DirectoryOrCreate
                  path: /var/run/nodeagent
                ...
    6. Entfernen Sie die folgenden Volume Mounts aus dem Abschnitt volumeMounts für den Container calico-node im Manifest der Datei calico-node DaemonSet:
      • cni-net-dir, einschließlich des zugehörigen Kommentars # For maintaining CNI plugin API credentials.
      • cni-log-dir

      Bevor Sie die Änderung vornehmen, sieht der Abschnitt volumeMounts folgendermaßen aus:

                ...
                volumeMounts:
                  # For maintaining CNI plugin API credentials.
                  - mountPath: /host/etc/cni/net.d
                    name: cni-net-dir
                    readOnly: false
                  - mountPath: /lib/modules
                    name: lib-modules
                    readOnly: true
                  - mountPath: /run/xtables.lock
                    name: xtables-lock
                    readOnly: false
                  - mountPath: /var/run/calico
                    name: var-run-calico
                    readOnly: false
                  - mountPath: /var/lib/calico
                    name: var-lib-calico
                    readOnly: false
                  - name: policysync
                    mountPath: /var/run/nodeagent
                  # For eBPF mode, we need to be able to mount the BPF filesystem at /sys/fs/bpf so we mount in the
                  # parent directory.
                  - name: bpffs
                    mountPath: /sys/fs/bpf
                  - name: cni-log-dir
                    mountPath: /var/log/calico/cni
                    readOnly: true
                    ...

      Nachdem Sie die Änderung vorgenommen haben, prüfen Sie, ob der Abschnitt volumeMounts wie folgt aussieht:

                ...
                volumeMounts:
                  - mountPath: /lib/modules
                    name: lib-modules
                    readOnly: true
                  - mountPath: /run/xtables.lock
                    name: xtables-lock
                    readOnly: false
                  - mountPath: /var/run/calico
                    name: var-run-calico
                    readOnly: false
                  - mountPath: /var/lib/calico
                    name: var-lib-calico
                    readOnly: false
                  - name: policysync
                    mountPath: /var/run/nodeagent
                  # For eBPF mode, we need to be able to mount the BPF filesystem at /sys/fs/bpf so we mount in the
                  # parent directory.
                  - name: bpffs
                    mountPath: /sys/fs/bpf
                    ...
    7. Fügen Sie die folgenden Umgebungsvariablen für den Container calico-node im Manifest der Datei calico-node DaemonSet hinzu:
      • FELIX_INTERFACEPREFIX="oci"
      • NO_DEFAULT_POOLS="true"
      • FELIX_CHAININSERTMODE="Append"
      • FELIX_IPTABLESMANGLEALLOWACTION="Return"
      • FELIX_IPTABLESBACKEND="NFT" Hinweis: Fügen Sie diese Umgebungsvariable nur hinzu, wenn Sie ein Oracle Linux 8-Image für Worker-Knoten im Cluster ausgewählt haben.

      Bevor Sie die Änderung vornehmen, sieht der Abschnitt calico-node der Containerumgebungsvariablen (env:) des Manifests calico-node DaemonSet folgendermaßen aus:

            ...
            containers:
              # Runs calico-node container on each Kubernetes node. This
              # container programs network policy and routes on each
              # host.
              - name: calico-node
                image: docker.io/calico/node:v3.28.0
                imagePullPolicy: IfNotPresent
                env:
                  # Use Kubernetes API as the backing datastore.
                  - name: DATASTORE_TYPE
                    value: "kubernetes"
                  # Configure route aggregation based on pod CIDR.
                  - name: USE_POD_CIDR
                    value: "true"
                  # Wait for the datastore.
                  - name: WAIT_FOR_DATASTORE
                    value: "true"
                  # Set based on the k8s node name.
                  - name: NODENAME
                    valueFrom:
                      fieldRef:
                        fieldPath: spec.nodeName
                  # Don't enable BGP.
                  - name: CALICO_NETWORKING_BACKEND
                    value: "none"
                  # Cluster type to identify the deployment type
                  - name: CLUSTER_TYPE
                    value: "k8s"
                  # Non-calico CNI, disable credential management.
                  - name: CALICO_MANAGE_CNI
                    value: "false"
                  # The default IPv4 pool to create on startup if none exists. Pod IPs will be
                  # chosen from this range. Changing this value after installation will have
                  # no effect. This should fall within `--cluster-cidr`.
                  # - name: CALICO_IPV4POOL_CIDR
                  #   value: "192.168.0.0/16"
                  # Disable file logging so `kubectl logs` works.
                  - name: CALICO_DISABLE_FILE_LOGGING
                    value: "true"
                  # Set Felix endpoint to host default action to ACCEPT.
                  - name: FELIX_DEFAULTENDPOINTTOHOSTACTION
                    value: "ACCEPT"
                  # Disable IPv6 on Kubernetes.
                  - name: FELIX_IPV6SUPPORT
                    value: "false"
                  - name: FELIX_HEALTHENABLED
                    value: "true"         
                  ...

      Nachdem Sie die Änderung vorgenommen haben, prüfen Sie, ob der Abschnitt calico-node der Containerumgebungsvariablen (env:) des Manifests calico-node DaemonSet wie folgt aussieht:

            ...
            containers:
              # Runs calico-node container on each Kubernetes node. This
              # container programs network policy and routes on each
              # host.
              - name: calico-node
                image: docker.io/calico/node:v3.28.0
                imagePullPolicy: IfNotPresent
                env:
                  # Use Kubernetes API as the backing datastore.
                  - name: DATASTORE_TYPE
                    value: "kubernetes"
                  # Configure route aggregation based on pod CIDR.
                  - name: USE_POD_CIDR
                    value: "true"
                  # Wait for the datastore.
                  - name: WAIT_FOR_DATASTORE
                    value: "true"
                  # Set based on the k8s node name.
                  - name: NODENAME
                    valueFrom:
                      fieldRef:
                        fieldPath: spec.nodeName
                  # Don't enable BGP.
                  - name: CALICO_NETWORKING_BACKEND
                    value: "none"
                  # Cluster type to identify the deployment type
                  - name: CLUSTER_TYPE
                    value: "k8s"
                  # Non-calico CNI, disable credential management.
                  - name: CALICO_MANAGE_CNI
                    value: "false"
                  # The default IPv4 pool to create on startup if none exists. Pod IPs will be
                  # chosen from this range. Changing this value after installation will have
                  # no effect. This should fall within `--cluster-cidr`.
                  # - name: CALICO_IPV4POOL_CIDR
                  #   value: "192.168.0.0/16"
                  # Disable file logging so `kubectl logs` works.
                  - name: CALICO_DISABLE_FILE_LOGGING
                    value: "true"
                  # Set Felix endpoint to host default action to ACCEPT.
                  - name: FELIX_DEFAULTENDPOINTTOHOSTACTION
                    value: "ACCEPT"
                  # Disable IPv6 on Kubernetes.
                  - name: FELIX_IPV6SUPPORT
                    value: "false"
                  - name: FELIX_HEALTHENABLED
                    value: "true"
                  - name: FELIX_INTERFACEPREFIX
                    value: "oci"
                  - name: NO_DEFAULT_POOLS
                    value: "true"
                  - name: FELIX_CHAININSERTMODE
                    value: "Append"
                  - name: FELIX_IPTABLESMANGLEALLOWACTION
                    value: "Return"   
                  - name: FELIX_IPTABLESBACKEND
                    value: "NFT"         
                  ...
    8. Speichern und schließen Sie die geänderte Datei calico-policy-only.yaml.
  4. Installieren und konfigurieren Sie Calico durch Eingabe des folgenden Befehls:

    kubectl apply -f calico-policy-only.yaml

Netzwerk-Policys einrichten

Nach der Installation von Calico auf einem Cluster, das Sie mit Kubernetes Engine erstellt haben, können Sie Kubernetes-NetworkPolicy-Ressourcen erstellen, um Pods nach Bedarf zu isolieren.

Beispiele für NetworkPolicy und deren Verwendung finden Sie in der Calico-Dokumentation und speziell unter:

Beachten Sie, dass die Beispiele je nach installierter Calico-Version variieren.