Serverless应用引擎SAE(Serverless App Engine)是面向应用的Serverless PaaS平台,向上抽象了应用的概念。将应用部署至SAE后,您无需管理和维护集群与服务器,可以专注于设计和构建应用程序。您既可以使用黑屏客户端以Deployment的方式管理SAE应用的整个生命周期,完成从创建、更新到最后删除的整个过程;也可以和白屏操作协作共同管理SAE应用,使用客户端查看和管理已有的SAE应用。本文介绍如何通过Kubernetes Deployment的资源定义来快速创建和管理SAE应用。

前提条件

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

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

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

背景信息

SAE兼容Kubernetes Deployment的核心参数,但由于SAE本身的Serverless属性,无法支持全部参数。具体参数是否兼容,请参见SAE对比Deployment与Service的参数兼容表

查看已有的应用

  1. 执行以下命令,查看某个地域(Region)下已有的命名空间。
    s saectl get ns
    预期输出。
    NAME         STATUS   REGION           LINK
    default      Active   cn-shenzhen      https://sae.console.aliyun.com/Overview?regionId=cn-shenzhen#/NameSpace/NamespaceDetail?regionId=cn-shenzhen&namespaceId=cn-shenzhen
    test         Active   cn-shenzhen      https://sae.console.aliyun.com/Overview?regionId=cn-shenzhen#/NameSpace/NamespaceDetail?regionId=cn-shenzhen&namespaceId=cn-shenzhen:test
    查看命名空间,显示字段如下。
    • Name:命名空间的名字。
    • STATUS:命名空间的状态。Active表示可用,Terminating表示删除中。
    • REGION:命名空间所在地域(Region)。
    • Link:命名空间的Web地址,单击后可以直接跳转到对应命名空间的Web页面(浏览器需处于登录状态)。
  2. 执行以下命令,查看某个命名空间下的所有应用。
    s saectl get deployments -n test
    预期输出。
    NAME              READY   AVAILABLE   TYPE     STATE       LANGUAGE   AGE
    service-1         4/4     4           Image    RUNNING     java       76d
    consumer          0/2     0           Image    STOPPED     java       76d
    php-zip           2/1     2           PhpZip   PUBLISHING  php        65d
    serverless-app    2/2     2           Image    RUNNING     other      76d
    sae-jump-server   0/1     0           Image    RUNNING     java       202d
    service-jar       2/2     0           FatJar   UNSYNCED    java       82d
    web               0/1     0           War      STOPPED     java       81d
    查看Deployment,显示字段如下。
    • Name:命名空间中Deployment的名称。
    • READY:应用的可用的“副本”数,格式为“就绪个数/期望个数”。
    • AVAILABLE:应用可供用户使用的副本数。
    • TYPE:应用的部署方式。
    • STATE:应用的状态。取值说明如下。
      • RUNNING:应用处于正常运行中。
      • PUBLISHING:应用处于发布中。
      • STOPPED:应用已停止。
      • UNSYNCED:应用最近一次发布失败(最新的修改未生效)。
      • PAUSE:应用的发布流程暂停,等待用户确认,需要用户在白屏上操作发布单继续执行。
    • LANGUAGE:应用技术栈语言。
    • AGE:应用运行时间。
  3. 查看应用详情。
    • 以YAML格式输出应用详情。
      % s saectl get deployment/svc-demo -n test -oyaml
      展开查看预期输出。
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        annotations:
          serverless.aliyun.com/language: other
          serverless.aliyun.com/state: RUNNING
          serverless.aliyun.com/type: Image
        creationTimestamp: "2022-11-01T03:52:12Z"
        generation: 34
        labels:
          s1: t2
        name: svc-demo
        namespace: test
        resourceVersion: "1670987571659"
        selfLink: https://sae.console.aliyun.com/Overview?regionId=cn-shenzhen#/AppList/AppDetail?appId=0e99102e-4f34-4a90-bdd0-1082e476****
        uid: 0e99102e-4f34-4a90-bdd0-1082e476****
      spec:
        minReadySeconds: 10
        replicas: 2
        selector:
          matchLabels:
            appid: 0e99102e-4f34-4a90-bdd0-1082e47****
        strategy:
          rollingUpdate:
            maxSurge: 25%
            maxUnavailable: 0
          type: RollingUpdate
        template:
          metadata:
            creationTimestamp: null
            labels:
              appid: 0e99102e-4f34-4a90-bdd0-1082e476****
          spec:
            containers:
            - env:
              - name: k1
                value: s1
              envFrom:
              - configMapRef:
                  name: example-configmap
              image: registry-vpc.cn-shenzhen.aliyuncs.com/sae-****/wordpress:1.0
              imagePullPolicy: Always
              name: main
              resources:
                limits:
                  cpu: "1"
                  memory: 2Gi
                requests:
                  cpu: "1"
                  memory: 2Gi
              volumeMounts:
              - mountPath: /etc/config
                name: user-example-configmap
                subPath: database_uri
            nodeSelector:
              vpc: vpc-xxx
              vswitch: vsw-xxx
            restartPolicy: Always
            securityContext:
              seLinuxOptions:
                role: sg-wz9hokpg2hi517xw****
            terminationGracePeriodSeconds: 30
            volumes:
            - configMap:
                name: example-configmap
              name: user-example-configmap
      status:
        availableReplicas: 2
        collisionCount: 0
        observedGeneration: 34
        readyReplicas: 2
        replicas: 2
        updatedReplicas: 2
                                      
    • 优雅展示应用详情。
      % s saectl describe deploy/svc-demo -n test
      展开查看预期输出。
      Name:                   svc-demo
      Namespace:              test
      CreationTimestamp:      Tue, 01 Nov 2022 11:52:12 +0800
      Labels:                 s1=t2
      Annotations:            serverless.aliyun.com/language: other
                              serverless.aliyun.com/state: RUNNING
                              serverless.aliyun.com/type: Image
      Selector:               appid=0e99102e-4f34-4a90-bdd0-1082e476****
      Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
      StrategyType:           RollingUpdate
      MinReadySeconds:        10
      RollingUpdateStrategy:  0 max unavailable, 25% max surge
      Pod Template:
        Labels:  appid=0e99102e-4f34-4a90-bdd0-1082e476****
        Containers:
         main:
          Image:      registry-vpc.cn-shenzhen.aliyuncs.com/sae-****/wordpress:1.0
          Port:       <none>
          Host Port:  <none>
          Limits:
            cpu:     1
            memory:  2Gi
          Requests:
            cpu:     1
            memory:  2Gi
          Environment Variables from:
            example-configmap  ConfigMap  Optional: false
          Environment:
            k1:  s1
          Mounts:
            /etc/config from user-example-configmap (rw,path="database_uri")
        Volumes:
         user-example-configmap:
          Type:      ConfigMap (a volume populated by a ConfigMap)
          Name:      example-configmap
          Optional:  false

