saectl工具快速入门

本文介绍saectl工具的使用方法和常用命令,帮助您快速入门并实现一些常见的业务需求。

前提条件

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

K8s YAML转换为SAE YAML文件

K8s部署的应用迁移到SAE部署,步骤如下:

  1. 执行以下命令,将已有的K8s YAML文件转换为SAE YAML文件(即符合SAE规范的YAML文件,它与K8s规范存在差异)。

    saectl convert -f <k8s-compliant-file.yaml> -o <sae-compliant-file.yaml>
    # <k8s-compliant-file.yaml>: 已有的K8s YAML文件名
    # <sae-compliant-file.yaml>: 需要生成的SAE YAML文件名
  2. 执行以下命令,尝试根据SAE YAML文件将应用部署到SAE。

    saectl apply -f <sae-compliant-file.yaml>
    # <sae-compliant-file.yaml>: 之前生成的SAE YAML文件名
  3. 如遇报错,则根据报错信息手动修正SAE YAML文件内容,然后返回上一步迭代执行。报错通常分为以下情形:

    1. 某些K8s YAML支持的字段,在SAE YAML中不再支持或有特定格式要求,在转换后您需要手动删除或替换这些字段。SAE YAML中支持的字段和格式要求,详见本目录下其他文档。

    2. 某些SAE YAML必须的字段,在K8s YAML中缺失,在转换后会通过 ${参数名}的形式提示您补充该字段。例如,以下SAE YAML中您只需手动将其中${vpc-id}替换为实际值即可。本例中由于在SAE定义命名空间时需要关联VPC,而原来的K8s YAML文件中没有提供 ${vpc-id},因此需要手动补全。

      apiVersion: v1
      kind: Namespace
      metadata:
        annotations:
          sae.aliyun.com/vpc-id: ${vpc-id}
        creationTimestamp: null
        labels:
          kubernetes.io/metadata.name: default
        name: nstest
      spec: {}
      status: {}
重要

如果K8s YAML定义了多个资源,您可以将它们定义在同一个K8s YAML文件中,并使用K8s规定的分隔符---进行分隔,saectl支持将它们批量转换为SAE YAML文件。例如:

apiVersion: apps/v1
kind: Deployment
# ... Deployment Definition ...

---
apiVersion: v1
kind: ConfigMap
# ... ConfigMap Definition ...

但需要注意多个资源的创建不应依赖彼此间的执行顺序。

例如:同一个SAE YAML文件中同时定义了Deployment和依赖该DeploymentService,由于创建Service的前提是Deployment已成功创建,因此通过执行该SAE YAML来一并创建DeploymentService时会报错。

推荐的做法是:将DeploymentService分别在不同的SAE YAML文件中定义,先创建Deployment,待Deployment创建成功后,再创建Service。

示例 - 通过saectl部署Nginx

  1. 以下文件定义了在K8s部署Nginx所需的资源,包括DeploymentService。

    1. nginx-deployment.yaml

      apiVersion: apps/v1 
      kind: Deployment
      metadata:
        name: nginx
        labels:
          app: nginx
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image:  registry.cn-beijing.aliyuncs.com/sae-serverless-demo/sae-demo:nginx-v1.23.4
              ports:
              - containerPort: 80
              resources:
                requests:
                  cpu: "1"
                  memory: "2Gi"
      
    2. nginx-service.yaml

      apiVersion: v1
      kind: Service
      metadata:
        name: nginx
      spec:
        allocateLoadBalancerNodePorts: true
        ports:
        - port: 80
          protocol: TCP
        selector:
          app: nginx
        type: LoadBalancer
      
  2. K8s YAML文件转换为SAE YAML文件。

    saectl convert -f nginx-deployment.yaml -o output-nginx-deployment.yaml
    saectl convert -f nginx-service.yaml -o output-nginx-service.yaml
  3. 部署deployment,并检测deployment部署状态。

    saectl apply -f output-nginx-deployment.yaml
    saectl get deployment nginx # 根据返回结果判断deployment部署状态:
    # 如果STATE=PUBLISHING说明deployment正在部署,需要等待一段时间后再执行这条指令重新查看状态;
    # 如果STATE=RUNNING说明应用部署成功,可以继续执行后续指令。
  4. 创建service,查看访问service的公网IP和端口,并从公网访问service。

    saectl apply -f output-nginx-service.yaml
    saectl get service internet-nginx -o wide # 根据返回结果判断service部署状态:
    # 如果EXTERNAL-IP=<pending>说明service正在创建,需要等待一段时间后再执行这条指令重新查看状态;
    # 如果EXTERNAL-IP显示为一个IP地址,表示service创建成功,你可以通过这个公网IP地址和端口来访问service。
    curl http://<public-ip>:<port> # 验证service部署成功。也可以通过浏览器访问http://<public-ip>:<port>
  5. 清理资源,删除deploymentservice。

    saectl delete -f output-nginx-deployment.yaml # service会随deployment删除而删除。

