创建Nginx Ingress

Ingress是Kubernetes中的一个资源对象,用来管理集群外部访问集群内部服务的方式。您可以通过Ingress资源来配置不同的转发规则,从而根据转发规则访问集群内Pod。本文介绍如何通过控制台和kubectl方式创建、查看、更新和删除Nginx Ingress。

前提条件

已创建Kubernetes集群。具体操作,请参见创建ACK托管集群

注意事项

在您使用Nginx Ingress Controller时,请遵循以下注意事项。

  • 使用组件时,请通过组件管理的方式或者OpenAPI的方式配置组件的自定义参数。通过其他渠道修改组件配置可能会导致组件功能异常,且会影响组件后续的升级过程。

  • 请勿删除Nginx Ingress Controller默认使用的Service(kube-system/nginx-ingress-lb)。将其删除将会导致组件运行不稳定,严重时出现崩溃。

  • 请优先考虑使用相关注解或者设置项来实现所需功能,不建议您使用Snippet或Lua代码等方式对组件进行额外配置。对于您使用Snippet等方式配置所出现的与预期功能不符等问题,将无法给予有效的支持。

  • 受上游社区版组件影响,Nginx Ingress Controller可能存在Bug或漏洞,请注意及时升级组件,以避免开源组件Bug或漏洞导致您的业务受损。

  • 在高负载情景下,推荐您使用独立部署的方式将Nginx Ingress Controller部署在单独的Node上。详情请参见部署高可靠的Nginx Ingress Controller

  • 关于更多使用Nginx Ingress Controller的建议,请参见Nginx

操作步骤

方式一:控制台操作步骤

创建Nginx Ingress

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择网络 > 路由

  3. 路由页面,单击创建 Ingress,在创建 Ingress对话框配置路由。

    配置项

    说明

    示例值

    网关类型

    可按需选择ALB应用型负载均衡MSE云原生网关Nginx三种网关类型。

    关于三种网关的差异,请参见Nginx Ingress、ALB Ingress和MSE Ingress对比

    Nginx

    名称

    自定义路由名称。

    nginx-ingress

    Ingress Class

    自定义Ingress的类。

    nginx

    规则

    单击+ 添加规则可新增多个路由规则。

    • 域名:自定义域名。

    • 路径映射:配置如下配置项。

      • 路径:指定服务访问的URL路径。本例中不做配置,保留根路径/

      • 匹配规则:支持前缀匹配(Prefix)完整匹配(Exact)默认(ImplementationSpecific)

      • 服务名称:选择目标服务,即K8s内的Service。

      • 端口:选择服务需要暴露的端口。

    • Ingress支持同一个域名下配置多条路径。单击+ 添加路径新增路径。

    • 域名:test.example.com

    • 路径映射

      • 路径:/

      • 匹配规则:默认(ImplementationSpecific)

      • 服务名称:nginx-ingress-lb

      • 端口:80

    TLS配置

    开启TLS配置开关,配置安全的路由服务。

    • 域名:自定义域名。

    • 保密字典:根据需要选择对应的保密字典。

      如果您需要创建Secret,请执行如下操作。

      1. 保密字典右侧,单击创建

      2. 创建 Secret对话框,自定义保密字典的名称CertKey,然后单击确定

      3. 保密字典的下拉框,选择已创建的Secret。

    单击+ 新增TLS配置,可配置多条TLS。

    Ingress的更多用法,请参见Ingress支持

    开启TLS配置。

    • 域名:test.example.com

    • 保密字典:cert

    更多配置

    • 灰度发布:开启灰度发布开关。灰度规则可按照请求头、Cookie 、权重三个维度进行设置。

      说明

      请求头、Cookie 、权重可以只设置一种,若同时设置生效规则按请求头、Cookie、权重顺序匹配。

      • 按请求头:基于Request Header的流量切分,设置后会添加注解nginx.ingress.kubernetes.io/canary-by-headernginx.ingress.kubernetes.io/canary-by-header-valuenginx.ingress.kubernetes.io/canary-by-header-pattern

      • 按Cookie:基于Cookie的流量切分,设置后会添加注解nginx.ingress.kubernetes.io/canary-by-cookie

      • 按权重:设置请求到指定服务的百分比(值为0~100的整数),设置后会添加注解nginx.ingress.kubernetes.io/canary-weight

    • 协议:指定后端服务的协议,设置后会添加注解nginx.ingress.kubernetes.io/backend-protocol

      支持HTTP、HTTPS、gRPC、gRPCS四种服务协议。

    • 重写路径:将客户端请求中的路径重写后发送到后端服务,设置后会添加注解 nginx.ingress.kubernetes.io/rewrite-target

    开启灰度发布。

    • 生效规则选择按请求头

      • 请求头名称:foo

      • 匹配规则按值匹配

      • 匹配值:bar

    • 协议:GRPC

    • 重写路径:设置为空

    注解

    您可自定义注解名称和值,也可根据名称选择或搜索要配置的注解。Ingress的注解请参见Annotations

    单击+添加注解,可对Ingress无上限地添加注解。

    • 名称:nginx.ingress.kubernetes.io/proxy-body-size

    • :10m

    标签

    标签的作用是为Ingress添加对应的标签,标示该Ingress的特点。

    单击+添加标签,可对Ingress无上限地添加标签。

    • 名称:foo

    • :bar

  4. 配置成功后,单击确定

    路由页面,可以查看路由已成功创建。

