AUF DIESER SEITE
Anwenden eines benutzerdefinierten Namespace-Netzwerks auf einen Namespace
Anwenden eines benutzerdefinierten Servicenetzwerks auf einen Service
Festlegen eines virtuellen Netzwerks als benutzerdefiniertes Standard-Pod-Netzwerk
Verwenden einer NAD zum Erstellen eines benutzerdefinierten Standard-Pod-Netzwerks
Bereitstellung eines benutzerdefinierten Pod-Netzwerks pro Pod
Passen Sie virtuelle Netzwerke für Pod-Bereitstellungen, Services und Namespaces an
ZUSAMMENFASSUNG Ab Version 23.1 unterstützt Juniper Cloud-native Contrail Networking (CN2) die Möglichkeit, ein benutzerdefiniertes Standardnetzwerk für Namespaces, Bereitstellungen und Services anzuwenden. Diese Funktion unterstützt auch Umgebungen, in denen Multus CNI aktiviert ist. Mit Multus als CNI Ihrer CN2-Umgebung können Sie Pods mit mehreren Schnittstellen für unterschiedliche Anwendungsfälle bereitstellen.
Benutzerdefiniertes Namespace-Netzwerk – Übersicht
In herkömmlichen Kubernetes ist das Standard-Pod-Netzwerk ein einzelner CIDR, der unabhängig vom Namespace von allen Pods im Cluster verwendet wird. Dieser Ansatz ermöglicht keine Segmentierung der Netzwerkebene zwischen Pods, da Kubernetes IPs von einem gemeinsam genutzten CIDR zuweist. CN2 behebt diesen Nachteil mit isolierten Namespaces. Isolierte CN2-Namespaces ermöglichen Kubernetes die Erstellung benutzerdefinierter Standard-Namespace-Netzwerke auf Namespace-Basis. Das bedeutet, dass neue Pods und Services, wenn Sie einen Deployment
in einem Namespace mit einem benutzerdefinierten Namespace-Netzwerk konfigurieren, das benutzerdefinierte Netzwerk innerhalb eines einzelnen isolierten Namespaces verwenden. Isolierte Namespaces sorgen für eine Netzwerkisolierung zwischen Pods und Services, ohne dass eine Kubernetes-Netzwerkrichtlinie erforderlich ist.
CN2 verbessert diese Funktion, indem Kubernetes die Erstellung von Pods ermöglicht, die benutzerdefinierte Namespace-Netzwerke auf Pod-Basis verwenden. Benutzerdefinierte Namespace-Netzwerke bieten eigene VirtualNetworks
(VNs) und Subnets. CN2 weist Pod-IPs basierend auf den Subnet-Parametern eines bestimmten benutzerdefinierten Namespace-Netzwerks zu. Mit anderen Worten, Sie können Pods mit ihren eigenen Netzwerken in einem bestimmten Namespace erstellen. Das bedeutet, dass CN2 netzwerkisolierung auf Namespace- und Podebene unterstützt.
Anwenden eines benutzerdefinierten Namespace-Netzwerks auf einen Namespace
Sie können ein benutzerdefiniertes Standard-Namespace-Netzwerk pro Namespace angeben. Festlegen eines benutzerdefinierten Namespace-Netzwerks pro Namespace, und alle Pods und Services, die in diesem Namespace erstellt werden, verwenden dieses Netzwerk als Pod oder Servicenetzwerk. Die Namespace
Anmerkung net.juniper.contrail.podnetwork: network-namespace/network-name
bezeichnet das gewünschte Netzwerk als benutzerdefiniertes Namespace-Netzwerk.
Die folgende YAML zeigt ein Beispiel für einen Namespace mit einer benutzerdefinierten Namespace-Netzwerkanmerkung.
apiVersion: v1 kind: Namespace metadata: name: custom-podnet annotations: net.juniper.contrail.podnetwork: custom-podnet/ns-level-custom-podnets
Beim Erstellen des Namespaces muss die Anmerkung eines Namespaces vorhanden sein. Sie können die Anmerkung in einem Namespace nicht aktualisieren, um das Netzwerk zu ändern. Sie müssen den Namespace neu erstellen, um sein Netzwerk zu ändern. Wenn kubemanager
ein Update der Benutzerdefinierten Namespace-Netzwerkanmerkung in einem Namespace erkannt wird, wird dieser Namespace und jeder in diesem Namespace erstellte Pod markiert, kubemanager
nachdem das Update nicht gestartet wird. Durch die Revertierung des Updates wird die Flagge entfernt und die Pods werden normal gestartet.
Anwenden eines benutzerdefinierten Servicenetzwerks auf einen Service
Sie können ein benutzerdefiniertes Standardnetzwerk für Services in einem annotations
Service
Objekt angeben. Infolgedessen kann der Service Pods auswählen, die das benutzerdefinierte Servicenetzwerk verwenden. Services, die Pods mit einem benutzerdefinierten Netzwerk auswählen, werden von anderen Netzwerken isoliert. Das Anmerkungsformat ist: network-namespace/network-name
.
Im Folgenden ist ein Beispiel für ein Service
benutzerdefiniertes Servicenetzwerk.
apiVersion: v1 kind: Service metadata: name: custom-podnet-svc namespace: custom-podnet annotations: net.juniper.contrail.podnetwork: custom-podnet/pod-level-custom-podnet
Festlegen eines virtuellen Netzwerks als benutzerdefiniertes Standard-Pod-Netzwerk
Sie können einen VN als benutzerdefiniertes Standard-Pod-Netzwerk festlegen. Wenn Sie ein VirtualNetwork
Objekt manuell erstellen, müssen Sie das Feld "podNetwork: true
" in der Spezifikation des VirtualNetwork festlegen. Dieses Feld bezeichnet den neuen VN als benutzerdefiniertes Standard-Pod-Netzwerk. CN2 weist IPs Pods aus diesem Netzwerk zu.
Im Folgenden wird ein Beispiel für ein VirtualNetwork
als benutzerdefiniertes Standard-Pod-Netzwerk bezeichnet.
apiVersion: core.contrail.juniper.net/v2 kind: VirtualNetwork metadata: namespace: custom-podnet name: vn-network spec: podNetwork: true v4SubnetReference: apiVersion: core.contrail.juniper.net/v2 kind: Subnet namespace: custom-podnet name: vn-network-subnet
Verwenden einer NAD zum Erstellen eines benutzerdefinierten Standard-Pod-Netzwerks
Installieren Sie einen Network Attachment Definiton (NAD) mit podNetwork: true
dem Satz an der juniper.net/networks
Anmerkung, um ein benutzerdefiniertes Standard-Pod-Netzwerk zu erstellen. Nachdem Sie diese NAD erstellt haben, erstellt der NAD-Controller automatisch ein VN und legt das Feld "podNetwork: true
" während der VirtualNetwork
Erstellung fest.
Im Folgenden ist ein Beispiel für eine NAD, die als benutzerdefiniertes Standard-Pod-Netzwerk bezeichnet wurde.
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: nad-network namespace: custom-podnet annotations: juniper.net/networks: '{ "ipamV4Subnet": "5.5.5.0/24", "podNetwork": true }'
-
Hinweis:
Sie müssen keine NAD-Anmerkung für Pods innerhalb eines Namespace angeben, wenn dieser Namespace dasselbe Netzwerk wie die primäre Schnittstelle (eth0) verwendet. Mit anderen Worten, da der Namespace ein Netzwerk mit einer Anmerkung angibt, müssen Pods in diesem Namespace nicht dasselbe Netzwerk angeben.
Bereitstellung eines benutzerdefinierten Pod-Netzwerks pro Pod
Sie können auch ein benutzerdefiniertes Standard-Pod-Netzwerk pro Pod angeben. Um ein benutzerdefiniertes Podnetzwerk pro Pod festzulegen, müssen Sie das folgende Schlüsselwertpaar in annotations
einem Pod angeben: "net.juniper.contrail.podnetwork": network-namespace/network-name
. Diese Funktion bietet Pod-Isolierung, da Pods, die ein benutzerdefiniertes Pod-Netzwerk verwenden, von anderen Netzwerken isoliert sind.
Das folgende Beispiel zeigt einen Namespace VirtualNetwork
und einen Pod mit definierten benutzerdefinierten Standardnetzwerken.
apiVersion: v1 kind: Namespace metadata: name: cpn-intra-network-test-vn annotations: net.juniper.contrail.podnetwork: cpn-intra-network-test-vn/vn --- apiVersion: core.contrail.juniper.net/v1 kind: Subnet metadata: namespace: cpn-intra-network-test-vn name: vn-sn spec: cidr: 15.15.15.0/24 --- apiVersion: core.contrail.juniper.net/v1 kind: VirtualNetwork metadata: namespace: cpn-intra-network-test-vn name: vn spec: podNetwork: true v4SubnetReference: apiVersion: core.contrail.juniper.net/v1 kind: Subnet namespace: cpn-intra-network-test-vn name: vn-sn --- apiVersion: v1 kind: Pod metadata: name: ns-level-cpn-pod namespace: cpn-intra-network-test-vn spec: containers: - name: toolbox image: <repository>:<tag> imagePullPolicy: IfNotPresent command: ["bash", "-c", "while true; do sleep 60s; done"] securityContext: capabilities: add: - NET_ADMIN privileged: true tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoSchedule" --- apiVersion: v1 kind: Pod metadata: name: pod-level-cpn-pod namespace: cpn-intra-network-test-vn annotations: net.juniper.contrail.podnetwork: cpn-intra-network-test-vn/vn # namespace/name of the network net.juniper.contrail.podnetwork.ip: 15.15.15.3 # ip request for the interface net.juniper.contrail.podnetwork.cni-args: | # any cni-args needed for this interface spec: containers: - name: toolbox image: <repository>:<tag> imagePullPolicy: IfNotPresent command: ["bash", "-c", "while true; do sleep 60s; done"] securityContext: capabilities: add: - NET_ADMIN privileged: true tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoSchedule"
Beachten Sie den folgenden Pod annotations
:
annotations: net.juniper.contrail.podnetwork: cpn-mc-cc/cpn1 # namespace/name of the network net.juniper.contrail.podnetwork.ip: 100.100.100.3 # ip request for the interface net.juniper.contrail.podnetwork.cni-args: | # any cni-args needed for this interface { "net.juniper.contrail.interfacegroup": "eth0" }
Sie definieren ein benutzerdefiniertes Pod-Netzwerk in den Anmerkungen sowohl des Pods (pod-level-cpn-pod
) als auch des Namespaces (cpn-intra-network-test-vn
). Als Teil der Version 23.1 müssen Sie einen Pod so konfigurieren, dass ein benutzerdefiniertes Pod-Netzwerk auf annotations
Pod-Ebene verwendet wird. Wenn Sie eine Anmerkung sowohl auf Pod- als auch auf Namespaceebene angeben, hat die Anmerkung auf Podebene Priorität.
Benutzerdefinierte Standard-Namespace-Netzwerkinteraktionen
In den folgenden Abschnitten finden Sie Informationen zu häufigen netzwerkspezifischen Namespace-Interaktionen.
Multi-NIC-Pod
Ein Pod mit einem benutzerdefinierten Standard-Namespace-Netzwerk kann immer noch mehrere Schnittstellen enthalten. Die folgende YAML ist ein Beispiel für einen NetworkSelectionElement
Pod mit einem benutzerdefinierten Netzwerk und mehreren Schnittstellen.
apiVersion: v1 kind: Namespace metadata: name: custom-podnet annotations: net.juniper.contrail.podnetwork: cpn-intra-network-test/vn --- # Pod annotations: k8s.v1.cni.cncf.io/networks: | [ { "name": "vn1", "namespace": "vn1-ns", }, { "name": "vn2", "namespace": "vn2-ns", } ]
Ein Pod mit den oben definierten Anmerkungen würde eth0 von custom-podnet-vn
, eth1 von vn1
und eth2 von vn2
. Sie können auch einen Namespace mit einem benutzerdefinierten Namespace-Netzwerk und mehreren Schnittstellen erstellen. Im folgenden YAML wird die obige Konfiguration auf Namespaceebene repliziert.
apiVersion: v1 kind: Namespace metadata: name: vn0-ns annotations: net.juniper.contrail.podnetwork: vn0-ns/vn0 --- # Pod annotations: k8s.v1.cni.cncf.io/networks: | [ { "name": "vn1", "namespace": "vn1-ns", }, { "name": "vn2", "namespace": "vn2-ns", } ]