docker-compose YAML转换为SAE YAML文件

docker compose部署的应用迁移到SAE部署,步骤如下:

  1. docker-compose YAML转换为K8s YAML

  2. K8s YAML转换为SAE YAML文件

管理命名空间

saectl工具支持创建、查看、删除命名空间,不支持更新命名空间。

创建命名空间

  1. 编写文件名为namespace.yaml的文件,示例文件的内容如下,其中包含命名空间的配置信息。

    apiVersion: v1
    kind: Namespace
    metadata:
      annotations:
        sae.aliyun.com/vpc-id: ${vpc-id} # 请将${vpc-id}替换为命名空间关联的VPC ID,格式为vpc-xxxxxxxxxxxxxxxxxxxxx
      name: ${namespace} # 请将${namespace}替换为命名空间名称
    spec: {}
  2. namespace.yaml文件所在路径执行以下命令,实现创建命名空间。

    saectl apply -f namespace.yaml

查看命名空间

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

saectl get ns

输出示例如下:

NAME        STATUS   REGION
default     Active   cn-beijing
testns      Active   cn-beijing

字段解释如下:

字段

说明

NAME

命名空间的名称,default 表示默认命名空间。

STATUS

命名空间的状态,Active 表示可用。

REGION

命名空间所在地域。

删除命名空间

执行以下命令,删除指定命名空间。

saectl delete ns ${namespace}
# ${namespace}为命名空间的名称

管理应用

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

创建应用

  1. 编写文件名为deployment.yaml的文件,示例文件的内容如下,其中包含应用的配置信息。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ${deployment-name} # 请将${deployment-name}替换为您的应用名称
    spec:
      replicas: 2 # 表示应用实例的数量
      selector:
        matchLabels:
          sae.aliyun.com/app-name: ${deployment-name} # 请将${deployment-name}替换为您的应用名称
      template:
        metadata:
          labels:
            sae.aliyun.com/app-name: ${deployment-name} # 请将${deployment-name}替换为您的应用名称
        spec:
          containers:
          - name: main # 建议将containers的名称固定设置为main,避免冲突。
            image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6 # 本例以部署nginx镜像为例
  2. deployment.yaml文件所在路径执行以下命令,实现在默认命名空间下创建应用。

    saectl apply -f deployment.yaml
  3. 执行以下命令,查看已创建的应用的信息。当输出结果中STATE值为RUNNING时,表示应用正在运行。

    saectl get deployment ${deployment-name}
    # ${deployment-name}为应用名称
  4. 执行以下命令,查看已创建的应用的实例信息。

    saectl get pods -l sae.aliyun.com/app-name=${deployment-name}
    # ${deployment-name}为应用名称

查看应用列表

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

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

输出示例如下:

NAME              READY   AVAILABLE   TYPE        STATE     LANGUAGE   AGE
test-yaml   	  3/3     3           Image   	  RUNNING   java       6d1h
sc-c              2/2     2           Image       RUNNING   java       13d
sc-b              2/2     2           Image       RUNNING   java       13d
sc-a              1/1     1           Image       RUNNING   java       13d

字段解释如下:

字段

说明

NAME

应用的名称。

READY

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

AVAILABLE

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

TYPE

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

STATE

应用的状态,Running表示应用正在运行。

LANGUAGE

应用的技术栈语言。

AGE

应用的存在时长。

查看应用详情

saectl工具支持使用getdescribe命令查看应用详情。

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

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

saectl get deployment ${deployment-name} -o yaml -n ${namespace}
# ${deployment-name}为应用名称
# ${namespace}为命名空间的名称,如果不通过-n参数指定命名空间,则默认使用default命名空间

通过describe命令查看应用详情

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

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

更新应用

saectl工具支持使用scaleeditapply命令更新应用。

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

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

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

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

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

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

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

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

saectl apply -f deployment.yaml

删除应用

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

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

管理负载均衡SLB

负载均衡SLB对应Kubernetesservice资源类型。saectl工具支持创建、查看、更新、解绑负载均衡SLB。

