通过使用已有CLB的服务公开Kubernetes应用

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

前提条件

已存在通过CLB控制台创建的CLB实例,且该实例与Kubernetes集群处于同一地域。如果没有创建,请参见创建和管理CLB实例

背景信息

如果您集群的Cloud Controller Manager(CCM)组件版本大于等于v1.9.3,对于指定已有CLB,CCM默认不再为该CLB处理监听。您可以通过设置service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"参数来启用监听配置,或者手动配置该CLB的监听规则。

查看CCM版本的方法:

  • 使用控制台:在集群组件管理页面查看CCM组件版本。

    1. 登录容器服务管理控制台

    2. 在控制台左侧导航栏,单击集群

    3. 集群列表页面,在目标集群右侧,选择更多 > 运维管理 > 组件管理,进入组件管理页签查看CCM的版本信息。

  • 使用kubectl命令行(仅适用于专有版集群):执行以下命令查看CCM组件版本。

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

注意事项

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

    • 支持复用通过CLB控制台创建的CLB,不支持复用CCM自动创建的CLB

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

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

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

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

    重要

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

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

    重要

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

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

CLB配额限制

  • CCM会为Type=LoadBalancer类型的Service创建CLB。默认情况下一个用户可以保有60个CLB实例。

  • CCM会根据Service中定义的端口创建CLB监听。默认情况下一个CLB实例可以添加50个监听。

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

    • 默认情况下一个ECS实例可挂载的后端服务器组的数量为50个。

    • 默认情况下一个CLB实例可以挂载200个后端服务器。

    说明

    如需更大配额,您可以前往配额管理页面,并根据控制台提示申请配额。

    关于更多CLB使用限制,请参见使用限制

步骤一:部署示例应用

以下应用部署通过kubectl命令行方式进行。如果您需要通过控制台部署应用,请参见创建无状态工作负载Deployment

  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: 3       #设置副本数量。
      selector:
        matchLabels:
          app: nginx     #对应服务中Selector的值需要与其一致,才可以通过服务公开此应用。
      template:
        metadata:
          labels:
            app: nginx
        spec:
        #  nodeSelector:
        #    env: test-team
          containers:
          - name: nginx
            image: registry.aliyuncs.com/acs/netdia:latest     #替换为您实际的镜像地址,格式为:<image_name:tags>。
            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   3/3     3            3           50s

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

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

控制台方式

  1. 登录容器服务管理控制台

  2. 在控制台左侧导航栏,单击集群

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

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

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

  6. 创建服务对话框中,设置服务的相关参数,然后单击创建

    参数

    描述

    服务名称

    输入服务的名称。

    服务类型

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

    强制覆盖已有监听:选择是否强制覆盖CLB上的已有监听或者为没有监听的CLB自动创建监听。

    说明
    • 如果已有负载均衡的监听上绑定了业务,强制覆盖可能会引发业务中断。

    • 由于CCM目前支持的后端配置有限,无法处理一些复杂配置。如果有复杂的后端配置需求,可以在不覆盖监听的情况下,通过控制台自行配置监听。

    如存在以上两种情况不建议强制覆盖监听;如果已有负载均衡的监听端口不再使用,则可以强制覆盖。

    外部流量策略

    设置外部流量策略。

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

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

    说明

    您的服务类型为节点端口或负载均衡时,才能设置外部流量策略。

    服务关联

    选择关联该服务要绑定的后端应用。

    端口映射

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

    注解

    为该服务添加一个注解(Annotation),配置负载均衡的参数。

    标签

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

    服务页面,可以看到新创建的服务。

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

Kubectl方式

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

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

    • 使用已有的CLB实例时,默认情况下不会为该CLB创建监听或覆盖已有监听。如有需要,请设置service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listenerstrue。本示例中,CLB实例为新创建,需要为其创建监听,因此设为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: nignx
      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:30471/TCP   5m
  4. 执行curl <YOUR-External-IP>命令访问示例应用,请将YOUR-External-IP替换为上面获取到的EXTERNAL-IP地址。