Serverless应用引擎SAE(Serverless App Engine)上部署应用后,可以通过添加公网SLB(Server Load Balancer,负载均衡)实现应用被公网访问,也可以添加私网SLB实现同VPC内所有应用间互相访问。本文介绍如何通过Kubernetes Service为SAE应用绑定和解绑SLB。

前提条件

SAE支持以下两种命令行工具的使用方式,您可以选择其中任意一种方式。本文将以Kubectl Plugin作为默认命令行工具,介绍SAE命令行工具的使用方法。

方式一:Serverless Devs工具以及SAE插件

  • 已在本地安装Serverless Devs工具
  • 已配置阿里云认证信息。

    使用Serverless Devs工具的config命令配置权限。更多信息,请参见Config命令

  • 已初始化工作区。
    使用Serverless Devs工具的 init命令,把当前目录初始化为工作区。
    s init start-saectl -d ./
  • 安装SAE插件

    执行任意SAE插件的命令行,触发Serverless Devs工具安装SAE插件。

    s saectl get ns

方式二:Kubectl以及SAE插件

  • 已在本地安装Kubectl的SAE插件。
    执行以下脚本,快速在本地安装SAE最新版本的Kubectl插件。
    curl -fsSL https://sae-component-software.oss-cn-hangzhou.aliyuncs.com/kubectl_plugin/install.sh -o install-sae.sh
    sudo sh ./install-sae.sh
  • 已配置阿里云认证信息。
    以环境变量认证方式配置阿里云密钥:
    export ALICLOUD_ACCESS_KEY="************"
    export ALICLOUD_SECRET_KEY="************"
    export ALICLOUD_REGION="cn-shenzhen"

背景信息

SAE目前支持查看、创建、更新和删除Loadbalancer类型的Service操作,也支持Service的核心参数,但仍然存在一些限制,例如参数兼容限制。具体参数是否兼容,请参见Service参数兼容表

查看已有Service

  1. 执行以下命令,查看命名空间下所有的Service。
    % kubectl sae get service -n test
    预期输出。
    NAME               TYPE           EXTERNAL-IP     PORT(S)   BOUND         AGE
    internet-sae-app   LoadBalancer   120.79.XX.XX    80/TCP    sae-app       6d20h
    create-by-yaml     LoadBalancer   10.255.XXX.XX   80/TCP    service-zip   24d
    查看Service,显示字段如下。
    • NAME:命名空间中Service的名称。
    • TYPE:Service的类型。
    • EXTERNAL-IP:负载均衡(私网或者公网)的IP地址。
    • PORT(S):端口映射信息。
    • BOUND:Service后端负载对应的应用名称。
    • AGE:Service的运行时间。
  2. 执行以下命令,查看Service的详情。
    % kubectl sae get svc/create-by-yaml -n test -oyaml
    预期输出。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        serverless.aliyun.com/loadbalancer-address-type: intranet
      creationTimestamp: "2022-12-03T04:59:40Z"
      name: create-by-yaml
      uid: 7831ad15-078f-46fd-91f9-d7c972d7****/intranet
    spec:
      ports:
      - name: port-80
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        appid: 7831ad15-078f-46fd-91f9-d7c972d7****
        sae.app: service-zip
        sae.appid: 7831ad15-078f-46fd-91f9-d7c972d7****
      type: LoadBalancer
    status:
      loadBalancer:
        ingress:
        - ip: 10.255.XXX.XX
    Service的注解中往往会含有额外信息, SAE支持的注解包括如下信息。
    • serverless.aliyun.com/loadbalancer-address-type:声明负载均衡的类型,intranet代表私网,internet代表公网。
    • serverless.aliyun.com/loadbalancer-id:负载均衡的实例ID。

创建Service

  1. 执行以下命令,查看需要添加负载均衡的应用的详情。
    % kubectl sae get deploy/nginx-deployment -n test -oyaml
    预期输出。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      ...
    spec:
      minReadySeconds: 10
      replicas: 2
      selector:
        matchLabels:
          app: nginx
          appid: f47d7d0a-efec-4484-bf3c-4d94dd29****
      template:
        metadata:
          creationTimestamp: null
          labels:
            abc: foo1
            app: nginx
            appid: f47d7d0a-efec-4484-bf3c-4d94dd29****
        ...
                                
  2. 定义Service的YAML。
    1. 根据上面示例中Pod Template的Labels,设置Service的selector如下。
      spec:
        seletor:
          abc: foo1
          app: nginx
    2. 按需选择以下方式,继续定义Service。
      • 方式一: 为应用创建新的负载均衡
        示例如下。
        apiVersion: v1
        kind: Service
        metadata:
          annotations:
            serverless.aliyun.com/loadbalancer-address-type: intranet
          name: nginx-svc
          namespace: test
        spec:
          ports:
          - name: port-80
            port: 80
            protocol: TCP
            targetPort: 80
          selector:
            abc: foo1
            app: nginx

        示例中serverless.aliyun.com/loadbalancer-address-type注解的值为intranet,说明会为应用创建私网类型的SLB。如果需要公网类型的SLB,需要将注解值改为internet

      • 方式二: 将应用绑定到已有的负载均衡上

        在方式一的Service定义中加上注解serverless.aliyun.com/loadbalancer-id: lb-xxxx,应用将复用已有的负载均衡。

        示例如下。
        apiVersion: v1
        kind: Service
        metadata:
          annotations:
            serverless.aliyun.com/loadbalancer-address-type: intranet
            serverless.aliyun.com/loadbalancer-id: lb-xxx
          name: nginx-svc
          namespace: test
        spec:
          ports:
          - name: port-80
            port: 80
            protocol: TCP
            targetPort: 80
          selector:
            abc: foo1
            app: nginx
  3. 执行以下命令,为应用创建Service。
    % kubectl sae apply -f nginx-svc.yaml
    预期输出。
    service/nginx-svc created
  4. 执行以下命令,查看Service状态。
    % kubectl sae get -f nginx-svc.yaml
    预期输出。
    NAME        TYPE           EXTERNAL-IP      PORT(S)   BOUND              AGE
    nginx-svc   LoadBalancer   10.255.XXX.XXX   80/TCP    nginx-deployment   35s
    BOUND为期望绑定SLB的应用名称时,说明负载均衡绑定完成。后续,您可以在内网环境中(本文示例绑定私网SLB)通过 10.255.XXX.XXX:80访问名称为nginx-deployment的应用。