使用kubectl-sae工具管理应用Deployment

SAE的应用对应于Kubernetes的Deployment资源类型。本文介绍如何使用kubectl-sae工具管理SAE应用,并提供相关的K8s YAML配置文件示例。

前提条件

已安装kubectl-sae工具,并配置AccessKey ID、AccessKey Secret、应用部署地域,详见安装与配置kubectl-sae工具

管理应用

kubectl-sae工具支持创建、查看、更新、删除应用。

创建应用

kubectl-sae工具支持通过镜像或代码包(JAR包或WAR包)部署应用,请根据您的需求选择部署方式。

通过镜像部署应用

  1. 编写配置文件deployment.yaml。配置文件的示例如下,各配置项的详细信息请参考K8s YAML配置项说明

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      annotations:
        # 应用语言
        sae.aliyun.com/language: java
        # Kafka 日志采集配置
        sae.aliyun.com/log-kafka-config: '{"kafkaEndpoint":"10.0.X.XXX:XXXX,10.0.X.XXX:XXXX,10.0.X.XXX:XXXX","kafkaInstanceId":"alikafka_****","kafkaConfigs":[{"logType":"file_log","logDir":"/tmp/a.log","kafkaTopic":"test2"},{"logType":"stdout","logDir":"","kafkaTopic":"test"}]}'
        # SLS 日志采集配置
        sae.aliyun.com/log-sls-config: '[{"logDir":"","logType":"stdout"},{"logDir":"/tmp/a.log"}]'
        # Nacos 注册中心
        sae.aliyun.com/micro-registration: "2"
        # 注册中心配置
        sae.aliyun.com/micro-registration-config: '{"instanceId":"mse_xxxxxxx","namespace":"xxxxxxxxxxxx"}'
        # NAS 挂载
        sae.aliyun.com/nas-mount: '[{"mountPath":"/test1","readOnly":false,"nasId":"nasId1","mountDomain":"nasId1.cn-shenzhen.nas.aliyuncs.com","nasPath":"/test1"},{"nasId":"nasId2","mountDomain":"nasId2.cn-shenzhen.nas.aliyuncs.com","readOnly":false,"nasPath":"/test2","mountPath":"/test2"}]'
        # OSS 挂载
        sae.aliyun.com/oss-mount: '{"ossAkId":"******","ossAkSecret":"******","ossMountDescs":[{"bucketName":"bucket","bucketPath":"/","mountPath":"/tmp"}]}'
        # K8s Service Name 配置
        sae.aliyun.com/pvtz-discovery-svc: '{"serviceName":"gateway-cn-beijing-demo","namespaceId":"cn-beijing:front","portAndProtocol":{"18012":"TCP"},"enable":true,"portProtocols":[{"port":18012,"protocol":"TCP"}]}'
        # 运行时
        sae.aliyun.com/runtime: Open JDK 8
        # 安全组
        sae.aliyun.com/security-group-id: sg-xxxxxxx
        # 应用部署方式,Image表示选择镜像部署
        sae.aliyun.com/type: Image
        # 应用关联的VPC ID
        sae.aliyun.com/vpc-id: vpc-xxxxxxxx
        # 应用关联的交换机列表
        sae.aliyun.com/vswitch-list: vsw-xxxxxxx
        # 在全链路灰度场景下创建灰度应用时,请在此配置基线应用名称
        sae.aliyun.com/base-app-name: base-app
        # 在全链路灰度场景下创建灰度应用时,请在此配置应用的灰度标签
        sae.aliyun.com/serviceTags: '{"alicloud.service.tag":"g1"}'
      name: test-yaml # 应用名称
      namespace: default # 应用所在的命名空间ID
    spec:
      replicas: 2 # 容器实例数
      selector:
        matchLabels:
          sae.aliyun.com/app-name: test-yaml # 应用名称
      strategy:
        rollingUpdate:
          maxSurge: 0 # 固定值
          maxUnavailable: 1 # 应用最大不可用的实例数
        type: RollingUpdate # 固定值
      template:
        metadata:
          labels:
            sae.aliyun.com/app-name: test-yaml # 应用名称
        spec:
          containers: # SAE不支持Sidecar,仅支持配置一个Container信息
          - args:
            - /home/admin/start.sh # 启动命令及参数
            command:
            - /bin/bash # 选择启动命令,取值范围如下:/bin/sh、/bin/bash
            env: # 容器的环境变量配置
            - name: test
              value: "123"
            - name: my-office
              valueFrom:
                configMapKeyRef:
                  key: office
                  name: my-config
            # 镜像仓库地址
            image: registry.cn-shenzhen.aliyuncs.com/sae-serverless-demo/sae-demo:microservice-java-provider-v1.0
            imagePullPolicy: Always # 固定值
            # 启用应用实例存活检查(Liveness配置)
            livenessProbe:
              failureThreshold: 1 # 不健康阈值(次)
              initialDelaySeconds: 1 # 延迟时间(秒)
              periodSeconds: 5 # 检查周期(秒)
              tcpSocket:
                port: 18081 # TCP端口
              timeoutSeconds: 3 # 超时时间(秒)
            name: main # 固定值
            # 启用应用业务就绪检查(Readiness配置)
            readinessProbe:
              failureThreshold: 1 # 不健康阈值(次)
              initialDelaySeconds: 1 # 延迟时间(秒)
              periodSeconds: 5 # 检查周期(秒)
              successThreshold: 1 # 健康阈值(次)
              tcpSocket:
                port: 18081 # TCP端口
              timeoutSeconds: 5 # 超时时间(秒)
            # 单个容器实例的规格。limits和requests需要保持相同的配置。
            resources:
              limits:
                cpu: "2"
                memory: 4Gi
              requests:
                cpu: "2"
                memory: 4Gi
            # 将ConfigMap配置项作为文件挂载到容器中。
            volumeMounts:
            - mountPath: /tmp/myconfig/name # 挂载路径
              name: my-config # 需要挂载的ConfigMap名称
              subPath: name # 如果是挂载部分配置项,此处为配置项的键名
            - mountPath: /tmp/otherconfig
              name: other-config
          # Hosts绑定
          hostAliases:
          - hostnames:
            - locahost2
            ip: 127.0.0.2
          - hostnames:
            - localhost
            ip: 127.0.0.1
          restartPolicy: Always # 固定值
          terminationGracePeriodSeconds: 10 # 优雅下线超时时间
          # 将ConfigMap配置项作为文件挂载到容器中时,需要为ConfigMap关联volume
          volumes:
          - configMap:
              name: my-config
            name: my-config
          - configMap:
              name: other-config
            name: other-config
  2. deployment.yaml文件所在路径执行以下命令,实现应用的创建。

    kubectl-sae apply -f deployment.yaml

