这篇文章已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
Kubernetes 1.18 中对 Ingress API 的改进
Kubernetes 中的 Ingress API 使大量控制器能够提供简单而强大的方法来管理 Kubernetes 工作负载的入站网络流量。在 Kubernetes 1.18 中,我们为此 API 添加了 3 个重要的补充
- 一个新的
pathType
字段,可以指定 Ingress 路径的匹配方式。 - 一个新的
IngressClass
资源,可以指定控制器应如何实现 Ingress。 - 支持主机名中的通配符。
通过路径类型实现更好的路径匹配
新的路径类型概念允许你指定路径的匹配方式。支持三种类型
- ImplementationSpecific(默认): 使用此路径类型,匹配由实现
IngressClass
的控制器决定。实现可以将其视为单独的pathType
,或将其与Prefix
或Exact
路径类型相同对待。 - Exact: 完全匹配 URL 路径,并且区分大小写。
- Prefix: 基于由
/
分隔的 URL 路径前缀进行匹配。匹配区分大小写,并按路径元素逐个进行。
通过 Ingress 类扩展配置
Ingress 资源的设计初衷是简单,提供一组简单的字段,适用于所有用例。随着时间的推移,随着用例的演变,实现开始依赖于大量自定义注释进行进一步配置。新的 IngressClass
资源提供了一种替换某些注释的方法。
每个 IngressClass
都指定哪个控制器应该实现该类的 Ingress,并且可以引用带有其他参数的自定义资源。
apiVersion: "networking.k8s.io/v1beta1"
kind: "IngressClass"
metadata:
name: "external-lb"
spec:
controller: "example.com/ingress-controller"
parameters:
apiGroup: "k8s.example.com/v1alpha"
kind: "IngressParameters"
name: "external-lb"
指定 Ingress 的类
Ingress 规范中添加了一个新的 ingressClassName
字段,用于引用应该用于实现此 Ingress 的 IngressClass
。
弃用 Ingress 类注释
在 Kubernetes 1.18 中添加 IngressClass
资源之前,Ingress 类的类似概念通常使用 Ingress 上的 kubernetes.io/ingress.class
注释指定。尽管此注释从未正式定义,但它得到了 Ingress 控制器的广泛支持,现在应将其视为正式弃用。
设置默认 IngressClass
可以将集群中的特定 IngressClass
标记为默认。将 IngressClass 资源上的 ingressclass.kubernetes.io/is-default-class
注释设置为 true 将确保未指定 ingressClassName
的新 Ingress 将被分配此默认的 IngressClass
。
支持主机名通配符
许多 Ingress 提供商都支持通配符主机名匹配,例如 *.foo.com
匹配 app1.foo.com
,但到目前为止,规范假设主机名的 FQDN 完全匹配。主机现在可以是精确匹配(例如“foo.bar.com
”)或通配符(例如“*.foo.com
”)。精确匹配要求 http 主机头与 Host 设置匹配。通配符匹配要求 http 主机头等于通配符规则的后缀。
主机 | 主机头 | 匹配? |
---|---|---|
*.foo.com | bar.foo.com | 基于共享后缀匹配 |
*.foo.com | baz.bar.foo.com | 不匹配,通配符仅覆盖单个 DNS 标签 |
*.foo.com | foo.com | 不匹配,通配符仅覆盖单个 DNS 标签 |
整合所有功能
这些新的 Ingress 功能允许更多的可配置性。这是一个使用 pathType、ingressClassName
和主机名通配符的 Ingress 示例
apiVersion: "networking.k8s.io/v1beta1"
kind: "Ingress"
metadata:
name: "example-ingress"
spec:
ingressClassName: "external-lb"
rules:
- host: "*.example.com"
http:
paths:
- path: "/example"
pathType: "Prefix"
backend:
serviceName: "example-service"
servicePort: 80
Ingress 控制器支持
由于这些功能是 Kubernetes 1.18 中的新增功能,因此每个 Ingress 控制器实现都需要一些时间来开发对这些新功能的支持。请查看您首选的 Ingress 控制器的文档,以了解它们何时会支持此新功能。
Ingress 的未来
Ingress API 有望在 Kubernetes 1.19 中从 beta 版本升级为稳定的 API。它将继续为 Kubernetes 工作负载提供管理入站网络流量的简单方法。此 API 有意保持简单和轻量级,但对于更高级的用例,人们一直希望获得更大的可配置性。
目前正在开发一组新的高度可配置的 API,这些 API 将在未来提供 Ingress 的替代方案。这些 API 被称为新的“服务 API”。它们并非旨在替换任何现有 API,而是为复杂的用例提供更可配置的替代方案。有关更多信息,请查看 GitHub 上的服务 API 存储库。