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

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

前提条件

已存在通过SLB控制台创建的SLB实例,且该实例与ACS集群处于同一地域。本示例中使用公网CLB实例,如果没有创建,请参见创建和管理CLB实例

注意事项

复用SLB使用限制

  • 被复用的SLB需要满足以下限制条件:

    • 支持复用通过SLB控制台手动创建的SLB,不支持复用Cloud Controller Manager(CCM)自动创建的SLB及集群APIServer SLB。

    • 如果您需要在ACS集群中复用私网类型的SLB,则该SLB需要和ACS集群处于同一VPC下。

    • 复用SLB的地址类型必须与服务的访问类型一致:

      • 当服务为公网访问(即service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "internet")时,所用SLB的地址类型必须为公网

      • 当服务为内部访问(即service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet")时,所用SLB的地址类型必须为私网

    • 多个服务不能同时使用一个SLB的同一个监听端口。

    • 跨集群复用已有SLB时,需要确保两个集群的命名空间+Service组合名称不一致。

  • CCM只为Type=LoadBalancer类型的服务配置SLB。对于非LoadBalancer类型的服务,不会为其配置负载均衡。

    重要

    Type=LoadBalancer的服务变更为其他类型时,CCM会删除为该SLB添加的配置,从而造成无法通过该SLB访问服务。

  • CCM使用声明式API,会在一定条件下自动根据服务的配置刷新SLB配置。当service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"时,您自行在SLB控制台上修改的配置均存在被覆盖的风险。

    重要

    请勿在SLB控制台上手动修改ACS创建并维护的SLB的任何配置,否则有配置丢失的风险,造成服务不可访问。

  • 已创建的LoadBalancer类型Service不支持重新指定SLB。如果您需要更换SLB,请重新创建Service。

SLB配额限制

  • CCM会为Type=LoadBalancer类型的Service创建负载均衡。默认情况下一个用户可以保留60个实例。如果需要创建的数量大于60,请到配额平台提交申请

  • CCM会根据Service的配置将ECS挂载到负载均衡后端服务器组中。

    • 默认情况下一个ECS实例可挂载的后端服务器组的数量为50个,如果一台ECS需要挂载到更多的后端服务器组中,请到配额平台提交申请

    • 默认情况下一个实例可以挂载200个后端服务器,如果需要挂载更多的后端服务器,请到配额平台提交申请

  • CCM会根据Service中定义的端口创建监听。默认情况下一个实例可以添加50个监听,如需添加更多监听,请到配额平台提交申请

  • 更多负载均衡使用限制,请参见CLB使用限制NLB使用限制

    负载均衡配额查询请参见负载均衡配额管理

步骤一:部署示例应用

以下应用部署通过kubectl命令行方式进行。

  1. 在CloudShell上通过kubectl管理Kubernetes集群

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

    展开查看YAML内容

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-nginx                 #示例应用的名称。
      labels:
        app: nginx
    spec:
      replicas: 3                    #设置副本数量。
      selector:
        matchLabels:
          app: nginx                 #对应服务中Selector的值需要与其一致,才可以通过服务公开此应用。
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
            ports:
            - containerPort: 80        #需要在服务中暴露该端口。
  3. 执行以下命令,部署示例应用my-nginx。

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

    kubectl get deployment my-nginx

    返回结果示例:

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

步骤二:通过使用已有SLB的服务公开应用

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

方式一:通过控制台创建服务

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

  2. 集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情

  3. 在集群管理页左侧导航栏,选择网络 > 服务

  4. 服务页面,单击右上角的创建

  5. 创建服务对话框中,设置服务的相关参数。

    配置项

    描述

    示例

    名称

    输入服务的名称。

    my-nginx-svc

    服务类型

    选择服务类型,即服务访问的方式。

    创建服务

    • 服务类型:负载均衡 (LoadBalancer)

    • 负载均衡类型:传统型负载均衡 CLB

    • 选择资源:使用已有资源

    • 强制覆盖已有监听:勾选

    服务关联

    选择关联该服务要绑定的后端应用。若不进行关联部署,则不会创建相关的Endpoints对象,您也可自己进行绑定,请参见services-without-selectors

    通过+引用工作负载标签选择my-nginx

    • 名称:app

    • :nginx

    端口映射

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

    • 服务端口:80

    • 容器端口:80

    • 协议:TCP

    注解

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

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

    设置付费模式:

    • 名称service.beta.kubernetes.io/alibaba-cloud-loadbalancer-charge-type

    • :paybybandwidth

    设置带宽:

    • 名称service.beta.kubernetes.io/alibaba-cloud-loadbalancer-bandwidth

    • :2

    标签

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

  6. 单击创建,在服务页面,可以看到新创建的服务。

  7. 通过该服务在外部 IP 地址(External IP)列的实际IP地址,如39.106.XX.XX:80,访问示例应用。

    image

方式二:通过kubectl创建服务

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

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

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

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

    apiVersion: v1
    kind: 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
  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/TCP         5m
  4. 执行curl <YOUR-External-IP>命令访问示例应用,请将<YOUR-External-IP>替换为上面获取到的EXTERNAL-IP实际地址。

    curl 39.106.XX.XX

    返回结果示例:

    <!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>