通过代码包部署应用

  1. 上传代码包:请根据您的需求选择代码包上传方式。

    上传至SAE

    在代码包所在路径执行以下命令,将代码包上传至SAE。

    kubectl-sae upload ${package-filename}
    # ${package-filename}为代码包文件名(包含扩展名)

    输出结果的示例如下,请记录其中代码包的URL,以备后续步骤使用。

    PackageUrl: https://sae-oss-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/apps/K8S_APP_ID/${account_id}/${package_uuid}/hello-sae.jar
    # PackageUrl的值为已上传的代码包的URL
    上传至OSS Bucket

    将代码包上传至您已有的OSS Bucket,并记录代码包的URL,以备后续步骤使用。详情请参考OSS快速入门

  2. 编写配置文件deployment.yaml。配置文件的示例如下,各配置项的详细信息请参考K8s YAML配置项说明

    重要
    • 配置文件中的metadata:annotations:sae.aliyun.com/package-url需要配置为上一步骤中上传的代码包的URL。

    • 配置文件中的spec.template.spec.container[i].image需要配置为固定值mock-image

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      annotations:
        # 应用语言
        sae.aliyun.com/language: java
        # Kafka 日志采集配置
        sae.aliyun.com/log-kafka-config: '{"kafkaEndpoint":"10.0.X.XXX:XXXX,10.0.X.XXX:XXXX,10.0.X.XXX:XXXX","kafkaInstanceId":"alikafka_****","kafkaConfigs":[{"logType":"file_log","logDir":"/tmp/a.log","kafkaTopic":"test2"},{"logType":"stdout","logDir":"","kafkaTopic":"test"}]}'
        # SLS 日志采集配置
        sae.aliyun.com/log-sls-config: '[{"logDir":"","logType":"stdout"},{"logDir":"/tmp/a.log"}]'
        # Nacos 注册中心
        sae.aliyun.com/micro-registration: "2"
        # 注册中心配置
        sae.aliyun.com/micro-registration-config: '{"instanceId":"mse_xxxxxxx","namespace":"xxxxxxxxxxxx"}'
        # NAS 挂载
        sae.aliyun.com/nas-mount: '[{"mountPath":"/test1","readOnly":false,"nasId":"nasId1","mountDomain":"nasId1.cn-shenzhen.nas.aliyuncs.com","nasPath":"/test1"},{"nasId":"nasId2","mountDomain":"nasId2.cn-shenzhen.nas.aliyuncs.com","readOnly":false,"nasPath":"/test2","mountPath":"/test2"}]'
        # OSS 挂载
        sae.aliyun.com/oss-mount: '{"ossAkId":"******","ossAkSecret":"******","ossMountDescs":[{"bucketName":"bucket","bucketPath":"/","mountPath":"/tmp"}]}'
        # K8s Service Name 配置
        sae.aliyun.com/pvtz-discovery-svc: '{"serviceName":"gateway-cn-beijing-demo","namespaceId":"cn-beijing:front","portAndProtocol":{"18012":"TCP"},"enable":true,"portProtocols":[{"port":18012,"protocol":"TCP"}]}'
        # 运行时
        sae.aliyun.com/runtime: Open JDK 8
        # 安全组
        sae.aliyun.com/security-group-id: sg-xxxxxxx
        # 应用部署方式,取值如下:FatJar表示选择JAR包部署,War表示选择WAR包部署
        sae.aliyun.com/type: FatJar
        # 应用运行环境
        sae.aliyun.com/web-container: apache-tomcat-7.0.91
        # 时区
        sae.aliyun.com/timezone: Asia/Shanghai
        # 版本号
        sae.aliyun.com/package-version: ${version}
        # 已上传的代码包的URL
        sae.aliyun.com/package-url: ${package-url}
        # 应用关联的VPC ID
        sae.aliyun.com/vpc-id: vpc-xxxxxxxx
        # 应用关联的交换机列表
        sae.aliyun.com/vswitch-list: vsw-xxxxxxx
        # 在全链路灰度场景下创建灰度应用时,请在此配置基线应用名称
        sae.aliyun.com/base-app-name: base-app
        # 在全链路灰度场景下创建灰度应用时,请在此配置应用的灰度标签
        sae.aliyun.com/serviceTags: '{"alicloud.service.tag":"g1"}'
      name: test-yaml # 应用名称
      namespace: default # 应用所在的命名空间ID
    spec:
      replicas: 2 # 容器实例数
      selector:
        matchLabels:
          sae.aliyun.com/app-name: test-yaml # 应用名称
      strategy:
        rollingUpdate:
          maxSurge: 0 # 固定值
          maxUnavailable: 1 # 应用最大不可用的实例数
        type: RollingUpdate # 固定值
      template:
        metadata:
          labels:
            sae.aliyun.com/app-name: test-yaml # 应用名称
        spec:
          containers: # SAE不支持Sidecar,仅支持配置一个Container信息
          - args:
            - /home/admin/start.sh # 启动命令及参数
            command:
            - /bin/bash # 选择启动命令,取值范围如下:/bin/sh、/bin/bash
            env: # 容器的环境变量配置
            - name: test
              value: "123"
            - name: my-office
              valueFrom:
                configMapKeyRef:
                  key: office
                  name: my-config
            image: mock-image # 选择代码包部署时,image需要配置为固定值mock-image
            imagePullPolicy: Always # 固定值
            # 启用应用实例存活检查(Liveness配置)
            livenessProbe:
              failureThreshold: 1 # 不健康阈值(次)
              initialDelaySeconds: 1 # 延迟时间(秒)
              periodSeconds: 5 # 检查周期(秒)
              tcpSocket:
                port: 18081 # TCP端口
              timeoutSeconds: 3 # 超时时间(秒)
            name: main # 固定值
            # 启用应用业务就绪检查(Readiness配置)
            readinessProbe:
              failureThreshold: 1 # 不健康阈值(次)
              initialDelaySeconds: 1 # 延迟时间(秒)
              periodSeconds: 5 # 检查周期(秒)
              successThreshold: 1 # 健康阈值(次)
              tcpSocket:
                port: 18081 # TCP端口
              timeoutSeconds: 5 # 超时时间(秒)
            # 单个容器实例的规格。limits和requests需要保持相同的配置。
            resources:
              limits:
                cpu: "2"
                memory: 4Gi
              requests:
                cpu: "2"
                memory: 4Gi
            # 将ConfigMap配置项作为文件挂载到容器中。
            volumeMounts:
            - mountPath: /tmp/myconfig/name # 挂载路径
              name: my-config # 需要挂载的ConfigMap名称
              subPath: name # 如果是挂载部分配置项,此处为配置项的键名
            - mountPath: /tmp/otherconfig
              name: other-config
          # Hosts绑定
          hostAliases:
          - hostnames:
            - locahost2
            ip: 127.0.0.2
          - hostnames:
            - localhost
            ip: 127.0.0.1
          restartPolicy: Always # 固定值
          terminationGracePeriodSeconds: 10 # 优雅下线超时时间
          # 将ConfigMap配置项作为文件挂载到容器中时,需要为ConfigMap关联volume
          volumes:
          - configMap:
              name: my-config
            name: my-config
          - configMap:
              name: other-config
            name: other-config
  3. deployment.yaml文件所在路径执行以下命令,实现应用的创建。

    kubectl-sae apply -f deployment.yaml

