部署自定义默认 Pod 网络
总结 从版本 22.4 开始,瞻博网络云原生 Contrail 网络支持自定义默认容器网络。自定义默认 Pod 网络使 Kubernetes 能够基于每个命名空间或每个 Pod 创建具有单个 Pod 网络的 Pod。
自定义容器网络概述
在传统 Kubernetes 中,默认 Pod 网络是集群中所有 Pod 使用的单个无类别域间路由 (CIDR),无论命名空间如何。这种方法不允许在 Pod 之间进行网络层分段,因为 Kubernetes 会从共享的 CIDR 分配 IP。CN2 通过隔离命名空间解决了这一缺点。隔离命名空间使 Kubernetes 能够基于每个命名空间创建新的默认 Pod 和服务网络。这意味着,当 Kubernetes 创建新的 Pod 或服务时,该 Pod 或服务会附加到单个隔离命名空间中的默认网络。隔离的命名空间可确保 Pod 和服务之间的网络隔离。
CN2 版本 22.4 改进了此功能,使 Kubernetes 能够基于每个 Pod 创建具有单个 Pod 网络的 Pod。自定义默认容器网络提供自己的 VirtualNetworks
(VN) 和子网。CN2 根据给定自定义默认 Pod 网络的子网参数分配 Pod IP。作为自定义默认 Pod 网络的结果,您可以在给定命名空间中创建具有自己的网络的 Pod。换句话说,CN2 支持命名空间级别和 Pod 级别的网络隔离。
部署自定义默认 Pod 网络
您可以使用以下方法部署自定义默认容器网络:
-
将 定义为
VirtualNetwork
自定义默认 Pod 网络:如果手动创建VirtualNetwork
对象,则必须在虚拟网络规范中设置字段 “podNetwork: true
”。此字段将新 VN 指定为自定义默认容器网络。以下是指定为自定义默认 Pod 网络的示例
VirtualNetwork
。apiVersion: core.contrail.juniper.net/v2 kind: VirtualNetwork metadata: namespace: cpn-snat name: cpn1 spec: podNetwork: true fabricSNAT: true v4SubnetReference: apiVersion: core.contrail.juniper.net/v2 kind: Subnet namespace: cpn-snat name: cpn1-sn
-
安装注释中
juniper.net/networks
设置了“podNetwork: true
”的网络附件定义 (NAD) 以创建自定义默认 Pod 网络:如果创建此 NAD,NAD 控制器会自动创建 VN,并在创建过程中VirtualNetwork
设置podNetwork: true
“”字段。以下是指定为自定义默认 Pod 网络的 NAD 示例。
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: namespace: cpn-bgpaas name: cpn1 annotations: juniper.net/networks: | { "ipamV4Subnet": "140.140.140.0/24", "podNetwork": true } spec: config: | { "cniVersion": "0.3.1", "name": "contrail-k8s-cni", "type": "contrail-k8s-cni" }
-
为每个命名空间指定自定义默认 Pod 网络:如果命名空间中的所有 Pod 都使用该网络作为 Pod 网络,则可以基于每个命名空间指定自定义 Pod 网络。注
Namespace
记net.juniper.contrail.podnetwork: network-namespace/network-name
会将所需网络指定为自定义容器网络。以下 YAML 部分显示了为命名空间定义的自定义 Pod 网络的注释示例。
apiVersion: v1 kind: Namespace metadata: name: custom-podnet annotations: net.juniper.contrail.podnetwork: custom-podnet/ns-level-custom-podnet
注意:如果命名空间使用与主接口 (eth0) 相同的网络,则无需为命名空间中的 Pod 指定 NAD 注释。换句话说,由于命名空间使用注释指定网络,因此该命名空间中的 Pod 不需要指定同一个网络。
注意:创建命名空间时,命名空间的注释必须存在。您无法更新命名空间上的注释以更改其网络。必须重新创建命名空间才能更改其网络。如果检测到命名空间内自定义容器网络注释的更新,
kubemanager
则会kubemanager
标记该命名空间以及在更新未启动后在该命名空间中创建的任何容器。还原更新会移除该标志,Pod 将正常启动。 -
为每个容器指定自定义默认容器网络:要基于每个容器指定自定义容器网络,必须在 的
NetworkSelectionElement
中cni-args
指定以下键值对:"net.juniper.contrail.podnetwork": true
。注意:此键值对只能指定一次。如果在多个
cn-args
条目中指定此对,则会发生错误。 -
为服务指定自定义默认容器网络:您可以启用服务以选择使用自定义默认容器网络的容器。您必须在 YAML 的
Service
注释中指定所需的容器网络。批注格式为:network-namespace/network-name
。以下 YAML 部分是具有指定自定义 Pod 网络的 YAML 的示例Service
。apiVersion: v1 kind: Service metadata: name: custom-podnet-svc namespace: custom-podnet annotations: net.juniper.contrail.podnetwork: custom-podnet/pod-level-custom-podnet
以下示例 YAML 显示了定义了自定义默认 Pod 网络的命名空间 VirtualNetwork
、 和 Pod。
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: svl-artifactory.juniper.net/atom-docker/cn2/bazel-build/dev/netshoot:v1 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: k8s.v1.cni.cncf.io/networks: | [ { "name": "vn", "namespace": "cpn-intra-network-test-vn", "ips": ["15.15.15.3"], "cni-args": { "net.juniper.contrail.podnetwork": true } } ] spec: containers: - name: toolbox image: svl-artifactory.juniper.net/atom-docker/cn2/bazel-build/dev/netshoot:v1 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"
请注意,此 YAML 显示了在容器和命名空间的注释中定义的自定义容器网络。如果同时在 Pod 和命名空间级别指定注释,则 Pod 级别的注释优先。
自定义默认 Pod 网络交互
有关常见自定义容器网络交互的信息,请参阅以下部分。
Pod 内的多个接口
具有自定义默认容器网络的容器可能仍包含多个接口。以下 YAML 是具有自定义网络和多个接口的 Pod 的示例 NetworkSelectionElement
。
annotations: k8s.v1.cni.cncf.io/networks: | [ { "name": "custom-podnet-vn", "namespace": "custom-podnet", "cni-args": { "net.juniper.contrail.podnetwork": true } }, { "name": "vn1", "namespace": "vn1-ns", }, { "name": "vn2", "namespace": "vn2-ns", } ]
具有上面定义的注释的 Pod 将使用来自 custom-podnet-vn
的 eth0 、来自 vn1
的 eth1 和来自 的 eth2 vn2
您还可以创建具有自定义默认 Pod 网络和多个接口的命名空间。以下 YAML 显示了在命名空间级别复制的上述配置。
apiVersion: v1 kind: Namespace metadata: name: custom-podnet annotations: net.juniper.contrail.podnetwork: custom-podnet/custom-podnet-vn --- # Pod annotations: k8s.v1.cni.cncf.io/networks: | [ { "name": "vn1", "namespace": "vn1-ns", }, { "name": "vn2", "namespace": "vn2-ns", } ]