腾讯云和华为云的ingress路径匹配规则把我绕晕了

本文简单调研了腾讯云和华为云的关于ingress路径匹配规则的实现的差异,了解这些,可以让你的头更大

路径匹配规则

目前官方k8s支持的路径匹配规则只有以下三种类型,但不同的云厂商通过自己实现对应的ingress controller,往往还支持正则匹配等不同的路径规则。

腾讯云ingress

本文主要调研了Tke的两类ingress,分别是应用型CLB和Nginx ingress Controller,这两类ingress在页面创建时均不支持选择路径匹配规则,而二者关于路径匹配规则的实现又有所差异,但二者在腾讯云页面上创建出来的ingress的yaml中路径匹配字段均是ImplementationSpecific

Nginx Ingress

腾讯云的nginx ingress类型是基于原生的Nginx ingress controller实现的。(别问我是怎么知道的)

参考了Nginx ingress的官方文档,Nginx ingress 支持显示指定ExactPrefix,也支持通过annotation+ImplementationSpecific的方式去隐式指定正则匹配规则(kubernetes.github.io/ingress-ngi... ),如下所示:

为什么在Tke页面上创建出来的ingress默认就是ImplementationSpecific规则,结合官方文档上的描述,推测是因为ImplementationSpecificExactPrefix能够兼容更多的字符类型(kubernetes.github.io/ingress-ngi... )。

腾讯云上创建出来的ingress转发规则,默认的路径匹配规则为ImplementationSpecific,结合官方文档说明以及测试验证,确认默认情况下实际是按照前缀匹配规则来进行匹配的。

应用型CLB

按照腾讯云官方文档上的描述(cloud.tencent.com/document/pr... ),腾讯云上的应用型CLB支持通过配置含特定字符的路径来使用不同的路径匹配规则,具体如下所示:

如果是以/开头的话,按最长前缀匹配,优先精确匹配,而后模糊匹配。

Cce ingress

cce的ingress支持前缀匹配,精确匹配和正则匹配三种路径匹配规则。按照官方文档的描述(support.huaweicloud.com/cce_faq/cce... ),cce是通过ingress中的property字段来标明路径匹配规则,而这个property字段在社区的ingress上是没有的。

因此,我们使用client-go创建ingress时是打上了这个annotation的,而在cce云上直接创建的ingress是没有这个annotation的。

这里提供一段转换的代码供大家参考:

go 复制代码
type ccePathType struct {
   Host      string `json:"host"`
   Path      string `json:"path"`
   MatchMode string `json:"matchmode"`
}


var ingressProperty []ccePathType
for i := range ingress.Spec.Rules {
   if ingress.Spec.Rules[i].HTTP != nil {
      for j := range ingress.Spec.Rules[i].HTTP.Paths {
         ingressProperty = append(ingressProperty, ccePathType{
            Host:      ingress.Spec.Rules[i].Host,
            Path:      ingress.Spec.Rules[i].HTTP.Paths[j].Path,
            MatchMode: matchModeMap[string(*ingress.Spec.Rules[i].HTTP.Paths[j].PathType)],
         })
         ingress.Spec.Rules[i].HTTP.Paths[j].PathType = (*networkingv1.PathType)(&implementationSpecificPathType)
      }
   }
}
cceIngressPropertyValue, err := json.Marshal(ingressProperty)
if err != nil {
   return err
}
meta.SetAnnotation(ingress, "kubernetes.io/ingress.property", string(cceIngressPropertyValue))
相关推荐
Wpa.wk8 小时前
容器编排 - 了解K8s(pod, deployment,service,lable等概念)
经验分享·测试工具·docker·云原生·容器·kubernetes
野犬寒鸦8 小时前
从零起步学习并发编程 || 第一章:初步认识进程与线程
java·服务器·后端·学习
我爱娃哈哈9 小时前
SpringBoot + Flowable + 自定义节点:可视化工作流引擎,支持请假、报销、审批全场景
java·spring boot·后端
江畔何人初9 小时前
kubernet与docker的关系
linux·运维·云原生
xuefuhe10 小时前
Kubernetes基础入门4 应用的扩展与收缩
云原生·容器·kubernetes
李梨同学丶10 小时前
0201好虫子周刊
后端
思想在飞肢体在追11 小时前
Springboot项目配置Nacos
java·spring boot·后端·nacos
Wpa.wk11 小时前
容器编排 - K8s - 配置文件参数说明和基础命令
经验分享·测试工具·docker·云原生·容器·kubernetes
Loo国昌13 小时前
【垂类模型数据工程】第四阶段:高性能 Embedding 实战:从双编码器架构到 InfoNCE 损失函数详解
人工智能·后端·深度学习·自然语言处理·架构·transformer·embedding
ONE_PUNCH_Ge14 小时前
Go 语言泛型
开发语言·后端·golang