查看应用列表

执行以下命令,查看指定命名空间下已有的应用。

kubectl-sae get deployment -n ${namespace} 
# ${namespace}为命名空间ID,如果不通过-n参数指定命名空间,则默认使用default命名空间

输出结果的字段说明如下:

字段

说明

NAME

应用的名称。

READY

已准备就绪的应用实例数 / 期望部署的目标实例数,准备就绪是指已通过Readiness探针检查。

AVAILABLE

当前正在运行的应用实例数。

TYPE

应用的部署方式,Image表示通过镜像部署。

STATE

应用的状态。取值如下:

  • RUNNING:运行中

  • STOPPED:已停止

  • PUBLISHING:发布中

LANGUAGE

应用的技术栈语言。

AGE

应用的存在时长。

查看应用详情

kubectl-sae工具支持使用getdescribe命令查看应用详情。返回结果中包含应用的配置项,详情请参考K8s YAML配置项说明

通过get命令查看应用配置信息

执行以下命令,查看应用的配置信息。

kubectl-sae get deployment ${deployment-name} -o {yaml | json} -n ${namespace}
# ${deployment-name}为应用名称
# -o参数指定返回结果的格式
# ${namespace}为命名空间ID,如果不通过-n参数指定命名空间,则默认使用default命名空间

