文档首页 > > 用户指南> 网络管理> 七层负载均衡(Ingress)

七层负载均衡(Ingress)

分享
更新时间: 2020/05/18 GMT+08:00

七层负载均衡是采用了增强型弹性负载均衡,在四层负载均衡访问方式的基础上支持了URI配置,通过对应的URI将访问流量分发到对应的服务。同时,服务根据不同URI实现不同的功能。

七层负载均衡访问方式由弹性负载均衡ELB服务地址、设置的访问端口、定义的URI组成,例如:10.117.117.117:80/helloworld。

通过配置公网类型和私网类型的负载均衡实例可以实现公网的七层路由转发和内网(同一VPC内)的七层路由转发。

准备工作

已在管理控制台中创建 “弹性负载均衡”实例。
  1. 登录管理控制台首页,在服务列表中选择网络 > 弹性负载均衡 ELB”
  2. 单击右上角的“购买增强型负载均衡”,详细操作步骤请参见创建增强型负载均衡器

CCE中的负载均衡 ( LoadBalancer )访问类型使用弹性负载均衡 ELB提供网络访问,存在如下产品约束:

  • 自动创建的ELB实例建议不要被其他资源使用,否则会在删除时被占用,导致资源残留。
  • 正在使用的ELB实例请不要修改监听器名称,否则可能导致无法正常访问。
  • 正在使用的ELB实例,其监听器请不要在ELB控制台中添加自定义转发规则,未通过CCE“网络管理”中的Ingress所管理的转发规则,将在更新ingress的时被清理掉。

通过控制台操作