为应用创建新的负载均衡SLB

  1. 编写文件名为svc.yaml的文件,示例文件的内容如下,其中包含负载均衡SLB的配置信息。

    apiVersion: v1
    kind: Service
    metadata:
      name: internet-${deployment-name} # 请将${deployment-name}替换为您的应用名称
      # internet表示设置公网访问的SLB,如果需要设置私网访问的SLB,请将其替换为intranet
    spec:
      ports:
      - name: port-80
        port: 80 # 表示用户访问应用的端口,请根据实际需求替换
        protocol: TCP
        targetPort: 80 # 表示容器中对外提供服务的端口,请根据实际需求替换
      selector:
        sae.aliyun.com/app-name: ${deployment-name} # 请将${deployment-name}替换为您的应用名称
  2. svc.yaml文件所在路径执行以下命令,实现为应用创建新的负载均衡SLB。

    saectl apply -f svc.yaml

将应用绑定到已有的负载均衡SLB

  1. 编写文件名为svc.yaml的文件,示例文件的内容如下,其中包含负载均衡SLB的配置信息。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        sae.aliyun.com/loadbalancer-id: ${your-slb-id} # 请将${your-slb-id}替换为您的SLB ID
      name: internet-${deployment-name} # 请将${deployment-name}替换为您的应用名称
      # internet表示设置公网访问的SLB,如果需要设置私网访问的SLB,请将其替换为intranet
    spec:
      ports:
      - name: port-80
        port: 80 # 表示用户访问应用的端口,请根据实际需求替换
        protocol: TCP
        targetPort: 80 # 表示容器中对外提供服务的端口,请根据实际需求替换
      selector:
        sae.aliyun.com/app-name: ${deployment-name} # 请将${deployment-name}替换为您的应用名称
  2. svc.yaml文件所在路径执行以下命令,实现将应用绑定到已有的负载均衡SLB。

    saectl apply -f svc.yaml

查看负载均衡SLB列表

执行以下命令,查看已有的负载均衡SLB列表。

saectl get service -l sae.aliyun.com/app-name=${deployment-name} -n ${namespace}
# ${deployment-name}为应用的名称,如果不通过-l参数指定应用名称,则默认显示所有应用绑定的负载均衡SLB
# ${namespace}为命名空间的名称,如果不通过-n参数指定命名空间,则默认使用default命名空间

输出示例如下:

NAME               TYPE         EXTERNAL-IP    PORT(S)   BOUND     AGE
internet-myapp   LoadBalancer   xxx.x.xx.xx    80/TCP    myapp    6d20h
intranet-myapp   LoadBalancer   xx.xx.xxx.xx   80/TCP    myapp    4d1h

字段解释如下:

字段

说明

NAME

Service的名称,格式为${公网/私网类型}-${应用名称}

对于${公网/私网类型},internet表示公网类型,intranet表示私网类型。

TYPE

Service的类型,LoadBalancer表示负载均衡SLB。

EXTERNAL-IP

负载均衡SLBIP地址。

PORT(S)

负载均衡SLB的端口映射信息。

BOUND

负载均衡SLB绑定的应用名称。

AGE

Service的存在时长。

查看负载均衡SLB详情

执行以下命令,查看负载均衡SLB的配置信息。

saectl get service ${service-name} -n ${namespace} -o yaml
# ${service-name}为service名称
# ${namespace}为命名空间的名称,如果不通过-n参数指定命名空间,则默认使用default命名空间

更新负载均衡SLB

saectl工具支持使用editapply命令更新负载均衡SLB。

通过edit命令在线编辑负载均衡SLB配置信息

  1. 执行以下命令,将会以YAML文件的形式打开指定负载均衡SLB的配置信息。

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

通过apply命令实现按照YAML配置文件更新负载均衡SLB

修改已有的负载均衡SLB的配置文件svc.yaml。在配置文件所在路径执行以下命令,实现负载均衡SLB配置信息的变更。

saectl apply -f svc.yaml

解绑负载均衡SLB

执行以下命令,解绑指定的负载均衡SLB。

saectl delete service ${service-name} -n ${namespace}
# ${service-name}为service名称
# ${namespace}为命名空间的名称,如果不通过-n参数指定命名空间,则默认使用default命名空间

管理ConfigMap

saectl工具支持创建、查看、更新、删除ConfigMap。ConfigMap可以作为容器的环境变量被引用,或作为文件挂载到容器中。