通过describe命令查看应用详情

执行以下命令,查看应用详情。

kubectl-sae describe deployment ${deployment-name} -n ${namespace}
# ${deployment-name}为应用名称
# ${namespace}为命名空间ID,如果不通过-n参数指定命名空间,则默认使用default命名空间

更新应用

kubectl-sae工具支持使用scaleeditapply命令更新应用。

通过scale命令实现应用手动扩缩容

执行以下命令,实现应用手动扩缩容。

kubectl-sae scale deployment ${deployment-name} -n ${namespace} --replicas=${pod-num}
# ${deployment-name}为应用名称
# ${namespace}为命名空间ID,如果不通过-n参数指定命名空间,则默认使用default命名空间
# ${pod-num}为期望的应用实例数

通过edit命令在线编辑应用配置信息

  1. 执行以下命令,将会以YAML文件的形式打开指定应用的配置信息。

    kubectl-sae edit deployment ${deployment-name} -n ${namespace}
    # ${deployment-name}为应用名称
    # ${namespace}为命名空间ID,如果不通过-n参数指定命名空间,则默认使用default命名空间
  2. 在打开的YAML文件中按需修改配置信息,保存并关闭文件,等待配置信息变更完成。

通过apply命令实现按照YAML配置文件更新应用

修改已部署的应用的配置文件deployment.yaml,在配置文件所在路径执行以下命令,实现应用配置信息的变更。

