为Pod配置独立虚拟交换机和安全组

您可以在虚拟节点上通过集群级别的自定义资源PodNetworking来描述网络配置,从而支持在虚拟节点上为每个Pod配置独立的虚拟交换机、安全组。本文介绍如何在ACK ServerlessACK+ECI场景下,通过创建PodNetworking为Pod配置独立虚拟交换机及安全组。

索引

步骤一:创建网络定义

ACK ServerlessACK中,您可以创建多个PodNetworking,来规划不同网络平面。在使用前您至少需要创建一个PodNetworking来描述网络配置。创建PodNetworking的示例如下:

apiVersion: network.alibabacloud.com/v1beta1
kind: PodNetworking
metadata:
  name: example
spec:
  allocationType:
    type: Elastic
  selector:
    podSelector:
      matchLabels:
        foo: bar
    namespaceSelector:
      matchLabels:
        foo: bar
  securityGroupIDs:
  - sg-bpxxxx
  vSwitchOptions:
  - vsw-bpxxxx

参数说明如下。

参数

类型

说明

allocationType

type

取值范围:

  • Elastic:弹性IP策略。Pod删除后,IP资源被释放。

  • Fixed:固定IP策略。ACK Serverless暂不支持此分配策略。

重要

ACK Serverless暂不支持Fixed策略。如果将type配置为Fixed固定IP策略时,该PodNetworking会对所有符合selector的Pod生效,并非只对有状态(StatefulSet)的Pod生效;此外,也无法在PodNetworking资源中配置releaseStrategyreleaseAfter参数。

  • 在ACK中,如果您是将Pod调度到ECI上,则不支持Fixed策略。如果将type配置为Fixed固定IP策略时,则该PodNetworking会对所有符合selector的Pod生效,并非只对有状态(StatefulSet)的Pod生效;此外,也无法在PodNetworking资源中配置releaseStrategyreleaseAfter参数。

  • 在ACK中,如果您是将Pod调度到ECS上,则支持Fixed策略。更多信息,请参见为Pod配置固定IP及独立虚拟交换机、安全组

selector

podSelector

  • podSelector用来在Kubernetes中匹配Pod的标签。当podSelector与Pod的标签完全匹配,Pod被创建时就会使用该网络配置。

  • 请确保配置Pod标签与PodNetworking中的selector有唯一匹配关系。如果Pod被多个PodNetworking配置匹配,将使用任意匹配的PodNetworking配置。

  • 如果同时配置了podSelectornamespaceSelector,那么只有那些既满足podSelector中要求的标签,又满足namespaceSelector中要求的标签的Pod,才会使用该网络配置。

namespaceSelector

  • namespaceSelector用来匹配Kubernetes集群中的Namespace的标签。当namespaceSelector与Namespace的标签完全匹配,那么该Namespace中创建的所有Pod就会使用该网络配置。

  • 在未配置namespaceSelector时,PodNetworking会对所有namespace中满足podSelector的Pod使用该网络配置。

  • 您在配置Pod标签与PodNetworking中的selector时,请确保有唯一匹配关系,如果Pod被多个PodNetworking配置匹配,将使用任意匹配的PodNetworking配置。

  • 如果同时配置了podSelectornamespaceSelector,那么只有那些既满足podSelector中要求的标签,又满足namespaceSelector中要求的标签的Pod,才会使用此网络配置。

securityGroupIDs

不涉及

可配置多个安全组ID。ACK Serverless集群中,只有第一个安全组ID会生效,安全组数量小于等于5个。

vSwitchOptions

不涉及

  • 用于配置Pod使用的vSwitch,多个vSwitchID之间为或的关系。Pod仅能使用一个vSwitch,virtual-kubelet将选择一个符合条件的vSwitch。

  • 如果您为Pod配置了vSwitchOptionsPod后,该Pod所在的可调度可用区将被添加约束,以确保这些可用区和您配置的vSwitchOptions列表内资源所处的可用区一致。

  • 当vSwitchOptions列表内资源所处的可用区并不包含在ACK Serverless已有的可用区时,将会自动创建出该可用区的virtual-node,并将Pod调度到该virtual-node上。

  • 请确保vSwitchOptions中的vSwitch所在可用区和您指定调度的节点可用区一致,并且拥有足够的剩余IP资源,否则Pod将创建失败。

步骤二:创建Pod

创建Pod时,Pod将通过标签匹配PodNetworking。如果Pod没有匹配到任何PodNetworking,则此Pod将使用默认的共享ENI(Elastic Network Interface)上的IP地址。如果Pod匹配到了PodNetworking,则将使用PodNetworking中定义的配置分配ENI。关于Pod标签的相关内容,请参见标签

部署示例

通过下方示例代码展示Kubernetes如何为符合特定标签的Pod分配所需的网络资源,并使用Deployment来创建所需数量的Pod。

---
apiVersion: network.alibabacloud.com/v1beta1
kind: PodNetworking
metadata:
  name: example
spec:
  allocationType:
    type: Elastic
  selector:
    podSelector:
      matchLabels:
        foo: bar
# 同VPC下的安全组
  securityGroupIDs:
  - sg-2zee386juyk226k1cb5h
# 同VPC下的虚拟交换机
  vSwitchOptions:
  - vsw-2zewh0vanjx3vmjisna6z
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: elastic-podnetworking
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
# 符合podNetworking的podSelector
        foo: bar
    spec:
      containers:
      - name: my-container
        image: nginx

常见问题

如何判断Pod是否使用了PodNetworking的网络配置?

Pod创建后,如果在Pod的annotations中是以k8s.aliyun.com/pod-networking作为键值记录创建该Pod,则表示使用了PodNetworking资源。

apiVersion: v1
kind: Pod
metadata:
  annotations:
    k8s.aliyun.com/pod-eni: "true"
    k8s.aliyun.com/pod-networking: podnetworking
  labels:
    app: example
    pod-ip: elastic

Pod创建后为什么没有使用PodNetworking中的网络配置?

Pod标签和PodNetworking中的标签需要保持唯一匹配。请检查两者是否为唯一匹配。