Ingress、Ingress Controller 产生缘由
在 Kubernetes 中,Ingress 和 Ingress Controller 的引入主要是为了提供一种集中管理和配置 HTTP/HTTPS 路由层的方式,以便于将外部请求代理分发至集群内不同 Service。Kubernetes Service 默认提供的 ClusterIP、NodePort 和 LoadBalancer 类型仅能解决服务的基本访问问题,但对于复杂的路由规则、SSL/TLS 终止、路径重写等高级特性支持不足。因此,Ingress 资源应运而生,用于定义集群外部到内部服务的七层路由规则。
Ingress Controller 是实际执行 Ingress 规则的软件,它监听 Kubernetes API Server 中的 Ingress 对象变化,并依据这些规则配置相应的负载均衡器或反向代理服务器,如 Nginx、HAProxy 或 Traefik 等,从而实现对集群内外流量的智能调度和管理。
Ingress YAML 描述
以下是一个简单的 Ingress YAML 示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /service1
pathType: Prefix
backend:
service:
name: service1
port:
name: http
- path: /service2
pathType: Prefix
backend:
service:
name: service2
port:
number: 8080
这个示例中,Ingress 定义了一个规则,将 example.com/service1
的请求转发到名为 service1
的 Service 的 http
端口,而 example.com/service2
的请求则被转发到 service2
的 8080 端口。
IngressClass
IngressClass 资源是在 Kubernetes v1.18 版本中引入的,用来明确指定 Ingress 对象应该由哪个 Ingress Controller 处理。这样可以更好地组织和区分不同的 Ingress 控制器,避免冲突或误配。
例如,创建一个 IngressClass 资源:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: nginx
spec:
controller: k8s.io/ingress-nginx
然后,在 Ingress 资源中引用这个 IngressClass:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
# 其他注解...
ingressClassName: nginx
spec:
# ...
使用方法
-
创建 Ingress:
使用kubectl apply -f <ingress.yaml>
创建 Ingress 资源。 -
安装 Ingress Controller:
根据你选择的 Ingress Controller(如 nginx-ingress、traefik 等),按照官方文档安装对应的控制器及其依赖。 -
配置 Ingress Class:
如果使用了 IngressClass,确保 Ingress Controller 已经配置好处理相应的类,并在 Ingress 对象中明确指定。 -
验证路由规则:
创建完 Ingress 后,可以通过检查 Ingress Controller 的相关日志以及尝试访问定义的路由,确认规则是否生效。同时,也可以使用kubectl describe ingress example-ingress
查看 Ingress 的详细状态。
注意,为了使 Ingress 正常工作,还需要确保集群内已有一个可用的 Ingress Controller 正在运行并监控着 Ingress 资源的变化。