kubectl-sae apply -f deployment.yaml

删除应用

执行以下命令,删除指定应用。

kubectl-sae delete deployment ${deployment-name} -n ${namespace}
# ${deployment-name}为应用名称
# ${namespace}为命名空间ID,如果不通过-n参数指定命名空间,则默认使用default命名空间

K8s YAML配置项说明

SAE的应用对应于Kubernetes的Deployment资源类型。相关K8s YAML配置项说明详见下表。

配置项

说明

metadata.name

应用名称。

创建时必须指定此配置项。
更新时不支持此配置项。

metadata.namespace

应用所在的命名空间ID。

创建时必须指定此配置项。
更新时不支持此配置项。

metadata.uid

应用ID。

创建时不支持此配置项。
更新时不支持此配置项。

metadata.annotations:

sae.aliyun.com/vpc-id

应用关联的 VPC ID。

如果命名空间不是default,创建时必须指定此配置项。
更新时不支持此配置项。

metadata.annotations:

sae.aliyun.com/vswitch-list

应用关联的交换机列表。

如果命名空间不是default,创建时必须指定此配置项。

metadata.annotations:

sae.aliyun.com/security-group-id

应用关联的安全组。

创建时此配置项为可选项,如果不指定,则SAE自动配置安全组。
更新时不支持此配置项。

metadata.annotations:

sae.aliyun.com/language

创建应用的技术栈语言。详见 CreateApplication中的ProgrammingLanguage字段。

创建时此配置项为可选项,如果不指定,则默认为other。

metadata.annotations:

sae.aliyun.com/runtime

部署包依赖的 JDK 版本。详见CreateApplication中的Jdk字段。

metadata.annotations:

sae.aliyun.com/type

应用包类型。详见CreateApplication中的PackageType字段。

创建时必须指定此配置项。
更新时不支持此配置项。

metadata.annotations:

sae.aliyun.com/package-url

已上传的代码包的URL。详见CreateApplication中的PackageUrl字段。

metadata.annotations:

sae.aliyun.com/package-version

版本号。详见CreateApplication中的PackageVersion字段。

metadata.annotations:

sae.aliyun.com/web-container

应用运行环境。详见CreateApplication中的WebContainer字段。

metadata.annotations:

sae.aliyun.com/timezone

时区。详见CreateApplication中的Timezone字段。

metadata.annotations:

sae.aliyun.com/state

应用状态。

创建时不支持此配置项。
更新时不支持此配置项。

metadata.annotations:

sae.aliyun.com/log-sls-config

日志采集到SLS的配置。详见CreateApplication中的SlsConfigs 字段。

metadata.annotations:

sae.aliyun.com/log-kafka-config

日志采集到Kafka的配置。详见CreateApplication中的KafkaConfigs 字段。

metadata.annotations:

sae.aliyun.com/micro-registration

