通过使用已有负载均衡的服务暴露应用

通过阿里云负载均衡暴露的服务(Service),在集群外可通过负载均衡域名或<IP:服务端口>的方式访问服务,在集群内可通过<服务名:服务端口>的方式访问服务。本文以Nginx应用为例,介绍如何通过使用已有负载均衡的服务来公开应用。

前提条件

使用说明

对于指定已有负载均衡,ACK集群的cloud-controller-manager组件版本不同,对应的监听策略也有所不同:

  • cloud-controller-manager组件为v1.9.3.59-ge3bc999-aliyun及以上版本:在指定已有负载均衡时,cloud-controller-manager默认不再为该实例处理监听。您可以通过添加Annotation(注解)service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"来启用监听配置,或者手动配置该负载均衡的监听规则。

  • cloud-controller-manager组件为v1.9.3.59-ge3bc999-aliyun以下版本:在指定已有负载均衡实例时,cloud-controller-manager会自动生成并管理该实例的后端服务器组,并确保监听器指向这些由K8s管理的后端资源,即使这些监听器可能之前是由您手动配置的。

展开查看cloud-controller-manager版本的方法:

使用控制台

在集群的组件管理页面查看cloud-controller-manager组件版本。

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

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面的核心组件页签下,查看Cloud Controller Manager组件的版本信息。

