如果您希望为ACK集群提供精细化的流量管理、流量隔离、网络策略配置和IP管理能力,可以通过使用Terway弹性网卡中继为每个Pod配置固定IP、独立的虚拟交换机或安全组来实现。
背景信息
弹性网卡中继(Trunk ENI)是一种新的虚拟网卡。除了提供原有弹性网卡(ENI)相同的功能外,还支持将额外的ENI挂载到Trunk ENI上使用。这部分额外的ENI将以独占的方式分配给Pod。
在为集群启用Trunk ENI功能后,可以让一部分Pod使用自定义配置,另外的Pod则使用共享配置。Pod自定义配置是可选功能,默认情况下创建的Pod使用的是共享ENI上的IP地址。只有当您主动声明为指定Pod开启自定义配置后,相应的Pod才能使用自定义配置。
启用Pod自定义配置后,集群内将部署terway-controlplane组件,其工作模式如下图所示。
使用限制
在Terway网络中为Pod配置固定IP及独立虚拟交换机、安全组功能正在公测中,如需使用请到配额平台申请。
使用Terway插件Trunk功能,您需要选择支持Trunk功能,且响应参数为
EniTrunkSupported=true
的实例。关于实例支持情况,请参见DescribeInstanceTypes。单节点所支持的Pod数量有限制,关于节点所支持容器网络Pod数量的详细描述,请参见使用Terway网络插件。
Pod安全组规则不会应用到同节点Pod之间的流量以及同节点上节点与Pod之间的流量。如果您需要限制,可以通过NetworkPolicy进行配置。
步骤一:为集群启用Trunk ENI功能
ACK专有集群需要额外申请Trunk实例使用权限,请向ECS提交工单申请。ACK托管集群无需额外申请Trunk实例使用权限。
方式一:为新建集群启用Trunk ENI功能
创建ACK集群,网络插件选择Terway,在Terway模式中选中Trunk ENI支持,该模式的网络插件类型为terway-eniip。详细信息,请参见创建Kubernetes专有版集群和创建Kubernetes托管版集群。
新建集群一旦启用Trunk ENI功能,则不再支持修改。
方式二:为已有集群启用Trunk ENI功能
前提条件
已有集群的网络插件类型为terway-eniip。关于Terway网络插件的更多信息,请参见使用Terway网络插件。
可以在集群的组件管理页面查看您安装的网络插件类型。
使用限制
2020年06月之前创建的ACK托管集群不支持此功能。
固定IP及独立虚拟交换机、安全组开启后不可关闭。
步骤一:查看集群是否支持使用Trunk ENI功能
对于ACK专有集群,需要额外申请Trunk实例使用权限。请向ECS提交工单申请即可使用Trunk ENI功能。
对于存量ACK托管集群或是由ACK专有集群迁移过来的ACK托管集群,需要查看集群是否支持使用Trunk ENI功能,并修改配置。无需额外申请Trunk实例使用权限。
执行以下命令,检查token配置。
kubectl get secret -nkube-system addon.network.token
预期输出如下所示:
NAME TYPE DATA AGE
addon.network.token Opaque 1 69m
如果存在token配置,则执行下一步;如果不存在token配置,表明该集群不支持使用Trunk ENI功能,请新建集群支持Trunk ENI功能。
步骤二:开启terway-eniip并为集群启用Trunk ENI功能
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页面,单击网络页签,找到terway-eniip组件。
在terway-eniip卡片,单击升级,升级terway-eniip组件到最新版本。
如果卡片上没有升级字样,说明当前组件已经是最新版本,请跳过此步骤。
开启terway-enniip。
执行如下命令,编辑eni-config。
kubectl edit cm -nkube-system eni-config
编辑YAML文件的eni-config参数:
参数
值
说明
enable_eni_trunking
true
启用Trunk ENI功能。开启后不可关闭。
credential_path
/var/addon/token-config
对于ACK托管集群,如果YAML文件中不存在该参数,请自行添加。
重要请勿修改其他参数。
eni-config内容需要为合法JSON格式。
配置参数示例如下:
apiVersion: v1 data: eni_conf: | { "min_pool_size": 0, "enable_eni_trunking": true, "credential_path": "/var/addon/token-config", ... } kind: ConfigMap
执行如下命令,重启terway pods,使配置生效。
kubectl delete pod -n kube-system -l app=terway-eniip
请在terway-eniip参数配置完成后,在组件管理页面的网络页签,安装terway-controlplane组件。
安装结束后,在terway-controlplane卡片上可以看到已安装字样。
步骤二:创建网络自定义资源PodNetworking
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在自定义资源页面,单击使用YAML创建资源,至少创建一个PodNetworking来描述网络配置。创建PodNetworking的示例如下:
Terway增加一种名为PodNetworking的自定义资源来描述网络配置。您可以创建多个PodNetworking来规划不同的网络平面。
apiVersion: network.alibabacloud.com/v1beta1 kind: PodNetworking metadata: name: example spec: allocationType: type: Fixed # Pod IP分配的策略,可以取值为Elastic或Fixed。 releaseStrategy: TTL # 只有将type配置为Fixed时,releaseStrategy参数才有效;type的配置为Elastic时,无需配置releaseStrategy和releaseAfter参数。 releaseAfter: "1h" # 在releaseStrategy为TTL模式下,releaseAfter参数才有效。 selector: podSelector: matchLabels: foo: bar namespaceSelector: matchLabels: foo: bar securityGroupIDs: - sg-bpxxxx vSwitchOptions: - vsw-bpxxxx status: status: Ready
参数说明如下:
参数
说明
allocationType
(描述Pod IP分配的策略)
type
取值范围:
Elastic:弹性IP策略。Pod删除后,IP资源被释放。
Fixed:固定IP策略。
启用后,该PodNetworking只对有状态(StatefulSet)的Pod生效。关于StatefulSet,请参见Kubernetes有状态服务-StatefulSet使用最佳实践。
如果您使用了固定IP策略,Pod重建后的可用区将被添加约束,来确保和第一次调度的可用区匹配。
releaseStrategy
IP释放策略,只有将
type
配置为Fixed
时,该参数才有效。参数取值范围如下。TTL
:延迟释放IP策略。当Pod被删除一段时间后,才会释放IP,最小值为5分钟。Never
:不释放IP策略。当您无需使用IP时,需要自行删除PodENI资源。
releaseAfter
延迟回收时间。仅在
releaseStrategy
为TTL
模式下生效,支持时间格式为Go time type,例如2h45m
、5m0s
。关于Go time type,请参见Go time type。selector
(用于配置标签选择器,被选中的Pod将使用该网络配置)
podSelector
用来匹配Pod的Labels,匹配的Pod在创建时将使用这个网络配置。
如果同时配置
podSelector
与namespaceSelector
,符合全部匹配规则的Pod在创建时将使用这个网络配置。您在配置Pod标签与PodNetworking中的selector时,请确保有唯一匹配关系,如果Pod被多个PodNetworking配置匹配,将使用任意匹配的PodNetworking配置。
namespaceSelector
用来匹配Namespace的Labels,匹配的Pod在创建时将使用这个网络配置。
如果同时配置
podSelector
与namespaceSelector
,符合全部匹配规则的Pod在创建时将使用这个网络配置。您在配置Pod标签与PodNetworking中的selector时,请确保有唯一匹配关系,如果Pod被多个PodNetworking配置匹配,将使用任意匹配的PodNetworking配置。
vSwitchOptions
-
用于配置Pod使用的vSwitch,多个vSwitchID之间为或的关系。Pod仅能使用一个vSwitch,Terway将选择一个符合条件的vSwitch。
您的Pod所在可调度可用区将被添加约束,来确保这些可用区和您配置的vSwitchOptions列表内的资源所处的可用区一致。
请确保vSwitchOptions中的vSwitch所在可用区和您指定调度的节点可用区一致,并且拥有足够的剩余IP资源,否则Pod将创建失败。
securityGroupIDs
-
可配置多个安全组ID,配置多个安全组时将同时生效,安全组数量小于等于5个。
单击创建。
创建PodNetworking资源后,Terway将同步网络配置信息,只有在
status
成为Ready
后,该网络资源才能对Pod生效。可以执行如下命令,查看资源状态是否
ready
。kubectl describe PodNetworking example # 请将example换成您自己的自定义资源名称。
步骤三:创建Pod
创建Pod时,Pod将通过标签去匹配PodNetworking。如果Pod没有匹配到任何PodNetworking,则Pod将使用默认的共享ENI上的IP。如果Pod匹配到PodNetworking,则将使用PodNetworking中定义的配置分配ENI。关于Pod标签相关内容,请参见标签。
Terway会为这类Pod创建相应的名为PodENI的自定义资源,用于跟踪Pod所使用的资源,该资源由Terway管理,您不可修改该资源。
迁移集群时,停止terway-controlplane
ACK专有集群在启用Pod自定义配置后,不能直接迁移到Pro版集群。您需要在迁移前停止terway-controlplane ,并在迁移后启用terway-controlplane。
迁移前准备。
执行以下命令,停止terway-controlplane。
kubectl scale deploy -nkube-system terway-controlplane --replicas 0
执行以下命令,完成webhook配置。
# 备份webhook配置。 kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io terway-controlplane -oyaml > terway-controlplane.mutatingwebhookconfigurations.yaml kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io terway-controlplane -oyaml > terway-controlplane.validatingwebhookconfigurations.yaml # 清理webhook配置。 kubectl delete -f terway-controlplane.mutatingwebhookconfigurations.yaml kubectl delete -f terway-controlplane.validatingwebhookconfigurations.yaml
迁移集群完成后,检查迁移结果。
说明关于迁移集群的具体操作,请参见热迁移ACK专有版集群至ACK集群Pro版。
如果迁移集群失败,执行以下命令,恢复webhook和terway-controlplane。
# 恢复webhook配置。 kubectl apply -f terway-controlplane.mutatingwebhookconfigurations.yaml kubectl apply -f terway-controlplane.validatingwebhookconfigurations.yaml # 恢复terway-controlplane。 kubectl scale deploy -nkube-system terway-controlplane --replicas 1
如果迁移集群成功,执行以下命令,清理资源。
kubectl delete deploy -nkube-system terway-controlplane
在组件管理页面安装terway-controlplane。具体操作,请参见管理组件。
常见问题
如何判断Pod是否使用了PodNetworking的网络配置?
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
Terway将创建Pod同名、同命名空间的PodENI资源,用于记录所使用的网络配置信息。您可以通过以下方式查询。
kubectl get podenis.network.alibabacloud.com your-pod-name -n default -oyaml apiVersion: network.alibabacloud.com/v1beta1 kind: PodENI metadata: finalizers: - pod-eni generation: 1 name: your-pod-name namespace: default spec: allocations: - allocationType: type: Elastic eni: id: eni-bp1xxxx mac: 00:16:xx:xx:xx:xx securityGroupIDs: - sg-bp1xxxx vSwitchID: vsw-bp1xxxx zone: cn-hangzhou-h ipv4: 192.168.x.x ipv4CIDR: 192.168.x.x/19 ipv6: 2408:x:x:x:x:x:x:x ipv6CIDR: 2408:x:x:x::/64 zone: cn-hangzhou-h status: eniInfos: eni-bp1xxxx: id: eni-bp1xxxx status: Bind vid: 1001 instanceID: i-bp1xxxx phase: Bind podLastSeen: "2021-xx-xxT00:00:00Z" trunkENIID: eni-bp1xxxx
Pod创建后为什么没有使用PodNetworking中的网络配置?
请确保PodNetworking资源状态为
Ready
。请确保Pod标签和PodNetworking中的标签可以唯一匹配。
如果您使用固定IP策略,则非StatefulSet控制器创建的Pod将无法被匹配。
相关文档
您可以为弹性网卡(ENI)配置多个安全组,从而实现更灵活的Pod网络防火墙策略。具体操作,请参见为弹性网卡(ENI)配置多个安全组。
在使用过程中遇到容器网络相关问题,请参见容器网络FAQ。