创建新的应用

Kubernetes社区文档中的Deployment示例如下。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
  1. 执行apply命令,创建应用。
    s saectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml -n test
  2. 执行以下命令,查看创建的应用。
    s saectl get deploy/nginx-deployment -n test
    STATEPUBLISHING,表示应用正在发布中。
    NAME               READY   AVAILABLE   TYPE    STATE        LANGUAGE   AGE
    nginx-deployment   0/3     0           Image   PUBLISHING   other      3s
  3. 再次执行步骤2的命令,查看应用。
    STATERUNNING,表示应用已经部署成功。
    NAME               READY   AVAILABLE   TYPE    STATE        LANGUAGE   AGE
    nginx-deployment   3/3     3           Image   RUNNING      other      87s

更新应用

您可以使用以下四种方式更新应用。

方式一:更新应用镜像

  1. 执行set image命令,更新应用的镜像。
    s saectl set image deploy/ngnix-deployment nginx=registry-vpc.cn-shenzhen.aliyuncs.com/sae-****/nginx:stable -n test
  2. 查看应用。
    应用处于发布中(STATEPUBLISHING)。
    NAME               READY   AVAILABLE   TYPE    STATE        LANGUAGE   AGE
    nginx-deployment   3/3     3           Image   PUBLISHING   other      26m
  3. 再次查看应用。
    STATERUNNING,表示镜像更新完成。
    NAME               READY   AVAILABLE   TYPE    STATE        LANGUAGE   AGE
    nginx-deployment   3/3     3           Image   RUNNING      other      26m

方式二:对应用进行扩缩容

执行scale命令,更改应用的副本数。
s saectl scale deploy/nginx-deployment --replicas=1 -n test

方式三:用YAML文件更新应用

首先修改该应用的YAML文件,然后执行apply命令。
s saectl apply -f updated.yaml

方式四:在线编辑应用

s saectl edit deploy/nginx-deployment  -n test