使用kubectl命令行(仅适用于ACK专有版集群

kubectl get pod -n kube-system -o yaml|grep image:|grep cloud-con|uniq

注意事项

在使用已有负载均衡公开应用之前,建议您先了解相关注意事项。详细信息,请参见:

步骤一:部署示例应用

本文以Nginx无状态应用为例,指导您如何在ACK中通过负载均衡类型的Service暴露应用。

控制台操作指导

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

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 无状态页面,单击使用镜像创建,配置应用的基本信息、容器配置、高级配置等。

    1. 应用基本信息页签中,配置应用名称,本示例为my-nginx,其他参数保持默认值,然后单击下一步

    2. 容器配置页签中,设置容器镜像名称、端口,其他参数保持默认值,然后单击下一步

      配置项

      取值

      镜像名称

      单击选择镜像,在选择镜像及版本对话框单击制品中心页签,然后搜索nginx,选择名称为openanolis/nginx的镜像仓库,单击选择镜像版本,设置镜像的版本,完成后单击确定

      端口

      • 名称:nginx。

      • 容器端口:80。

    3. 高级配置页签中,保持默认,单击创建,完成Nginx应用的创建。

kubectl操作指导

  1. 使用以下示例应用的YAML内容,创建名为my-nginx.yaml文件。

    apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
    kind: Deployment
    metadata:
      name: my-nginx    # 示例应用的名称。
      labels:
        app: nginx
    spec:
      replicas: 2       # 设置副本数量。
      selector:
        matchLabels:
          app: nginx     # 对应服务中Selector的值需要与其一致,才可以通过服务公开此应用。
      template:
        metadata:
          labels:
            app: nginx
        spec:
        #  nodeSelector:
        #    env: test-team
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80                                # 需要在服务中暴露该端口。
  2. 执行以下命令,部署示例应用my-nginx。

    kubectl apply -f my-nginx.yaml
  3. 执行以下命令,确认示例应用状态正常。

    kubectl get deployment my-nginx

    预期输出:

    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    my-nginx   2/2     2            2           50s

步骤二:通过使用已有负载均衡的服务公开应用

您可以通过控制台kubectl两种方式来创建LoadBalancer类型的服务,并通过其公开应用。

控制台操作指导

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

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

  3. 服务页面,单击创建,在创建服务对话框中设置服务相关的参数。

    配置项

    描述

    示例

    服务名称

    输入Service(服务)的名称。

    my-nginx-svc

    服务类型

    选择Service类型,Service网络支持以下模式,分别对接不同来源和类型的客户端的访问,包括:

    虚拟集群IP(ClusterIP)

    虚拟集群IP(ClusterIP)主要服务于集群内部通信,仅当服务类型设置为虚拟的ClusterIP时,才支持服务实例之间的发现。通过使用无头服务Headless Service,您可以与其他服务发现机制互动,而不必依赖Kubernetes默认提供的基于ClusterIP的服务发现和负载均衡。

    负载均衡(LoadBalancer)

    说明

    创建服务新版控制台,目前处于灰度发布中。如需使用,请提交工单申请。

    负载均衡提供了一种方法,通过集成阿里云负载均衡器CLB(Classic Load Balancer)及网络型负载均衡NLB(Network Load Balancer),可以将集群内部应用对外暴露。相比于NodePort方式,能够显著提升应用的可用性和性能。支持配置如下类型:

    节点端口(NodePort)

    节点端口(NodePort)提供了一种便捷的方式,使得外部用户可以通过节点的IP地址和指定的端口来访问集群中的服务。通过访问 <NodeIP>:<NodePort>,用户能够连接到NodePort服务,但是实现负载均衡的配置则需要您自己手动完成。

    1. 选择负载均衡的服务类型。

    2. 单击使用已有CLB,然后在下拉列表选择已创建的CLB实例。

      本示例中的CLB实例为新创建,需要为其创建监听,因此选中强制覆盖已有监听

    外部流量策略

    您的服务类型为节点端口负载均衡时,才能设置外部流量策略。关于外部流量策略的详细介绍,请参见Service快速入门

    • Local:流量只发给本节点的Pod。

    • Cluster:流量可以转发到集群中其他节点上的Pod。

    Local

    服务关联

    选择服务要绑定的后端应用。若不进行关联部署,则不会创建相关的Endpoints对象。关于服务关联的详细介绍,请参见services-without-selectors

    名称:app

    值:my-nginx

    端口映射

    添加服务端口(对应Service YAML文件中的port)和容器端口(对应Service YAML文件中的targetPort),容器端口需要与后端的Pod中暴露的容器端口一致。

    80

    注解

    为该服务添加一个注解(Annotation),配置负载均衡的参数。更多参数,请参见通过Annotation配置传统型负载均衡CLB通过Annotation配置网络型负载均衡NLB

    重要

    请勿复用集群的API Server的负载均衡实例,否则将导致集群访问异常

    本示例中,将该服务的收费方式设置为按带宽收费,带宽峰值设置为2 Mbit/s,从而控制服务的流量。如下所示:

    • service.beta.kubernetes.io/alibaba-cloud-loadbalancer-charge-type:paybybandwidth

    • service.beta.kubernetes.io/alibaba-cloud-loadbalancer-bandwidth:2

    标签

    为该服务添加一个标签,标识该服务。

    服务删除保护

    为关键业务和敏感数据的Service开启删除保护,以避免误删带来的维护成本。启用后,仅在手动关闭删除保护后,资源才能被删除。

    说明

    该功能需先安装容器安全策略的policy-template-controllergatekeeper组件,您可以单击立即安装完成组件的部署。

    关闭

    单击确定

  4. 服务页面,单击目标服务名称,进入服务详情页面,在基本信息区域,单击该服务的外部端点,例如39.106.XX.XX:80,访问示例应用。

Kubectl操作指导

  1. 创建Service。

    使用以下示例服务的YAML内容,创建名为my-nginx-svc.yaml的文件。

    • 修改service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id,请将${YOUR_LB_ID}替换为您通过负载均衡管理控制台创建的负载均衡实例ID。

    • 在使用已有的负载均衡实例时,默认情况下不会为该负载均衡创建监听或覆盖已有监听。如有需要覆盖监听,可以设置service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners"true"。本示例中,负载均衡实例为新创建,需要为其创建监听,因此设为true。更多注解请参见通过Annotation配置传统型负载均衡CLB通过Annotation配置网络型负载均衡NLB

    • selector修改为my-nginx.yaml示例应用文件中matchLabels的值(即:app: nginx),从而将该服务关联至后端应用。

    apiVersion: v1
    kind: Service # 定义资源对象为Service。
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${YOUR_LB_ID}
        service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: 'true'
      labels:
        app: nginx
      name: my-nginx-svc
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer

    字段

    说明

    kind

    定义资源对象为Service。

    metadata

    定义Service的名称、Label和命名空间等基本信息。

    metadata.annotations

    支持丰富的负载均衡相关的注解(Annotations)。例如,在上面的YAML示例中,service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type指定Service的访问方式为intranet(私网访问)。更多注解,请参见通过Annotation配置传统型负载均衡CLB

    spec.selector

    定义Service的选择器。Service会根据Selector和Pod Label的匹配关系,确定Service所要关联暴露的后端Pod。

    spec.ports.port

    定义Service暴露给ClusterIP的端口,集群内部客户端访问Service的入口,即clusterIP:port

    spec.ports.targetPort

    定义后端Pod的端口。从port进来的流量,经由kube-proxy流入到后端Pod的targetPort上,最后进入容器。

    spec.type

    定义Service的被访问方式。

    • LoadBalancer:使用阿里云负载均衡公开服务。当Service没有指定已有负载均衡时,默认创建的负载均衡实例类型为公网。您可以通过设置注解intranet,来创建私网访问的Service以及相应的私网负载均衡。更多信息,请参见通过Annotation配置传统型负载均衡CLB通过Annotation配置网络型负载均衡NLB

    • ClusterIP:在集群内部公开服务,可用于集群内部访问。

    • NodePort:使用节点的端口映射到后端Service,集群外可以通过节点IP:NodePort访问。

    • ExternalName:将服务映射到DNS。

  2. 执行以下命令,创建名为my-nginx-svc的服务,并通过其公开应用。

    kubectl apply -f my-nginx-svc.yaml
  3. 执行以下命令,确认LoadBalancer类型的服务已成功创建。

    kubectl get svc my-nginx-svc

    预期输出:

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
    my-nginx-svc   LoadBalancer   172.21.5.82   39.106.XX.XX     80:30471/TCP   5m
  4. 执行以下命令,访问示例应用。

    curl <YOUR-External-IP> # 请将<YOUR-External-IP>替换为上面获取到的EXTERNAL-IP地址。

    预期输出:

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        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>

传统型负载均衡CLB

新建CLB资源

新建CLB(Classic Load Balancer)时,您可以根据新建CLB资源描述进行创建。更多信息,请参见创建和管理CLB实例

名称

描述

名称

自定义CLB的名称。

访问方式

根据需要可选择公网访问私网访问

计费方式

根据需要可选按规格计费(PayBySoec)按量计费(PayByCLCU)更多信息,请参见CLB计费概述

IP版本

根据需要可选择IPv4IPv6

调度算法

支持轮询(RR)或加权轮询(WRR)两种策略。RR(默认取值):按照访问顺序依次将外部请求依序分发到后端服务器;WRR:权重值越高的后端服务器,被轮询到的次数(概率)也越高。

访问控制

提供监听级别的访问控制。详细信息,请参见访问控制

健康检查

支持TCP和HTTP协议。开启健康检查后,您可以通过健康检查来判断后端服务器的业务可用性。健康检查原理,请参见CLB健康检查工作原理

其他

您还可以通过Annotation配置传统型负载均衡。详细信息,请参见通过Annotation配置传统型负载均衡CLB

使用已有资源

您可以从下拉菜单中选择已有的CLB(Classic Load Balancer)实例进行复用。可以选择是否勾选强制覆盖已有监听,更多信息请参见,使用已有的负载均衡,并强制覆盖已有监听

重要

复用CLB实例存在一些限制,以及相关的注意事项,详细信息请参见哪些负载均衡可以被复用?

配置相关资源

名称

描述

调度算法

支持轮询(RR)或加权轮询(WRR)两种策略。RR(默认取值):按照访问顺序依次将外部请求依序分发到后端服务器;WRR:权重值越高的后端服务器,被轮询到的次数(概率)也越高。

访问控制

提供监听级别的访问控制。详细信息,请参见访问控制

健康检查

支持TCP和HTTP协议。开启健康检查后,您可以通过健康检查来判断后端服务器的业务可用性。健康检查原理,请参见负载均衡健康检查工作原理

其他

您还可以通过Annotation配置传统型负载均衡。详细信息,请参见通过Annotation配置传统型负载均衡CLB

网络型负载均衡NLB

新建NLB资源

新建网络型负载均衡NLB(Network Load Balancer ),您可以根据新建NLB资源描述进行创建。更多信息,请参见创建和管理NLB实例

名称

描述

名称

自定义NLB的名称。仅新建NLB需要配置。

访问方式

根据需要可选择公网访问私网访问

计费方式

按量计费。更多信息,请参见NLB产品计费

IP版本

根据需要可选择IPv4双栈

调度算法

选择一种调度算法。

  • 轮询:按照访问顺序依次将外部请求分发到后端服务器。

  • 加权轮询(默认):权重值越高的后端服务器,被轮询到的次数(概率)也越高。

  • 源IP哈希:基于源IP的一致性哈希,相同的源地址会调度到相同的后端服务器。

  • 四元组哈希:基于四元组(源IP、目的IP、源端口和目的端口)的一致性哈希,相同的流会调度到相同的后端服务器。

  • QUIC ID哈希:基于QUIC ID的一致性哈希,支持将同一个QUIC ID的请求哈希到同一台后端服务器上。

  • 加权最小连接数:除了根据每台后端服务器设定的权重值来进行轮询,同时还考虑后端服务器的实际负载(即连接数)。当权重值相同时,当前连接数越小的后端服务器被轮询到的次数(概率)也越高。

健康检查

开启或关闭健康检查。

  • TCP(默认):通过发送SYN握手报文来检测服务器端口是否存活。

    • 健康响应超时时间:输入接收来自运行状况检查的响应需要等待的时间。如果后端服务器在指定的时间内没有正确响应,则判定为健康检查失败。

    • 健康间隔时间:输入用于健康检查的时间间隔。

    • 健康阈值:健康检查连续成功多少次后,将后端服务器的健康检查状态由失败判定为成功的次数。

    • 不健康阈值:健康检查连续失败多少次后,将后端服务器的健康检查状态由成功判定为失败的次数。

  • HTTP:通过发送HEAD或GET请求模拟浏览器的访问行为来检查服务器应用是否健康。

    • 域名:输入健康检查的域名。

      • 使用后端服务器内网IP(默认):使用后端服务器的内网IP地址作为健康检查的域名。

      • 指定特定域名:输入一个域名。

    • 路径:输入健康检查页面的URL。

    • 健康状态返回码:可以选择http_2xx(默认)、http_3xxhttp_4xxhttp_5xx

其他

您还可以通过Annotation配置网络型负载均衡。详细信息请参见通过Annotation配置网络型负载均衡NLB

专有网络

集群默认专有网络地域和VPC ID。

虚拟交换机

您可以选择集群默认专有网络下,已支持的可用区对应的虚拟交换机,还可以单击创建虚拟交换机选择新建。

使用已有资源

您可以从下拉菜单中选择已有的NLB(Network Load Balancer)实例进行复用。还可以根据需要是否勾选强制覆盖已有监听,详细信息请参见使用已有的负载均衡

重要

复用NLB实例存在一些限制,以及相关的注意事项,详细信息请参见哪些负载均衡可以被复用?

配置相关资源

名称

描述

调度算法

选择一种调度算法。

  • 轮询:按照访问顺序依次将外部请求分发到后端服务器。

  • 加权轮询(默认):权重值越高的后端服务器,被轮询到的次数(概率)也越高。

  • 源IP哈希:基于源IP的一致性哈希,相同的源地址会调度到相同的后端服务器。

  • 四元组哈希:基于四元组(源IP、目的IP、源端口和目的端口)的一致性哈希,相同的流会调度到相同的后端服务器。

  • QUIC ID哈希:基于QUIC ID的一致性哈希,支持将同一个QUIC ID的请求哈希到同一台后端服务器上。

  • 加权最小连接数:除了根据每台后端服务器设定的权重值来进行轮询,同时还考虑后端服务器的实际负载(即连接数)。当权重值相同时,当前连接数越小的后端服务器被轮询到的次数(概率)也越高。

健康检查

开启或关闭健康检查。

  • TCP(默认):通过发送SYN握手报文来检测服务器端口是否存活。

    • 健康响应超时时间:输入接收来自运行状况检查的响应需要等待的时间。如果后端服务器在指定的时间内没有正确响应,则判定为健康检查失败。

    • 健康间隔时间:输入用于健康检查的时间间隔。

    • 健康阈值:健康检查连续成功多少次后,将后端服务器的健康检查状态由失败判定为成功的次数。

    • 不健康阈值:健康检查连续失败多少次后,将后端服务器的健康检查状态由成功判定为失败的次数。

  • HTTP:通过发送HEAD或GET请求模拟浏览器的访问行为来检查服务器应用是否健康。

    • 域名:输入健康检查的域名。

      • 使用后端服务器内网IP(默认):使用后端服务器的内网IP地址作为健康检查的域名。

      • 指定特定域名:输入一个域名。

    • 路径:输入健康检查页面的URL。

    • 健康状态返回码:可以选择http_2xx(默认)、http_3xxhttp_4xxhttp_5xx

其他

您还可以通过Annotation配置网络型负载均衡。详细信息请参见通过Annotation配置网络型负载均衡NLB

专有网络

集群默认专有网络地域和VPC ID。

虚拟交换机

您可以选择集群默认专有网络下,已支持的可用区对应的虚拟交换机,还可以单击创建虚拟交换机选择新建。

后续操作

如果您有查看、更新、删除Service的需求,例如需要修改Service所关联的公网负载均衡,可通过如下操作实现。

控制台操作指导

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

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

  3. 服务页面,单击目标服务操作列的更新删除,对Service进行查看、更新、删除操作。

kubectl操作指导

更新Service

  • 方式1:执行以下命令,更新Service。

    kubectl edit service my-nginx-svc
  • 方式2:手动删除旧的Service,修改YAML文件后,重新创建Service。

    kubectl apply -f my-nginx-svc.yaml

查看Service

执行以下命令,查看Service。

kubectl get service my-nginx-svc

预期输出:

NAME           TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
my-nginx-svc   LoadBalancer   172.21.XX.XX   192.168.XX.XX     80:31599/TCP   5m

删除Service

执行以下命令,删除Service。

kubectl delete service my-nginx-svc