您的位置:

Ingress Nginx:Kubernetes的负载均衡和HTTP路由

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对象管理路由规则时,可以有效地减少集群中要暴露的端口数量,提高了集群的安全性。