您可以在创建工作负载时通过CCE控制台设置访问方式,本节以创建一个nginx工作负载并添加Ingress类型的Service为例进行说明。

  1. 创建工作负载,详细步骤请参见创建无状态负载(Deployment)创建有状态负载(StatefulSet)

    • 若创建工作负载时,配置了工作负载访问方式,且设置为“节点访问 ( NodePort )”,请直接执行3
    • 若创建工作负载未设置访问方式,请先执行2

  2. (可选)若创建工作负载时,未配置“节点访问 ( NodePort )”,请执行如下操作。

    1. 登录CCE控制台,在左侧导航栏中选择“资源管理 > 网络管理”。
    2. 在Service页签下,单击“添加Service”。选择类型为“节点访问 ( NodePort )”。
      • Service名称:自定义服务名称,可与工作负载名称保持一致。
      • 集群名称:选择需要添加Service的集群。
      • 命名空间:选择需要添加Service的命名空间。
      • 关联工作负载:单击“选择工作负载”,选择需要配置节点访问 ( NodePort )的工作负载名称,单击“确定”。
      • 服务亲和:
        • 集群级别:集群下所有节点的IP+访问端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。
        • 节点级别:只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。
      • 端口配置:
        • 协议:请根据业务的协议类型选择。
        • 容器端口:容器镜像中工作负载实际监听的端口,需用户确定。nginx程序实际监听的端口为80。
        • 访问端口:容器端口映射到节点私有IP上的端口,用私有IP访问工作负载时使用,端口范围为30000-32767,建议选择“自动生成”。
          • 自动生成:系统会自动分配端口号。
          • 指定端口:指定固定的节点端口,默认取值范围为30000-32767。若指定端口时,请确保同个集群内的端口唯一性。
    3. 单击“创建”,节点访问方式设置成功。

  3. 添加Ingress类型的Service。

    1. 单击CCE左侧导航栏的“资源管理 > 网络管理”。
    2. Ingress页签下,单击“添加Ingress”。
      图1 添加Ingress
      • Ingress名称:自定义Ingress名称,例如ingress-demo。
      • 集群名称:选择需要添加Ingress的集群。
      • 命名空间:选择需要添加Ingress的命名空间。
      • 对接Nginx:集群中已安装nginx-ingress模板后显示此选项,未安装nginx-ingress模板时本选项不显示。
        单击 开启后将对接nginx-ingress提供7层访问,可配置如下参数:
        表1 Nginx配置

        参数

        参数说明

        对外协议

        支持“HTTP”“HTTPS”两种协议。

        对外端口

        安装nginx-ingress插件时预留的监听端口,HTTP为80,HTTPS为443。

        超时时间

        描述客户端与代理服务器建立连接的超时时间。

        重定向地址

        将所有的内容重定向到指定地址,例如输入"https://www.huaweicloud.com/"。

        自定义配置

        Ingress通过Annotations设置来修改nginx.conf里面的配置,如需设置key: value,可通过Annotations查询。

      • 负载均衡配置:Ingress使用弹性负载均衡服务(ELB)的负载均衡器提供七层网络访问。

        开启“对接Nginx”后,将使用Nginx插件中配置的负载均衡设置,该配置区域将不显示。

        负载均衡:可以将互联网访问流量自动分发到工作负载所在的多个节点上。负载均衡实例需与当前集群处于相同VPC且为相同公私网类型。

        请根据业务需求选择“公网”“私网”,具体请参见公网和私网负载均衡器

        • 公网:支持自动创建和使用已有负载均衡实例两种方式。增强型负载均衡配额不足时,请通过新建增强型弹性负载均衡创建,完成后点击刷新按钮。
          • 更改配置:选择“公网 > 自动创建”时,单击规格配置下的“更改配置”,可修改待创建的负载均衡实例的名称、规格、计费模式和带宽。
          • 企业项目:对接ELB的企业项目,可以选择直接创建在具体的ELB企业项目下。
        • 私网:支持自动创建和使用已有负载均衡实例两种方式。
          • 企业项目:对接ELB的企业项目,可以选择直接创建在具体的ELB企业项目下。
      • 监听器配置:Ingress为负载均衡器配置监听器,监听器对负载均衡器上的请求进行监听,并分发流量。
        开启“对接Nginx”后将不显示该配置。
        • 对外协议:支持HTTP和HTTPS。若选择HTTPS,请选择密钥证书,格式说明请参见证书格式
          • 选择HTTPS协议时,才需要创建密钥证书ingress-test-secret.yaml。创建密钥的方法请参见创建密钥
          • 同一个ELB实例的同一个端口配置HTTPS时,一个监听器只支持配置一个密钥证书。若使用两个不同的密钥证书将两个Ingress添加到同一个ELB下的同一个监听器,ELB侧实际只生效最初的证书。
        • 对外端口:开放在负载均衡服务地址的端口,可任意指定。

          若选择启用“对接Nginx”后,将默认开启80和443端口,此处“对外端口”参数项将不显示。

      • 转发策略配置:请求的访问地址与转发规则匹配时(转发规则由域名、URL组成),此请求将被转发到对应的目标Service处理。
        • 域名:实际访问的域名地址。请确保所填写的域名已注册并备案,在Ingress创建完成后,将域名与自动创建的负载均衡实例的IP(即Ingress访问地址的IP部分)绑定。一旦配置了域名规则,则必须使用域名访问。
        • URL匹配规则:
          • 前缀匹配:例如映射URL为/healthz,只要符合此前缀的URL均可访问。例如/healthz/v1,/healthz/v2。
          • 精确匹配:表示精准匹配,只有完全匹配上才能生效。例如映射URL为/healthz,则必须为此URL才能访问。
          • 正则匹配:可设定映射URL规范,例如规范为/[A-Za-z0-9_.-]+/test。只要符合此规则的URL均可访问,例如/abcA9/test,/v1-Ab/test。正则匹配规则支持POSIX与Perl两种标准。
        • URL:需要注册的访问路径,例如:/healthz。
        • 目标Service:请选择已有Service或新建Service。页面列表中仅支持选择“节点访问 ( NodePort )” 类型的Service,该查询结果已自动过滤。若您开启了Nginx,可以通过页面右侧的“YAML创建”功能对接“集群内访问 ( ClusterIP )”类型的Service。
        • Service访问端口:可选择目标Service的访问端口。
        • 服务负载均衡配置:该配置是基于服务的配置,若有多条路由使用当前服务,这些路由将使用相同的服务负载均衡配置。详细配置请参见负载均衡配置
        • 操作:可单击“删除”按钮删除该配置。

        单击“添加转发策略”按钮可添加多条转发策略。

  4. 配置完成后,单击“创建”

    创建完成后,在Ingress列表可查看到已创建成功的Ingress。

  5. 访问工作负载(例如名称为defaultbackend)的“/healthz”接口。

    方式一:负载均衡IP访问(需负载均衡访问的服务不能配置域名)

    1. 获取defaultbackend“/healthz”接口的访问地址,访问地址有负载均衡实例、对外端口、映射URL组成,例如:10.154.73.151:80/healthz。
      图2 获取访问地址
    2. 在浏览器中输入“/healthz”接口的访问地址,如:http://10.154.73.151:80/healthz,即可成功访问工作负载,如图3
      图3 访问defaultbackend“/healthz”接口

    方式二:域名访问

    以ingress中已配置域名ingress.com为例。

    1. 获取ingress-demo“/james”接口的域名与访问地址的IP与端口。
      图4 获取域名与访问地址
    2. 在本地主机的 C:\Windows\System32\drivers\etc\hosts中配置访问地址的IP和域名。
    3. 在浏览器中输入http://域名:访问地址端口/映射url,如:http://ingress.com:81/james。