创建ConfigMap

  1. 编写文件名为cm.yaml的文件,示例文件的内容如下,其中包含ConfigMap的配置信息。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: database-configmap # 表示ConfigMap的名称
      namespace: default # 表示ConfigMap所在的命名空间
    data: #表示ConfigMap中包含的键值对信息
      database: mysql
      database_uri: mysql://localhost:2309
  2. cm.yaml文件所在路径执行以下命令,实现在默认命名空间下创建名称为database-configmapConfigMap。

    saectl apply -f cm.yaml

查看地域下ConfigMap列表

执行以下命令,查看地域下已有的ConfigMap列表。

saectl get configmap -A

输出示例如下:

NAMESPACE   NAME            DATA   AGE
default     nacos           1      69d
test        test-config     2      10d

字段解释如下:

字段

说明

NAMESPACE

ConfigMap所在的命名空间。

NAME

ConfigMap的名称。

DATA

ConfigMap中数据条目数。

AGE

ConfigMap的存在时长。

查看命名空间下ConfigMap列表

执行以下命令,查看命名空间下已有的ConfigMap列表。

saectl get configmap -n ${namespace}
# ${namespace}为命名空间的名称,如果不通过-n参数指定命名空间,则默认使用default命名空间

查看ConfigMap具体配置

执行以下命令,查看指定ConfigMap的具体配置。

saectl get cm ${cm-name} -n ${namespace} -o yaml 
# ${cm-name}为ConfigMap的名称
# ${namespace}为命名空间的名称,如果不通过-n参数指定命名空间,则默认使用default命名空间

引用ConfigMap作为容器环境变量

以下示例文件展示了引用ConfigMap作为容器环境变量的方法。引用方式分为部分引用和全部引用,请根据您的需求进行选择。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-configmap
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      sae.aliyun.com/app-name: test-configmap
  template:
    metadata:
      creationTimestamp: null
      labels:
        sae.aliyun.com/app-name: test-configmap
    spec:
      containers:
      - args:
        - /home/admin/start.sh
        command:
        - /bin/bash
        env: ### 以下为部分引用的示例
        - name: database # 表示容器中的环境变量名
          valueFrom:
            configMapKeyRef: # 表示环境变量的值引用database-configmap中的database值
              key: database
              name: database-configmap
        envFrom: ### 以下为全部引用的示例
        - configMapRef: # 表示全部引用other-configmap中的键值对作为容器中的环境变量
            name: other-configmap
        name: main
        image: registry.cn-shenzhen.aliyuncs.com/sae-serverless-demo/sae-demo:microservice-java-provider-v1.0
        imagePullPolicy: Always
        resources:
          limits:
            cpu: "2"
            memory: 4Gi
          requests:
            cpu: "2"
            memory: 4Gi
      restartPolicy: Always
      terminationGracePeriodSeconds: 10

ConfigMap作为文件挂载到容器中

以下示例文件展示了将ConfigMap作为文件挂载到容器中的方法。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-configmap
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      sae.aliyun.com/app-name: test-configmap
  template:
    metadata:
      labels:
        sae.aliyun.com/app-name: test-configmap
    spec:
      containers:
      - args:
        - /home/admin/start.sh
        command:
        - /bin/bash
        name: main
        image: registry.cn-shenzhen.aliyuncs.com/sae-serverless-demo/sae-demo:microservice-java-provider-v1.0
        imagePullPolicy: Always
        resources:
          limits:
            cpu: "2"
            memory: 4Gi
          requests:
            cpu: "2"
            memory: 4Gi
        volumeMounts:
          - mountPath: /tmp/nacos # 表示ConfigMap文件的挂载路径
            name: my-volume # 表示挂载的volume名称为my-volume
      volumes: # 表示基于nacos-configmap声明my-volume
      - configMap:
          name: nacos-configmap
        name: my-volume
      restartPolicy: Always
      terminationGracePeriodSeconds: 10

更新ConfigMap

saectl工具支持使用editapply命令更新ConfigMap。

通过edit命令在线编辑ConfigMap

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

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

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

修改已有的ConfigMap的配置文件cm.yaml。在配置文件所在路径执行以下命令,实现ConfigMap配置信息的变更。

saectl apply -f cm.yaml

删除ConfigMap

执行以下命令,删除指定的ConfigMap。

saectl delete cm ${cm-name} -n ${namespace}
# ${cm-name}为ConfigMap名称
# ${namespace}为命名空间的名称,如果不通过-n参数指定命名空间,则默认使用default命名空间