You need to enable JavaScript to run this app.
导航
通过 kubectl 创建 Nginx Ingress
最近更新时间:2024.06.05 20:37:49首次发布时间:2023.12.20 16:51:51

容器服务提供基于社区版的 Nginx Ingress Controller,它将 Ingress 规则转换成 Nginx 的配置,并基于 Nginx 来进行七层的流量转发。本文为您介绍如何通过 YAML 配置 Nginx Ingress。

前提条件

创建 Nginx Ingress

基于域名转发

Nginx Ingress 支持将不同的域名访问,转发到不同的后端。

  1. 创建 Ingress 的 YAML 文件,示例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 # 需要对接服务的端口号
  1. 执行以下命令,创建 Ingress。
kubectl apply -f nginx-ingress.yaml

基于路径转发

Nginx Ingress 支持将相同域名、不同路径的访问,转发到不同的后端。

  1. 创建 Ingress 的 YAML 文件,示例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 # 需要对接服务的端口号
  1. 执行以下命令,创建 Ingress。
kubectl apply -f nginx-ingress.yaml

使用自定义 Nginx Ingress Controller

容器服务支持在集群中同时部署多套独立的 Nginx Ingress Controller 服务,详情请参见 部署多套 Nginx Ingress Controller

您可以基于实际业务需求或场景,使用不同的 Nginx Ingress Controller 对外提供不同的服务访问。配置步骤如下:

  1. 创建 Ingress 的 YAML 文件,示例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 对接服务的端口号
  1. 执行以下命令,创建应用和服务。
kubectl apply -f nginx-ingress.yaml

结果验证

查看配置

  1. 执行以下命令,查看 ingress 配置。
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>