SAE的应用对应于Kubernetes的Deployment资源类型。本文介绍如何使用kubectl-sae工具管理SAE应用,并提供相关的K8s YAML配置文件示例。
前提条件
已安装kubectl-sae工具,并配置AccessKey ID、AccessKey Secret、应用部署地域,详见安装与配置kubectl-sae工具。
管理应用
kubectl-sae工具支持创建、查看、更新、删除应用。
创建应用
kubectl-sae工具支持通过镜像或代码包(JAR包或WAR包)部署应用,请根据您的需求选择部署方式。
通过镜像部署应用
编写配置文件
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
在
deployment.yaml
文件所在路径执行以下命令,实现应用的创建。kubectl-sae apply -f deployment.yaml
通过代码包部署应用
上传代码包:请根据您的需求选择代码包上传方式。
上传至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快速入门。
编写配置文件
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
在
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 | 应用的状态。取值如下:
|
LANGUAGE | 应用的技术栈语言。 |
AGE | 应用的存在时长。 |
查看应用详情
kubectl-sae工具支持使用get
或describe
命令查看应用详情。返回结果中包含应用的配置项,详情请参考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工具支持使用scale
,edit
或apply
命令更新应用。
通过scale命令实现应用手动扩缩容
执行以下命令,实现应用手动扩缩容。
kubectl-sae scale deployment ${deployment-name} -n ${namespace} --replicas=${pod-num}
# ${deployment-name}为应用名称
# ${namespace}为命名空间ID,如果不通过-n参数指定命名空间,则默认使用default命名空间
# ${pod-num}为期望的应用实例数
通过edit命令在线编辑应用配置信息
执行以下命令,将会以YAML文件的形式打开指定应用的配置信息。
kubectl-sae edit deployment ${deployment-name} -n ${namespace} # ${deployment-name}为应用名称 # ${namespace}为命名空间ID,如果不通过-n参数指定命名空间,则默认使用default命名空间
在打开的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 | 使用固定格式如下:
创建时必须指定此配置项。 更新时不支持此配置项。 |
spec.strategy.type | 使用固定值RollingUpdate。 更新时不支持此配置项。 |
spec.strategy.rollingUpdate.maxSurge | 使用固定值0。 更新时不支持此配置项。 |
spec.strategy.rollingUpdate.maxUnavailable | 应用最大不可用的实例数。 根据MinReadyInstances/MinReadyInstanceRatio和Replicas进行计算。
|
spec.template.metadata.labels | 使用固定格式如下:
创建时必须指定此配置项。 |
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 | 单个容器实例的规格。 使用固定格式如下:
|
spec.template.spec.container[i].env | 容器的环境变量配置。支持如下配置方式:
示例如下:
|
spec.template.spec.container[i].envFrom | 容器的环境变量配置。配置方式是从已有的ConfigMap中引用全部键值对。 示例如下:
|
spec.template.spec.containers[i].volumeMounts spec.template.spec.volumes | 将ConfigMap配置项作为文件挂载到容器中。
|
spec.template.spec.restartPolicy | 使用固定值Always。 更新时不支持此配置项。 |