选择Nacos注册中心。详见CreateApplication中的MicroRegistration 字段。

metadata.annotations:

sae.aliyun.com/micro-registration-config

注册中心配置信息。详见CreateApplication中的MicroRegistrationConfig字段。

metadata.annotations:

sae.aliyun.com/pvtz-discovery-svc

开启 K8s Service 服务注册发现。详见CreateApplication中的PvtzDiscoverySvc字段。

metadata.annotations:

sae.aliyun.com/nas-mount

挂载NAS的配置,详见CreateApplication中的NasConfigs字段。

metadata.annotations:

sae.aliyun.com/oss-mount

挂载OSS的配置,详见CreateApplication中的OssAkId、OssAkSecret、OssMountDescs 字段。

metadata.annotations:

sae.aliyun.com/base-app-name

在全链路灰度场景下创建灰度应用时,配置基线应用名称。

更新时不支持此配置项。

metadata.annotations:

sae.aliyun.com/serviceTags

在全链路灰度场景下创建灰度应用时,配置应用的灰度标签。详见CreateApplication中的ServiceTags字段。

spec.replicas

容器实例数。

spec.selector

使用固定格式如下:

selector:
    matchLabels:
      sae.aliyun.com/app-name: ${应用名称}
创建时必须指定此配置项。
更新时不支持此配置项。

spec.strategy.type

使用固定值RollingUpdate。

更新时不支持此配置项。

spec.strategy.rollingUpdate.maxSurge

使用固定值0。

更新时不支持此配置项。

spec.strategy.rollingUpdate.maxUnavailable

应用最大不可用的实例数。

根据MinReadyInstances/MinReadyInstanceRatio和Replicas进行计算。

  • 如果MinReadyInstances不为-1,则maxUnavailable = Replicas - MinReadyInstances

  • 如果 MinReadyInstanceRatio不为-1,则maxUnavailable = Replicas - ceil(Replicas * (MinReadyInstanceRatio/100.0)),其中ceil代表向上取整。

spec.template.metadata.labels

使用固定格式如下:

labels:
  sae.aliyun.com/app-name: ${应用名称}
创建时必须指定此配置项。

spec.template.spec.containers

SAE不支持Sidecar,仅支持配置一个Container信息。

spec.template.spec.container[i].imagePullPolicy

使用固定值always。

更新时不支持此配置项。

spec.template.spec.container[i].name

使用固定值main。

创建时必须指定此配置项。
更新时不支持此配置项。

spec.template.spec.container[i].resources

单个容器实例的规格。

使用固定格式如下:

resources:
  # limits和requests需要保持相同的配置
  limits:
    cpu: "2"
    memory: 4Gi
  requests:
    cpu: "2"
    memory: 4Gi

spec.template.spec.container[i].env

容器的环境变量配置。支持如下配置方式:

  • 直接指定键值对。

  • 从已有的ConfigMap中引用键值对。

示例如下:

      env:
        # 直接指定键值对
        - name: test
          value: "123"
        # 从已有的ConfigMap中引用键值对
        - name: database # 表示容器中的环境变量名
          valueFrom:
            configMapKeyRef:
              key: database # 表示引用的ConfigMap中的环境变量名
              name: database-configmap # 表示引用的ConfigMap名称

spec.template.spec.container[i].envFrom

容器的环境变量配置。配置方式是从已有的ConfigMap中引用全部键值对。

示例如下:

      envFrom:
        - configMapRef:
            name: other-configmap # 表示引用的ConfigMap名称

spec.template.spec.containers[i].volumeMounts

spec.template.spec.volumes

将ConfigMap配置项作为文件挂载到容器中。

        volumeMounts:
        - mountPath: /tmp/config-1
          name: my-config
        - mountPath: /tmp/config-2
          name: other-config
      volumes:
      - configMap:
          name: my-config
        name: my-config
      - configMap:
          name: other-config
        name: other-config

spec.template.spec.restartPolicy

使用固定值Always。

更新时不支持此配置项。