行至水穷处 坐看“云”起时

Cloud Native ADN -> CNadn.Net

如何在F5 CIS方案中通过AS3声明式API暴露K8S服务

对于k8s,openshift等PaaS平台,F5通过Container Ingress Services(CIS,以前叫Container Connector)解决方案实现通过F5 BIGIP将上述PaaS平台中需要对外暴露的服务发布到BIGIP上,从而借助BIGIP更多的应用服务交付能力,并解决原生平台在服务对外暴露上的一些问题。

《如何在F5 CIS方案中通过AS3声明式API暴露K8S服务》

在CIS解决方案中,通过运行一个bigip controller 容器(以下简称cc),实现对平台中发布的service等资源进行监听并将其转化为BIGIP上的配置。

在cc V1.9.0版本之前并不支持F5 Application Services 3(AS3)特性,因此在之前的版本上,如果需要配置cc本身还没有支持的一些ADC产品功能,就需要通过iApp模式来进行高级配置的服务发布,此时就需要用户能够熟悉iApp的编写,并将编写的iApp模板提前上传到BIGIP产品里,这将复杂化用户devops pipline以及需要开发人员熟悉与了解F5产品特性与配置,提高了用户门槛,整个实现方式也不够Cloud Native。

从CC V1.9.0开始支持AS3这一声明式API配置方式,这大大简化了配置方式,开发人员也无需了解很多F5产品细节,只需要通过申明需要创建的服务就可以实现自动化配置,在devops pipeline中也无需直接与设备进行交付并处理iApp相关配置,使得整个“source truth”都只存在于configmap中。

AS3配置方式与非AS3配置方式对比:

非AS3配置:

可以看到在上述data部分下配置virtual server的frontend,backend两个部分,frontend部分主要配置关于VSIP,端口,profile,LB算法等,backend部分主要是monitor以及要自动化关注的哪个k8s service。如果使用了iApp,则还会包含iapp部分,例如:

AS3配置方式:

AS3方式配置的configmap则只需要在data部分完全填入一个AS3的声明json template,其中CC会自动化的修改member部分的servicePort和serverAddresses的配置(如果已明确配置了上述内容,则CIS/CC不会修改)。这样只要AS3本身能够支持的就可以在configmap中使用,极大的丰富了配置能力,并使得客户可以统一化配置思想与方式,以code方式保持与管理F5配置。

上述cm配置中,可以看到serverAddresses数组是一个空数组,CC将会自动填写该部分配置。但是CC是如何知道应该将哪个k8s中的service所关联的pods ip(如果是以cluster方式发布服务)或者node ip(如果是以nodeport方式发布发布服务)填写到上述空数组里呢?

在上述配置中,有几个关键的用于标记一个应用的配置,分别是:
tenant信息,即表示对应一个BIGIP上的partition:

应用名称信息 nginxservice,该名称将与partition名称一起共同组成的配置对象的真实path: k8s/nginxservice

pool名称信息:

通过将一个k8s service打上与上述三个信息关联的label,从而可以让CC了解上述AS3应该与哪个service产生关联。

因此在以AS3模式发布下,需要在发布k8s service时候在yaml文件里打上一些labels:

需要注意的是,对于同一个Service不能由多个configmap来对其进行配置,这将导致冲突,比如不可以同时使用传统配置模式又附加AS3配置模式对同一个服务进行配置。
另外,
当前CC的AS3模式不支持对同一个VS声明多个pool
vxlan中产生的静态arp条目在AS3删除配置后并不会被删除

上述AS3最终产生的F5配置:

需要特别注意的是, 在通过as3-configmap配置方式进行配置的时候,as3中的tenant名称不要与CC里配置的bigip partition名称重复。也就是说,cc里配置的bigip partition是非as3方式配置的configmap所配置的服务存储位置,而as3声明的configmap则根据as3的特性自动化在BIGIP上创建新的对应的tenant,两者是相互排斥的。所以一个cc + as3-configmap 则意味着在BIGIP上存在两个不同的partition。

另外,需要注意vxlan模型下AS3实例支持不能超过1个。

cc,cc-bigip-partition, as3 tenant,bigip partition 之间配置关系为:

附:如果同一个k8s partition下发布2个服务,则AS3格式为:

附:如何清除采用as3-configmap所产生的配置

在非as3 configmap配置模式下,只要在k8s里删除configmap,对应F5 bigip配置就会被自动删除掉。

但是如果采用了as3 configmap模式,删除configmap是无法清除对应的F5 bigip配置的。需要在删除对应的as3-configmap后,部署一个空as3的as3-configmap,这样才可以清空F5上的配置。然后记得别忘记删除刚才部署的空configmap。 所以步骤是

kubectl delete -f your-as3-configmap

kubectl create -f blank-as3-configmap

kubectl delete -f blank-as3-configmap

空as3-configmap样例如下,注意修改tenant为实际对应的tenant

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据