问题描述
安全容器使用的CNI插件是什么?有什么重要特性?用户侧如何使用VPC、Subnet、FIP等各种网络资源?
解决方案
安全容器6.1.1版本CNI是基于易捷行云软SDN网络服务作为后端,以kube-ovn(v1.9.0版本)作为API接口,为不同算力(容器、云原生云主机、裸金属)提供统一网络方案;为实现这个设计目标,对kube-ovn 作为容器CNI 做了一些改动和限制;和社区版本的主要区别体现在:
1、当前版本跨节点通信 不支持 underlay 模式,只支持geneve 隧道模式
2、VPC 功能增强
1)容器网络使用的VPC 依赖于软SDN的 router,所以默认VPC的更新配置,及 自定义VPC的创建 需要结合软SDN router页面操作完成,具体步骤见操作手册。
2)容器网络的VPC 网关出外网配置由软SDN router 自动完成,对应社区kube-ovn文档中 VPC 网关配置相关的操作,这部分无需用户再做配置。同时VPC只支持集中式网关(对应 VPC spec中 gatewaytype 字段)。
3)支持自定义VPC,且自定义VPC内容器网络也支持 nodeport、探针等功能(当前版本限制:不同vpc间 subnet cidr 不能有 overlap),同时支持自定义VPC的网关节点的配置。
4)容器VPC与其他算力的互联需要在 软SDN router页面完成配置。
3、新增Floating IP(简称fip) 功能
1)fip 作为软SDN管理的统一资源,可以同时被 不同算力(vm、pod、裸金属) 使用;fip 在pods中的具体使用方式请参照用户手册。
2)产品中使用内部CRD fips.neutron.io 管理记录当前容器可用的fip 资源池,用户可以k8s API通过查看对应的 fip CR查看可用的 fip address 使用,fip的记录与回收会自动处理。
4、subnet功能增强
支持subnet 中定义projectIDs,表示该subnet只能被哪些projects使用;如果不配置表示 该subnet为share subnet,所有用户可用。
如何启用kube-ovn 组件
通过安全容器服务页面创建的命名空间,默认所有负载都是使用kube-ovn作为CNI。
API方式,需要对命名空间打上标签managed.es.io/resource=namespace
;例如:
apiVersion: v1
kind: Namespace
metadata:
name: easystack
managed.es.io/resource: namespace
如何自定义VPC网络
在创建工作负载时,其网络不仅支持使用系统默认生成的ovn-cluster和子网,还支持使用自定义的VPC网络或子网。用户可根据实际业务场景,酌情选择对应方案。
配置外部网络。
(可选)创建外部网络。
本操作用于预创建外部网络,以便在自定义VPC网络时能够为其建立外部连接。如使用已有外部网络时,可跳过本步骤。
在云平台的顶部导航栏中,依次选择[产品与服务]-[网络]-[网络],进入“网络”页面。
单击
创建网络
,进入“创建网络”页面。“网络类型”请选择“外部网络”,并配置其他参数后,单击
创建网络
,完成操作。其中,其他参数的具体参数说明,请参考“SDN网络服务”帮助中“网络”的相关内容。
查看外部网络的ID。
在“网络”页面中,单击待操作网络名称,进入其详情页面。在该页面中,查看并记录该网络的ID(即UUID参数的值)。
配置路由器。
(可选)创建路由器。
本操作用于预创建路由器,以便在自定义VPC网络时能够为其建立外部连接。如使用已有路由器时,可跳过本步骤。
在云平台的顶部导航栏中,依次选择[产品与服务]-[网络]-[路由器],即可进入“路由器”页面。
单击
创建路由器
,弹出“创建路由器”对话框。配置参数后,单击
创建
,完成操作。
(可选)设置路由器网关。
本操作用于预设置路由器网关,以便在自定义VPC网络时能够为其建立外部连接。如路由器已设置网关时,可跳过本步骤。
在“路由器”页面中,勾选待操作路由器后,单击
更多
-设置网关
,弹出“设置路由器网关”对话框。“分配外部IP”选择“手动选择”,“子网”选择上述外部网络子网,并配置其他参数后,单击
设置
,完成操作。其中,其他参数的具体参数说明,请参考“SDN网络服务”帮助中“路由器”的相关内容。
查看路由器ID和外部网络IP地址。
在“路由器”页面中,单击上述路由器名称,进入其详情页面。在该页面中,查看并记录该路由器的ID(即UUID参数的值)和外部网络IP地址(即外部IP参数的值)。
导入VPC资源。
在云平台顶部导航栏中,依次选择[产品与服务]-[容器服务]-[安全容器服务],进入“安全容器服务”页面。
在左侧导航栏选择[管理视图]-[自定义资源管理],或在左侧导航栏选择[业务视图],并选择目标命名空间后,选择[自定义资源管理],进入“自定义资源管理”页面。
单击页面右下角的“Yaml”图标,进入“导入Yaml”页面。
依据实际业务情况,输入Yaml文件内容,或直接单击编辑区域右上角的“导入”图标,导入预先配置的Yaml文件。Yaml文件格式如下(其中,name为自定义输入的VPC名称,externalGatewayIp为外部网络的IP地址,externalNetworkID为外部网络的ID,neutronRouter为路由器的ID):
apiVersion: kubeovn.io/v1 kind: Vpc metadata: name: test-vpc2 spec: externalGatewayIp: 172.110.0.160 externalNetworkID: c9a831a0-6298-44c6-a664-2f362e60e419 neutronRouter: c761887f-40bd-4df0-9b43-7c6bb009aab7
待调试通过后,单击
导入
,完成操作。spec关键字段说明:
externalNetworkID:外部网络ID(必填)
externalNetworkName:外部网络名字(选填)
外部网关IP(选填);注: 该ip为vpc下pod 访问外网的默认 snat ip, 允许pod访问外网有两种方式:vpc yaml中定义该字段,或者网络页面设置路由网关开启snat
neutronRouter:路由ID(必填)
gatewayNode(选填, ovn pod访问节点的出入口节点,默认为网络节点)
自定义子网
> 警告:
>
> * 在同一VPC内,请确保各子网不发生冲突。
> * 在不同VPC之间,如需配置多个用户路由器之间的云内对等连接,请确保各路由器的子网不发生冲突。
在云平台顶部导航栏中,依次选择[产品与服务]-[容器服务]-[安全容器服务],进入“安全容器服务”页面。
在左侧导航栏选择[管理视图]-[自定义资源管理],或在左侧导航栏选择[业务视图],并选择目标命名空间后,选择[自定义资源管理],进入“自定义资源管理”页面。
单击页面右下角的“Yaml”图标,进入“导入Yaml”页面。
依据实际业务情况,输入子网内容,或直接单击编辑区域右上角的“导入”图标,导入预先配置的Yaml文件。Yaml文件格式如下(其中,name为自定义输入的子网名称,vpc为该子网所属VPC的名称,cidrBlock为该子网的网段,natOutgoing为是否允许访问外部网络):
kind: Subnet apiVersion: kubeovn.io/v1 metadata: name: net192 spec: vpc: test-vpc-2 cidrBlock: 192.168.100.0/24 natOutgoing: true
待调试通过后,单击
导入
,完成操作。spec 关键字段说明
vpc:属于哪个vpc
cidrBlock:subnet cidr
natOutgoing:是否可以访问外部网络
projectIDs: 配置该subnet只能被哪些projects使用,如果不配置表示 该subnet为share subnet 所用用户可用
如果通过页面部署工作负载时不选择Subnet子网,会使用vpc中默认子网进行部署;如果通过yaml定义,spec样例如下:
apiVersion: v1 kind: Pod metadata: annotations: ovn.kubernetes.io/logical_switch: another-subnet namespace: default name: another-subnet-pod
Floating IP 使用
fip 在容器产品中使用包括两个场景:pods 指定使用 SNAT作为出口IP;允许kubevirt 云原生云主机 使用EIP。
使用方式有两种:页面操作,用户可在网络高级配置中可以选择正确的fip资源;或者yaml定义。
两种使用场景yaml spec定义样例如下:
1)SNAT出口IP
apiVersion: v1
kind: Pod
metadata:
annotations:
ovn.kubernetes.io/snat: 172.35.0.18
name: snat-busybox
2)EIP
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: kubevirt-eip
spec:
template:
metadata:
annotations:
ovn.kubernetes.io/eip: 172.35.0.20