Ingress路由
- ingress
- 2024-08-22
- 88热度
- 0评论
Ingress是什么?
Ingress 是 Kubernetes 中的一种资源对象,用于管理从集群外部到内部服务的 HTTP 和 HTTPS 路由。它提供了灵活的路由功能、SSL/TLS 终止、负载均衡和虚拟主机支持。Ingress 需要一个 Ingress 控制器来实际处理路由,并且可以通过配置不同的控制器来满足不同的需求。
下图展示了 Ingress 是如何运作的:
通过配置,Ingress 可为 Service 提供外部可访问的 URL、对其流量作负载均衡、终止 SSL/TLS,以及基于名称的虚拟托管等能力。 Ingress 控制器 负责完成 Ingress 的工作,具体实现上通常会使用某个负载均衡器,不过也可以配置边缘路由器或其他前端来帮助处理流量。
Ingress 功能
- 提供外部可访问的 URL
- 流量负载均衡
- SSL/TLS 终止
- 基于名称的虚拟托管
Ingress 资源示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
Ingress 规则
host
:可选,指定主机名。paths
:路径列表,每个路径关联一个后端服务。backend
:定义服务和端口。
默认后端
未匹配任何规则的请求将被路由到默认后端。
路径类型
ImplementationSpecific
:由 IngressClass 决定匹配方法。Exact
:精确匹配 URL 路径。Prefix
:基于 URL 路径前缀匹配。
Ingress 类
Ingress 可以由不同的控制器实现,每个 Ingress 应指定一个类(IngressClass),包含额外配置,如控制器名称。
IngressClass 参数
.spec.parameters
字段可引用其他资源以提供相关配置。参数的具体类型取决于 .spec.controller
字段中指定的 Ingress 控制器。
IngressClass 作用域
IngressClass 参数可以是集群作用域或命名空间作用域。
集群作用域
默认情况下,IngressClass 参数是集群范围的。如果未设置 .spec.parameters.scope
或将其设置为 Cluster
,则 IngressClass 引用集群范围的资源。
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb-1
spec:
controller: example.com/ingress-controller
parameters:
scope: Cluster ### 集群
apiGroup: k8s.example.net
kind: ClusterIngressParameter
name: external-config-1
命名空间作用域
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb-2
spec:
controller: example.com/ingress-controller
parameters:
scope: Namespace ### 命名空间
apiGroup: k8s.example.com
kind: IngressParameter
namespace: external-configuration
name: external-config
默认 Ingress 类
可以将一个 IngressClass 标记为集群默认类。设置 ingressclass.kubernetes.io/is-default-class
注解为 true
确保新的 Ingress 使用默认 IngressClass。
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: default-ingress-class
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
spec:
controller: example.com/ingress-controller
单个服务支持的 Ingress
单个主机:
根据请求的 HTTP URI,将来自同一 IP 地址的流量路由到多个服务。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: fanout-example
spec:
rules:
- host: example.com
http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: foo-service
port:
number: 80
- path: /bar
pathType: Prefix
backend:
service:
name: bar-service
port:
number: 80
多个主机:
将针对多个主机名的 HTTP 流量路由到同一 IP 地址上。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: name-based-example
spec:
rules:
- host: foo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: foo-service
port:
number: 80
- host: bar.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: bar-service
port:
number: 80
TLS
你可以通过设定包含 TLS 私钥和证书的 Secret 来保护 Ingress。TLS 配置示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-example
spec:
tls:
- hosts:
- example.com
secretName: tls-secret
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80