通过kubectl命令行创建

本节以nginx为例,说明kubectl命令实现ingress访问的方法。

前提条件

请参见通过kubectl或web-terminal插件连接CCE集群配置kubectl命令,使弹性云服务器连接集群。

操作步骤

  1. 登录已配置好kubectl命令的弹性云服务器。登录方法请参见登录Linux弹性云服务器
  2. 创建ingress-test-deployment.yaml、ingress-test-svc.yaml、ingress-test-ingress.yaml以及ingress-test-secret.yaml文件。

    ingress-test-deployment.yaml、ingress-test-svc.yaml、ingress-test-ingress.yaml、ingress-test-secret.yaml为自定义名称,您可以随意命名。

    • 选择HTTPS协议时,才需要创建密钥证书ingress-test-secret.yaml。创建密钥的方法请参见创建密钥
    • 同一个ELB实例的同一个端口配置HTTPS时,选择的证书需要是一样的。

    vi ingress-test-deployment.yaml

    • 1.15及以上集群版本中的apiVersion为: networking.k8s.io/v1beta1
    • 1.13及以下集群版本中的apiVersion为: extensions/v1beta1
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: ingress-test-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ingress-test-deployment
      strategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: ingress-test-deployment
        spec:
          containers:
            #第三方公开镜像,可以参见描述获取地址,也可以使用自己的镜像
          - image: ingress  
            imagePullPolicy: Always
            name: ingress
            imagePullSecrets:
            - name: default-secret

    vi ingress-test-svc.yaml

    apiVersion: v1 
    kind: Service 
    metadata: 
      labels: 
        app: ingress-test-svc
      name: ingress-test-svc
    spec: 
      ports: 
      - name: service0 
        port: 8888
        protocol: TCP 
        targetPort: 8888       #若需要设置多个端口,可依次填写,如下展示
      - name: service1 
        port: 8081 
        protocol: TCP 
        targetPort: 8081
      selector: 
        app: ingress-test-deployment
      type:  NodePort
    表2 关键参数说明

    参数

    参数类型

    描述

    port

    Integer

    集群虚拟IP的访问端口,取值范围为1 ~ 65535。

    protocol

    String

    该端口的IP协议,支持“TCP”和“UDP”。

    targetPort

    String

    对应界面上的容器端口,应用程序实际监听的端口,取值范围为1 ~ 65535。

    type

    String

    采用Nodeport的访问类型连接负载均衡,NodePort表示“节点私有IP”。

    vi ingress-test-ingress.yaml

    • 1.15及以上集群版本中的apiVersion为: networking.k8s.io/v1beta1
    • 1.13及以下集群版本中的apiVersion为: extensions/v1beta1
    自动创建ELB
    apiVersion: extensions/v1beta1 
    kind: Ingress 
    metadata: 
      annotations: 
        kubernetes.io/elb.subnet-id: 29a0567e-96f1-4227-91cc-64f54d0b064d
        kubernetes.io/elb.enterpriseID: f6b9fffc-a9b7-4a50-a25e-364f587abe44
        kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth-1551163379627","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}'
        kubernetes.io/elb.port: "80"
        kubernetes.io/ingress.class: cce
      name: ingress-test-ingress
    spec:
      tls:
      - secretName: ingress-test-secret
      rules: 
      - http: 
          paths: 
          - backend: 
              serviceName: ingress-test-svc
              servicePort: 8888
            property:
              ingress.beta.kubernetes.io/url-match-mode: EQUAL_TO
            path: "/healthz"
        host: ingress.com
    使用已有ELB
    apiVersion: extensions/v1beta1 
    kind: Ingress 
    metadata: 
      annotations: 
        kubernetes.io/elb.id: f7891f9a-49f2-4ee2-b1ae-f019cd84eb4f
        kubernetes.io/elb.ip: 192.168.0.39
        kubernetes.io/elb.subnet-id: 29a0567e-96f1-4227-91cc-64f54d0b064d
        kubernetes.io/elb.port: "80"
        kubernetes.io/ingress.class: cce
      name: ingress-test-ingress
    spec:
      tls:
      - secretName: ingress-test-secret
      rules: 
      - http: 
          paths: 
          - backend: 
              serviceName: ingress-test-svc
              servicePort: 8888
            property:
              ingress.beta.kubernetes.io/url-match-mode: EQUAL_TO
            path: "/healthz"
        host: ingress.com
    表3 关键参数说明

    参数

    参数类型

    描述

    kubernetes.io/elb.id

    String

    可选,但使用已有ELB时必填。

    为增强型负载均衡实例的ID。

    kubernetes.io/elb.ip

    String

    可选,但当elb自动创建时不填。

    为负载均衡增强型实例的服务地址,公网ELB配置为公网IP,私网ELB配置为私网IP。

    kubernetes.io/elb.subnet-id

    String

    可选,但自动创建时必填,Kubernetes v1.11.7-r0以上版本的集群可不填。

    kubernetes.io/elb.enterpriseID

    String

    可选,但公网或私网自动创建时必填。

    为ELB企业项目名称,选择后可以直接创建在具体的ELB企业项目下。

    kubernetes.io/elb.autocreate

    elb.autocreate object

    可选,但公网自动创建时必填,将自动创建ELB所绑定的EIP。私网自动创建时必填,将自动创建ELB。

    示例:

    • 公网自动创建:

      值为 '{"type":"public","bandwidth_name":"cce-bandwidth-1551163379627","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}'

    • 私网自动创建:

      值为 '{"type":"inner", "name": "A-location-d-test"}'

    kubernetes.io/elb.port

    Integer

    必填,界面上的对外端口,为注册到负载均衡服务地址上的端口。

    kubernetes.io/ingress.class

    String

    默认,cce时表示使用增强型负载均衡实例,nginx时表示启用nginx-ingress插件。但通过API接口创建Ingress时必须增加该参数。

    tls

    Array of strings

    可选,HTTPS协议时,需添加此参数。

    secretName

    String

    可选,HTTPS协议时添加,配置为创建的密钥证书名称。

    serviceName

    String

    为ingress-test-svc.yaml的服务名称。

    servicePort

    Integer

    为ingress-test-svc.yaml的Port。

    ingress.beta.kubernetes.io/url-match-mode

    String

    路由匹配策略,可选值为EQUAL_TO(精确匹配)、STARTS_WITH(前缀匹配)、REGEX(正则匹配)。

    path

    String

    为路由,用户自定义设置。

    host

    String

    可选,域名配置。

    表4 elb.autocreate字段数据结构说明

    参数

    参数类型

    描述

    name

    String

    自动创建的负载均衡的名称。

    取值范围:1-64个字符,中英文,数字,下划线,中划线。

    type

    String

    负载均衡实例网络类型,公网或者私网。

    • public:公网型负载均衡
    • inner:私网型负载均衡

    bandwidth_name

    String

    带宽的名称,默认值为:cce-bandwidth-******。

    1-64 字符,中文、英文字符、数字、下划线、中划线或点组成。

    bandwidth_chargemode

    String

    带宽付费模式。

    • bandwidth:按带宽计费
    • traffic:按流量计费

    bandwidth_size

    Integer

    带宽大小,请根据Region带宽支持范围设置,具体请参见申请弹性公网IP表4 bandwidth字段说明中size字段

    bandwidth_sharetype

    String

    功能说明:带宽类型,标识是否是共享带宽。

    取值范围:

    • WHOLE:共享带宽
    • PER:享带宽

    eip_type

    String

    弹性公网IP类型,请参考ELB支持的弹性公网IP类型,具体请参见申请弹性公网IP表3 publicip字段说明type字段

    vi ingress-test-secret.yaml
    apiVersion: v1
    data:
      tls.crt: LS0******tLS0tCg==
      tls.key: LS0tL******0tLS0K
    kind: Secret
    metadata:
      annotations:
        description: test for ingressTLS secrets
      name: ingress-test-secret
      namespace: default
    type: IngressTLS

    此处tls.crt和tls.key为示例,请获取真实密钥进行替换。

  3. 创建工作负载。

    kubectl create -f ingress-test-deployment.yaml

    回显如下,表明工作负载已创建。

    deployment "ingress-test-deployment" created

    kubectl get po

    回显如下,表明工作负载创建成功。

    NAME                            READY     STATUS             RESTARTS   AGE
    ingress-test-1627801589-r64pk   1/1       Running            0          6s

  4. 创建密钥。

    kubectl create -f ingress-test-secret.yaml

    回显如下,表明密钥已创建。

    secret "ingress-test-secret" created

    kubectl get secrets

    回显如下,表明密钥创建成功。

    NAME                         TYPE                                  DATA      AGE
    dash-dashboard               Opaque                                0         7d
    dash-dashboard-token-f2nbk   kubernetes.io/service-account-token   3         7d
    default-secret               kubernetes.io/dockerconfigjson        1         8d
    default-token-wfn4l          kubernetes.io/service-account-token   3         8d
    paas.elb                     cfe/secure-opaque                     2         8d
    ingress-test-secret          IngressTLS                            2         13s

  5. 创建服务。

    kubectl create -f ingress-test-svc.yaml

    回显如下,表示服务已创建。

    service "ingress-test-svc" created

    kubectl get svc

    回显如下,表示服务创建成功。

    NAME            TYPE          CLUSTER-IP        EXTERNAL-IP   PORT(S)          AGE
    ingress-test    NodePort      10.247.189.207    <none>       8080:30532/TCP   5s
    kubernetes      ClusterIP     10.247.0.1        <none>        443/TCP          3d

    kubectl create -f ingress-test-ingress.yaml

    回显如下,表示ingress服务已创建。

    ingress "ingress-test-ingress" created

    kubectl get ingress

    回显如下,表示ingress服务创建成功,工作负载可访问。

    NAME             HOSTS     ADDRESS          PORTS   AGE
    ingress-test     *         10.154.76.63     80      10s

  6. 在浏览器中输入访问地址http://10.154.76.63/healthz。

    其中,10.154.76.63为统一负载均衡实例的IP地址。

    图5 访问healthz

