容器服务提供基于社区版的 Nginx Ingress Controller,它将 Ingress 规则转换成 Nginx 的配置,并基于 Nginx 来进行七层的流量转发。本文为您介绍如何通过 YAML 配置 Nginx Ingress。
Nginx Ingress 支持将不同的域名访问,转发到不同的后端。
nginx-ingress.yaml
代码如下:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress # 路由规则的名称 namespace: default # 路由规则所属的命名空间 spec: ingressClassName: nginx # 指定 Ingress Controller rules: - host: first.example.com # 需要对外提供访问的域名 http: paths: - pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配) path: / # 请求匹配的路径 backend: service: name: service-demo-a # 需要对接的服务名称 port: number: 80 # 需要对接服务的端口号 - host: second.example.com # 需要对外提供访问的域名 http: paths: - pathType: Prefix # 路径匹配规则。取值:Exact(精确匹配)、Prefix(前缀匹配) path: / # 请求匹配的路径 backend: service: name: service-demo-b # 需要对接的服务名称 port: number: 80 # 需要对接服务的端口号
kubectl apply -f nginx-ingress.yaml
Nginx Ingress 支持将相同域名、不同路径的访问,转发到不同的后端。
nginx-ingress.yaml
代码如下:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress # 路由规则的名称 namespace: default # 路由规则所属的命名空间 spec: ingressClassName: nginx # 指定 Ingress Controller rules: - host: example.com # 需要对外提供访问的域名 http: paths: - path: /foo # 请求匹配的路径 pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配) backend: service: name: service-demo-a # 需要对接的服务名称 port: number: 80 # 需要对接服务的端口号 - path: /bar # 请求匹配的路径 pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配) backend: service: name: service-demo-b # 需要对接的服务名称 port: number: 80 # 需要对接服务的端口号
kubectl apply -f nginx-ingress.yaml
容器服务支持在集群中同时部署多套独立的 Nginx Ingress Controller 服务,详情请参见 部署多套 Nginx Ingress Controller。
您可以基于实际业务需求或场景,使用不同的 Nginx Ingress Controller 对外提供不同的服务访问。配置步骤如下:
nginx-ingress.yaml
代码如下。其中,在spec.ingressClassName
字段中使用名称指定 Nginx Ingress Controller 服务。本例中以user-ingress-nginx
为例。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-demo # ingress 的名称 namespace: default # ingress 所在的命名空间 spec: ingressClassName: user-ingress-nginx # 自定义的 Nginx Ingress Controller 名称 rules: - host: example.com # 外部访问的域名 http: paths: - pathType: Prefix path: / backend: service: name: service-demo # ingress 后端对接的服务名称 port: number: 80 # ingress 对接服务的端口号
kubectl apply -f nginx-ingress.yaml
kubectl get ingress
预期返回结果如下,表示 Ingress 创建成功。其中180.xxx.xxx.xxx
为 Nginx Ingress 对应 CLB 的公网或私网 IP 地址。
NAME CLASS HOSTS ADDRESS PORTS AGE nginx-ingress nginx example.com 180.xxx.xxx.xxx 80 74s
使用以下命令,通过域名访问服务。
curl -H "Host: example.com" http://180.xxx.xxx.xxx
预期输出如下,表示可以通过域名访问到后端服务。
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>