相关操作

您可以在路由页面,单击目标路由操作列的更新YAML编辑监控,以及更多中的删除,完成删、改、查相关操作。

方式二:kubectl操作步骤

创建Nginx Ingress

  1. 创建Deployment和Service。

    在创建Ingress资源之前,必须创建外部访问Kubernetes集群中的服务。

    1. 使用以下内容,创建test-deployment-service.yaml

      以下YAML文件中包含了一个名为test-web1的Deployment和一个名为web1-service的Service。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: test-web1
        labels:
          app: test-web1
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: test-web1
        template:
          metadata:
            labels:
              app: test-web1
          spec:
            containers:
            - name: test-web1
              imagePullPolicy: IfNotPresent
              image: registry.cn-hangzhou.aliyuncs.com/yilong/ingress-test:web1
              ports:
              - containerPort: 8080
      --- 
      apiVersion: v1
      kind: Service
      metadata:
        name: web1-service
      spec:
        type: ClusterIP
        selector:
          app: test-web1
        ports:
          - port: 8080
            targetPort: 8080
    2. 执行以下命令,创建Deployment和Service。

      kubectl apply -f test-deployment-service.yaml
  2. 创建Ingress。

    1. 使用以下内容,创建test-ingress.yaml

      1.19版本之前集群

      apiVersion: networking.k8s.io/v1beta1
      kind: Ingress
      metadata:
        name: test-ingress
        namespace: default
      spec:
        rules:
        - host: test-ingress.com
          http:
            paths:
            - path: /foo
              backend:
                serviceName: web1-service
                servicePort: 8080
            - path: /bar
              backend:
                serviceName: web1-service
                servicePort: 8080

      1.19及之后版本集群

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: test-ingress
        namespace: default
      spec:
        rules:
        - host: test-ingress.com
          http:
            paths:
            - path: /foo
              backend:
                service: 
                  name: web1-service
                  port:
                    number: 8080
              pathType: ImplementationSpecific
            - path: /bar
              backend:
                service: 
                  name: web1-service
                  port:
                    number: 8080
              pathType: ImplementationSpecific
      • name:Ingress的名称,本例为test-ingress。

      • host:指定服务访问域名。

      • path:指定访问的URL路径。SLB将流量转发到backend之前,所有的入站请求都要先匹配hostpath

      • backend:由服务名称和服务端口组成。

        • 服务名称:Ingress转发的backend服务名称。

        • 服务端口:服务暴露的端口。

    2. 执行以下命令,创建Ingress。

      kubectl apply -f test-ingress.yaml

查看Nginx Ingress

执行以下命令,查看Ingress。

kubectl get ingress

更新Nginx Ingress

执行以下命令,更新Ingress。

kubectl edit ingress <ingress名称>

删除Nginx Ingress

执行以下命令,删除Ingress。

kubectl delete ingress <ingress名称>