更新Ingress

您可以在添加完Ingress后,更新此Ingress的端口、域名和路由配置。操作如下:

  1. 登录CCE控制台,在左侧导航栏中选择“资源管理 > 网络管理”。在Ingress页签下,选择对应的集群和命名空间,单击待更新Ingress后方的“更新”。
  2. “更新Ingress”页面,更新如下参数:

    • 对外端口:开放在负载均衡服务地址的端口,可任意指定。
    • 域名:可选填。实际访问的域名地址,该域名需用户购买并备案,并确保所填域名能解析到所选负载均衡实例的服务地址。一旦配置了域名规则,则必须使用域名访问。
    • 路由配置:可单击“添加映射”增加新的路由配置。
      • 路由匹配规则:前缀匹配、精确匹配、正则匹配。
        • 前缀匹配:例如映射URL为/healthz,只要符合此前缀的URL均可访问。例如/healthz/v1,/healthz/v2。
        • 精确匹配:表示精准匹配,只有完全匹配上才能生效。例如映射URL为/healthz,则必须为此URL才能访问。
        • 正则匹配:可设定映射URL规范,例如规范为/[A-Za-z0-9_.-]+/test。只要符合此规则的URL均可访问,例如/abcA9/test,/v1-Ab/test。正则匹配规则支持POSIX与Perl两种标准。
      • 映射URL:需要注册的访问路径,例如:/healthz。
      • 服务名称:选择需要添加Ingress的服务,该服务访问类型为VPC内网服务。
      • 容器端口:容器镜像中容器实际监听端口,需用户确定。例如:defaultbackend程序实际监听的端口为8080。

  3. 单击“提交”。工作负载已更新Ingress。

相关操作

由于社区Ingress结构体中没有property属性,用户使用client-go调用创建ingress的api接口时,创建的Ingress中没有property属性。为了与社区的client-go兼容,CCE提供了相关解决方案,具体请参见Ingress中的property字段如何实现与社区client-go兼容?

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问