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

前提条件

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

注意事项

在您使用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上。详情请参见 部署高可靠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 对话框,自定义保密字典的 名称 Cert Key ,然后单击 确定

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

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

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

    开启TLS配置。

    • 域名 :test.example.com

    • 保密字典 :cert

    更多配置

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

      说明

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

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

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

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

    • 协议 :指定后端服务的协议,设置后会添加注解 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 之前,所有的入站请求都要先匹配 host path

      • 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名称>