Ingress是Kubernetes中的一种资源类型,它管理着从集群外部访问集群内部服务的路由规则。它提供统一的入口,可以将所有的HTTP(S)流量路由到正确的服务。
一、什么是Ingress Nginx?
Ingress Nginx是一个开源的支持Kubernetes的负载均衡器,可以扩展Kubernetes以便于更好地支持外部请求。 它支持使用多种负载均衡算法和HTTP/HTTPS协议。 Ingress Nginx还提供了多种插件,可以支持认证、重定向、IP白名单,以及安全策略等功能。
使用Ingress Nginx可以有效地减少集群中暴露的端口数量,提高了集群的安全性,同时也可方便地管理和配置路由规则。
二、如何在Kubernetes中使用Ingress Nginx?
Ingress Nginx需要使用Ingress对象来管理路由规则。 编写一个Ingress对象需要一个主机名(host)或者一个主机名和一个路径(path)。 对于一个请求,Ingress会使用这个主机名和路径来匹配路由规则,并将这个请求路由到相应的服务中。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - host: example.com http: paths: - path: /foo pathType: Prefix backend: service: name: my-service port: name: http
上面的YAML文件定义了一个名为my-ingress的Ingress对象,它将主机名example.com/foo转发到my-service的端口 http。
根据需要,可以使用其他的Ingress控制器实现相同的功能。但是,Ingress Nginx是最常用的控制器,并为大多数工作负载提供了全部支持。
三、Ingress Nginx的主要特性
1. TLS支持
Ingress Nginx可以通过TLS证书保护应用程序,确保HTTP(S)通信的机密性。 它提供了多种配置TLS的方法,包括通配符证书和SNI(服务器名称指示符)。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: tls: - hosts: - example.com secretName: example-tls rules: - host: example.com http: paths: - path: /foo pathType: Prefix backend: service: name: my-service port: name: http
上面的YAML文件中增加了一个名为example-tls的TLS的secret配置,并在Ingress对象中指定了TLS证书的属性。
2. 负载均衡和流量控制
使用Ingress Nginx,可以使用多种负载均衡算法(例如Round Robin,Least Connections)和HTTP/HTTPS协议。它还支持一系列流量控制方法,包括IP白名单和黑名单,cookie,来自指定区域的流量控制和缓存等。
3. 多协议支持
Ingress Nginx支持通过WebSocket协议进行通信,它定义了一种协议扩展,可以将HTTP连接升级到带有双向通信能力的WebSocket连接,使得应用程序可以在不刷新页面的情况下接受更新。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - host: example.com http: paths: - path: /foo pathType: Prefix backend: service: name: my-service port: name: http - host: ws.example.com http: paths: - path: /ws pathType: Prefix backend: service: name: my-websocket-service port: name: websocket nginx.org/websocket-services: "my-websocket-service"
YAML文件例子中,定义了2个路径,一个是默认的http路径,一个是基于WebSocket协议的ws路径,对应的service中声明了对应的端口名称,以支持两种不同的网络通信方式。
4. 认证和授权
Ingress Nginx支持多种认证和授权的插件,例如基于HTTP基本认证、客户端证书、OAuth等。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: nginx.ingress.kubernetes.io/auth-type: basic nginx.ingress.kubernetes.io/auth-secret: basic-auth spec: rules: - host: example.com http: paths: - path: /foo pathType: Prefix backend: service: name: my-service port: name: http
示例的YAML文件中使用了基本认证,在Ingress对象中指定了隐含密钥basic-auth的属性。
四、结论
对于需要对外暴露服务的Kubernetes集群,Ingress Nginx是一个非常有用的工具。 它支持多种负载均衡算法,可以通过TLS证书保护应用程序,还可以采用各种插件进行认证和授权,并支持多种流量控制方式。 在使用Ingress对象管理路由规则时,可以有效地减少集群中要暴露的端口数量,提高了集群的安全性。