华为云用户手册

  • Agent无法下载该如何处理? 首先确认电脑能正常访问互联网,然后在cmd窗口中执行命令,查看是否出现下图所示的Address。 nslookup sms-agent-2-0-cn-north-1.obs.cn-north-1.myhuaweicloud.com 如果没有出现IP,可以在hosts文件中增加一条如下的记录之后重新下载。 114.115.192.97 sms-agent-2-0-cn-north-1.obs.cn-north-1.myhuaweicloud.com windows中hosts文件在C:\Windows\System32\drivers\etc下,使用超级管理员权限打开才能编辑。linux中hosts文件在/etc目录下。 如果有解析出IP,查看hosts文件中是否有该域名的记录,有的话删除掉然后重新下载 如果尝试以上方法均无法下载,建议换一台电脑下载之后再上传到该服务器上。 父主题: Agent安装与启动
  • 源端能连接到华为云API Gateway 源端Agent依赖华为云部分服务:IAM、ECS、EVS、IMS、VPC、SMS、OBS、DNS,在迁移过程中要确保源端Agent能调用目的端服务器所在Region相关依赖服务的API。 IAM、SMS为global级服务,需连通iam.myhuaweicloud.com、sms.cn-north-4.myhuaweicloud.com。 ECS、EVS、IMS、VPC、DNS为Region级,需连通目的端服务器所在Region的Endpoint。具体服务的Endpoint请参见终端节点。 OBS既需要连通obs.cn-north-1.myhuaweicloud.com,也需要连通目的端服务器所在Region的Endpoint。 例如,目的端服务器在华南-广州时,对应的Endpoint如表1所示。 表1 SMS依赖服务或桶地址 服务或桶地址 Endpoint 说明 IAM iam.myhuaweicloud.com Global级 SMS sms.cn-north-4.myhuaweicloud.com OBS obs.cn-north-1.myhuaweicloud.com ECS ecs.cn-south-1.myhuaweicloud.com Region级服务 EVS evs.cn-south-1.myhuaweicloud.com VPC vpc.cn-south-1.myhuaweicloud.com IMS ims.cn-south-1.myhuaweicloud.com OBS obs.cn-south-1.myhuaweicloud.com DNS dns.cn-south-1.myhuaweicloud.com agent.bucket.endpoint sms-agent-2-0-cn-north-1.obs.cn-north-1.myhuaweicloud.com SMS-Agent需要访问的桶地址 agent.conf.bucket.endpoint sms-agent-config-inter.obs.cn-north-1.myhuaweicloud.com agent.bucket.endpoint与agent.conf.bucket.endpoint保持默认(sms-agent-2-0-cn-north-1.obs.cn-north-1.myhuaweicloud.com、sms-agent-config-inter.obs.cn-north-1.myhuaweicloud.com),其他依赖服务的URL根据目的端服务器所在Region确定。 SMS会使用bbs.huaweicloud.com、 support.huaweicloud.com 和console.huaweicloud.com等域名,用于提供迁移服务和咨询服务。 当源端没有配置DNS服务器地址时,需要在本地DNS配置文件中 (Windows C:\Windows\System32\drivers\etc\hosts;Linux /etc/hosts) 配置URL对应的IP,保证URL能被正常解析。 各服务URL对应的IP地址可以通过ping url 获得,如图2所示。 图2 开放IP地址
  • 定位流程 查看工作负载Pod是否处于异常状态步骤如下: 登录CCE控制台。 单击集群名称进入集群,在左侧选择“工作负载”。 在页面左上角选择命名空间,找到对应的工作负载,查看其状态。 如果工作负载状态为“未就绪”,可通过查看Pod的事件等信息确定异常原因,详情请参见Pod事件查看方法。 如果工作负载状态为“处理中”,一般为过程中的状态,请耐心等待。 如果工作负载状态为“运行中”,一般无需处理。如果出现状态正常但无法访问的情况,则需要进一步排查集群内访问是否正常。 您可以在CCE控制台界面或者使用kubectl命令查找pod的IP,然后登录到集群内的节点或容器中,使用curl命令等方法手动调用接口,查看结果是否符合预期。 如果容器IP+端口不能访问,建议登录到业务容器内使用“127.0.0.1+端口”进行排查。
  • Pod事件查看方法 方式一 在CCE控制台中单击工作负载名称,前往“工作负载详情”页面,找到处于异常状态的实例,单击操作栏中的“事件”进行查看。 图1 查看Pod事件 方式二 Pod的事件可以使用kubectl describe pod {pod-name}命令查看, $ kubectl describe pod prepare-58bd7bdf9-fthrp ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 49s default-scheduler 0/2 nodes are available: 2 Insufficient cpu. Warning FailedScheduling 49s default-scheduler 0/2 nodes are available: 2 Insufficient cpu. 表1 排查思路列表 事件信息 实例状态 处理措施 实例调度失败 Pending 请参考工作负载异常:实例调度失败 拉取镜像失败 重新拉取镜像失败 FailedPullImage ImagePullBackOff 请参考工作负载异常:实例拉取镜像失败 启动容器失败 重新启动容器失败 CreateContainerError CrashLoopBackOff 请参考工作负载异常:启动容器失败 实例状态为“Evicted”,pod不断被驱逐 Evicted 请参考工作负载异常:实例驱逐异常(Evicted) 实例挂卷失败 Pending 请参考工作负载异常:存储卷无法挂载或挂载超时 实例状态一直为“创建中” Creating 请参考工作负载异常:一直处于创建中 实例状态一直为“结束中” Terminating 请参考工作负载异常:结束中,解决Terminating状态的Pod删不掉的问题 实例状态为“已停止” Stopped 请参考工作负载异常:已停止
  • 问题原因 当Service设置了服务亲和为节点级别,即externalTrafficPolicy取值为Local时,在使用中可能会碰到从集群内部(节点上或容器中)访问不通的情况,回显类似如下内容: upstream connect error or disconnect/reset before headers. reset reason: connection failure 或: curl: (7) Failed to connect to 192.168.10.36 port 900: Connection refused 在集群中访问ELB地址时出现无法访问的场景较为常见,这是由于Kubernetes在创建Service时,kube-proxy会把ELB的访问地址作为外部IP(即External-IP,如下方回显所示)添加到iptables或IPVS中。如果客户端从集群内部发起访问ELB地址的请求,该地址会被认为是服务的外部IP,被kube-proxy直接转发,而不再经过集群外部的ELB。 当externalTrafficPolicy的取值为Local时,在不同容器网络模型和服务转发模式下访问不通的场景如下: 多实例的工作负载需要保证所有实例均可正常访问,否则可能出现概率性访问不通的情况。 CCE Turbo集群(云原生2.0网络模型)中,仅当Service的后端对接使用主机网络(HostNetwork)的Pod时,亲和级别支持配置为节点级别。 表格中仅列举了可能存在访问不通的场景,其他不在表格中的场景即表示可以正常访问。 服务端发布服务类型 访问类型 客户端请求发起位置 容器隧道集群(IPVS) VPC集群(IPVS) 容器隧道集群(IPTABLES) VPC集群(IPTABLES) 节点访问类型Service 公网/私网 与服务Pod同节点 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 与服务Pod不同节点 访问服务端所在节点IP+NodePort — 通 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 通 访问非服务端所在节点IP+NodePort — 无法访问 正常访问 正常访问 与服务Pod同节点的其他容器 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 无法访问 与服务Pod不同节点的其他容器 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 独享型负载均衡类型Service 私网 与服务Pod同节点 无法访问 无法访问 无法访问 无法访问 与服务Pod同节点的其他容器 无法访问 无法访问 无法访问 无法访问 DNAT网关类型Service 公网 与服务Pod同节点 无法访问 无法访问 无法访问 无法访问 与服务Pod不同节点 无法访问 无法访问 无法访问 无法访问 与服务Pod同节点的其他容器 无法访问 无法访问 无法访问 无法访问 与服务Pod不同节点的其他容器 无法访问 无法访问 无法访问 无法访问 nginx-ingress插件对接独享型ELB(Local) 私网 与cceaddon-nginx-ingress-controller Pod同节点 无法访问 无法访问 无法访问 无法访问 与cceaddon-nginx-ingress-controller Pod同节点的其他容器 无法访问 无法访问 无法访问 无法访问
  • 解决办法 解决这个问题通常有如下办法: (推荐)在集群内部访问使用Service的ClusterIP或服务域名访问。 将Service的externalTrafficPolicy设置为Cluster,即集群级别服务亲和。不过需要注意这会影响源地址保持。 apiVersion: v1 kind: Service metadata: annotations: kubernetes.io/elb.class: union kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth","bandwidth_chargemode":"traffic","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}' labels: app: nginx name: nginx spec: externalTrafficPolicy: Cluster ports: - name: service0 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer 使用Service的pass-through特性,使用ELB地址访问时绕过kube-proxy,先访问ELB,经过ELB再访问到负载。 独享型负载均衡配置pass-through后,CCE Standard集群在工作负载同节点和同节点容器内无法通过Service访问。 1.15及以下老版本集群暂不支持该能力。 IPVS网络模式下,对接同一个ELB的Service需保持pass-through设置情况一致。 使用节点级别(Local)的服务亲和的场景下,会自动设置kubernetes.io/elb.pass-through为onlyLocal,开启pass-through能力。 apiVersion: v1 kind: Service metadata: annotations: kubernetes.io/elb.pass-through: "true" kubernetes.io/elb.class: union kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth","bandwidth_chargemode":"traffic","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}' labels: app: nginx name: nginx spec: externalTrafficPolicy: Local ports: - name: service0 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer
  • 在Pod中使用PVC 有了PVC后,在Pod中使用持久化存储就非常方便了,在Pod Template中的Volume直接关联PVC的名称,然后挂载到容器之中即可,如下所示。甚至在StatefulSet中还可以直接声明PVC,详情请参见有状态负载(StatefulSet)。 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - image: nginx:alpine name: container-0 volumeMounts: - mountPath: /tmp # 挂载路径 name: pvc-sfs-example restartPolicy: Always volumes: - name: pvc-sfs-example persistentVolumeClaim: claimName: pvc-example # PVC的名称
  • StorageClass 上节说的PV和PVC方法虽然能实现屏蔽底层存储,但是PV创建比较复杂(可以看到PV中csi字段的配置很麻烦),通常都是由集群管理员管理,这非常不方便。 Kubernetes解决这个问题的方法是提供动态配置PV的方法,可以自动创PV。管理员可以部署PV配置器(provisioner),然后定义对应的StorageClass,这样开发者在创建PVC的时候就可以选择需要创建存储的类型,PVC会把StorageClass传递给PV provisioner,由provisioner自动创建PV。如CCE就提供csi-disk、csi-nas、csi-obs等StorageClass,在声明PVC时加上StorageClassName,就可以自动创建PV,并自动创建底层的存储资源。 执行如下命令即可查询CCE提供的默认StorageClass。您可以使用CCE提供的CSI插件自定义创建StorageClass,但从功能角度与CCE提供的默认StorageClass并无区别,这里不做过多描述。 # kubectl get sc NAME PROVISIONER AGE csi-disk everest-csi-provisioner 17d # 云硬盘 StorageClass csi-disk-topology everest-csi-provisioner 17d # 延迟绑定的云硬盘 StorageClass csi-nas everest-csi-provisioner 17d # 文件存储 StorageClass csi-obs everest-csi-provisioner 17d # 对象存储 StorageClass csi-sfsturbo everest-csi-provisioner 17d # 极速文件存储 StorageClass 使用StorageClass创建PVC。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-sfs-auto-example spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: csi-nas # StorageClass 当前不支持使用csi-sfsturbo类型StorageClass直接创建PVC。如需使用SFS Turbo类型的存储,请提前创建SFS Turbo实例并通过静态存储卷的方式创建PV和PVC,详情请参见通过静态存储卷使用已有极速文件存储。 创建PVC并查看PVC和PV。 $ kubectl create -f pvc2.yaml persistentvolumeclaim/pvc-sfs-auto-example created $ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-sfs-auto-example Bound pvc-1f1c1812-f85f-41a6-a3b4-785d21063ff3 10Gi RWX csi-nas 29s $ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-1f1c1812-f85f-41a6-a3b4-785d21063ff3 10Gi RWO Delete Bound default/pvc-sfs-auto-example csi-nas 20s 这可以看到使用StorageClass后,不仅创建了PVC,而且创建了PV,并且将二者绑定了。 定义了StorageClass后,就可以减少创建并维护PV的工作,PV变成了自动创建,作为使用者,只需要在声明PVC时指定StorageClassName即可,这就大大减少工作量。 再次说明,StorageClassName的类型在不同厂商的产品上各不相同,这里只是使用了文件存储作为示例。
  • CSI Kubernetes提供了CSI接口(Container Storage Interface,容器存储接口),基于CSI这套接口,可以开发定制出CSI插件,从而支持特定的存储,达到解耦的目的。例如在Namespace:资源分组中看到的kube-system命名空间下everest-csi-controller和everest-csi-driver就是CCE开发存储控制器和驱动。有了这些驱动就可以使用EVS、SFS、OBS存储。 $ kubectl get po --namespace=kube-system NAME READY STATUS RESTARTS AGE everest-csi-controller-6d796fb9c5-v22df 2/2 Running 0 9m11s everest-csi-driver-snzrr 1/1 Running 0 12m everest-csi-driver-ttj28 1/1 Running 0 12m everest-csi-driver-wtrk6 1/1 Running 0 12m
  • PV 来看一下PV是如何描述持久化存储,例如在SFS中创建了一个文件存储,这个文件存储ID为68e4a4fd-d759-444b-8265-20dc66c8c502,挂载地址为sfs-nas01.cn-north-4b.myhuaweicloud.com:/share-96314776。如果想在CCE中使用这个文件存储,则需要先创建一个PV来描述这个存储,如下所示。 apiVersion: v1 kind: PersistentVolume metadata: name: pv-example spec: accessModes: - ReadWriteMany # 读写模式 capacity: storage: 10Gi # 定义PV的大小 csi: driver: nas.csi.everest.io # 声明使用的驱动 fsType: nfs # 存储类型 volumeAttributes: everest.io/share-export-location: sfs-nas01.cn-north-4b.myhuaweicloud.com:/share-96314776 # 挂载地址 volumeHandle: 68e4a4fd-d759-444b-8265-20dc66c8c502 # 存储ID 这里csi下面的内容就是CCE中特定的字段,在其他地方无法使用。 下面创建这个PV并查看。 $ kubectl create -f pv.yaml persistentvolume/pv-example created $ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv-example 10Gi RWX Retain Available 4s RECLAIM POLICY是指PV的回收策略,Retain表示PVC被释放后PV继续保留。STATUS值为Available,表示PV处于可用的状态。
  • PVC PVC可以绑定一个PV,示例如下。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-example spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi # 声明存储的大小 volumeName: pv-example # PV的名称 创建PVC并查看。 $ kubectl create -f pvc.yaml persistentvolumeclaim/pvc-example created $ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-example Bound pv-example 10Gi RWX 9s 这里可以看到状态是Bound,VOLUME是pv-example,表示PVC已经绑定了PV。 再来看下PV。 $ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv-example 10Gi RWX Retain Bound default/pvc-example 50s 可以看到状态也变成了Bound,CLAIM是default/pvc-example,表示这个PV绑定了default命名空间下的pvc-example这个PVC。 这里一个比较有意思的地方是CLAIM是default/pvc-example,为什么要显示default呢,这是因为PV是集群级别的资源,并不属于某个命名空间,而PVC是命名空间级别的资源,PV可以与任何命名空间的PVC资源绑定。 图2 PV与PVC
  • 指定默认StorageClass 您还可以指定某个StorageClass作为默认StorageClass,这样在创建PVC时不指定StorageClassName就会使用默认StorageClass创建。 例如将csi-disk-ssd指定为默认StorageClass,则可以按如下方式设置。 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-disk-ssd annotations: storageclass.kubernetes.io/is-default-class: "true" # 指定集群中默认的StorageClass,一个集群中只能有一个默认的StorageClass parameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SSD everest.io/passthrough: "true" provisioner: everest-csi-provisioner reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true 先删除之前创建的csi-disk-ssd,再使用kubectl create命令重新创建,然后再查询StorageClass,显示如下。 # kubectl delete sc csi-disk-ssd storageclass.storage.k8s.io "csi-disk-ssd" deleted # kubectl create -f ssd.yaml storageclass.storage.k8s.io/csi-disk-ssd created # kubectl get sc NAME PROVISIONER AGE csi-disk everest-csi-provisioner 17d csi-disk-sas everest-csi-provisioner 114m csi-disk-ssd (default) everest-csi-provisioner 9s csi-disk-topology everest-csi-provisioner 17d csi-nas everest-csi-provisioner 17d csi-obs everest-csi-provisioner 17d csi-sfsturbo everest-csi-provisioner 17d
  • 配置验证 使用csi-disk-sas创建PVC。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: sas-disk spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: csi-disk-sas 创建并查看详情,如下所示,可以发现能够创建,且StorageClass显示为csi-disk-sas # kubectl create -f sas-disk.yaml persistentvolumeclaim/sas-disk created # kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE sas-disk Bound pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO csi-disk-sas 24s # kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO Delete Bound default/sas-disk csi-disk-sas 30s 在CCE控制台界面上查看PVC详情,在“PV详情”页签下可以看到磁盘类型是高I/O。 不指定StorageClassName,使用默认配置,如下所示,并未指定storageClassName。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ssd-disk spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi 创建并查看,可以看到PVC ssd-disk的StorageClass为csi-disk-ssd,说明默认使用了csi-disk-ssd。 # kubectl create -f ssd-disk.yaml persistentvolumeclaim/ssd-disk created # kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE sas-disk Bound pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO csi-disk-sas 16m ssd-disk Bound pvc-4d2b059c-0d6c-44af-9994-f74d01c78731 10Gi RWO csi-disk-ssd 10s # kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-4d2b059c-0d6c-44af-9994-f74d01c78731 10Gi RWO Delete Bound default/ssd-disk csi-disk-ssd 15s pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO Delete Bound default/sas-disk csi-disk-sas 17m 在CCE控制台界面上查看PVC详情,在“PV详情”页签下可以看到磁盘类型是超高I/O。
  • 解决方案 本文介绍在CCE中自定义StorageClass的方法,并介绍设置默认StorageClass的方法,通过不同StorageClassName指定不同类型存储。 对于第一个问题:可以将SAS、SSD类型云硬盘分别定义一个StorageClass,比如定义一个名为csi-disk-sas的StorageClass,这个StorageClass创建SAS类型的存储,则前后使用的差异如下图所示,编写YAML时只需要指定StorageClassName,符合特定用户的使用习惯。 对于第二个问题:可以定义与用户现有YAML中相同名称的StorageClass,这样可以省去修改YAML中StorageClassName的工作。 对于第三个问题:可以设置默认的StorageClass,则YAML中无需指定StorageClassName也能创建存储,按如下写法即可。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-evs-example namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi
  • CCE默认存储类 目前CCE默认提供csi-disk、csi-nas、csi-obs等StorageClass,在声明PVC时使用对应StorageClassName,就可以自动创建对应类型PV,并自动创建底层的存储资源。 执行如下kubectl命令即可查询CCE提供的默认StorageClass。您可以使用CCE提供的CSI插件自定义创建StorageClass。 # kubectl get sc NAME PROVISIONER AGE csi-disk everest-csi-provisioner 17d # 云硬盘 csi-disk-topology everest-csi-provisioner 17d # 延迟创建的云硬盘 csi-nas everest-csi-provisioner 17d # 文件存储 1.0 csi-sfs everest-csi-provisioner 17d # 文件存储 3.0 csi-obs everest-csi-provisioner 17d # 对象存储 csi-sfsturbo everest-csi-provisioner 17d # 极速文件存储 csi-local everest-csi-provisioner 17d # 本地持久卷 csi-local-topology everest-csi-provisioner 17d # 延迟创建的本地持久卷 每个StorageClass都包含了动态制备PersistentVolume时会使用到的默认参数。如以下云硬盘存储类的示例: kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: csi-disk provisioner: everest-csi-provisioner parameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SAS everest.io/passthrough: 'true' reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: Immediate 表1 关键参数说明 参数 描述 provisioner 存储资源提供商,CCE均由everest插件提供,此处只能填写everest-csi-provisioner。 parameters 存储参数,不同类型的存储支持的参数不同。详情请参见表2。 reclaimPolicy 用来指定创建PV的persistentVolumeReclaimPolicy字段值,支持Delete和Retain。如果StorageClass 对象被创建时没有指定reclaimPolicy,它将默认为Delete。 Delete:表示动态创建的PV,在销毁的时候也会自动销毁。 Retain:表示动态创建的PV,不会自动销毁。 allowVolumeExpansion 定义由此存储类创建的PV是否支持动态扩容,默认为false。是否能动态扩容是由底层存储插件来实现的,这里只是一个开关。 volumeBindingMode 表示卷绑定模式,即动态创建PV的时间,分为立即创建和延迟创建。 Immediate:创建PVC时完成PV绑定和动态创建。 WaitForFirstConsumer:延迟PV的绑定和创建,当在工作负载中使用该PVC时才执行PV创建和绑定流程。 mountOptions 该字段需要底层存储支持,如果不支持挂载选项,却指定了挂载选项,会导致创建PV操作失败。 表2 parameters参数说明 存储类型 参数 是否必选 描述 云硬盘 csi.storage.k8s.io/csi-driver-name 是 驱动类型,使用云硬盘类型时,参数取值固定为“disk.csi.everest.io”。 csi.storage.k8s.io/fstype 是 使用云硬盘时,支持的参数值为“ext4”。 everest.io/disk-volume-type 是 云硬盘类型,全大写。 SAS:高I/O SSD:超高I/O GPSSD:通用型SSD ESSD:极速型SSD everest.io/passthrough 是 参数取值固定为“true”,表示云硬盘的设备类型为SCSI类型。不允许设置为其他值。 文件存储 csi.storage.k8s.io/csi-driver-name 是 驱动类型,使用文件存储类型时,参数取值固定为“nas.csi.everest.io”。 csi.storage.k8s.io/fstype 是 使用文件存储时,支持的参数值为“nfs”。 everest.io/share-access-level 是 参数取值固定为“rw”,表示文件存储可读写。 everest.io/share-access-to 是 集群所在VPC ID。 everest.io/share-is-public 否 参数取值固定为“false”,表示文件共享为私人可见。 使用SFS 3.0时无需填写。 everest.io/sfs-version 否 仅使用SFS 3.0时需要填写,固定值为“sfs3.0”。 极速文件存储 csi.storage.k8s.io/csi-driver-name 是 驱动类型,使用极速文件存储类型时,参数取值固定为“sfsturbo.csi.everest.io”。 csi.storage.k8s.io/fstype 是 使用极速文件存储时,支持的参数值为“nfs”。 everest.io/share-access-to 是 集群所在VPC ID。 everest.io/share-expand-type 否 扩展类型,默认值为“bandwidth”,表示增强型的文件系统。该字段不起作用。 everest.io/share-source 是 参数取值固定为“sfs-turbo”。 everest.io/share-volume-type 否 极速文件存储类型,默认值为“STANDARD”,表示标准型和标准型增强版。该字段不起作用。 对象存储 csi.storage.k8s.io/csi-driver-name 是 驱动类型,使用对象存储类型时,参数取值固定为“obs.csi.everest.io”。 csi.storage.k8s.io/fstype 是 实例类型,支持的参数值为“s3fs”和“obsfs”。 obsfs:并行文件系统,配套使用obsfs挂载,推荐使用。 s3fs:对象桶,配套使用s3fs挂载。 everest.io/obs-volume-type 是 对象存储类型。 fsType设置为s3fs时,支持STANDARD(标准桶)、WARM(低频访问桶)。 fsType设置为obsfs时,该字段不起作用。
  • 自定义StorageClass 自定义高I/O类型StorageClass,使用YAML描述如下,这里取名为csi-disk-sas,指定云硬盘类型为SAS,即高I/O。 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-disk-sas # 高IO StorageClass名字,用户可自定义 parameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SAS # 云硬盘高I/O类型,用户不可自定义 everest.io/passthrough: "true" provisioner: everest-csi-provisioner reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true # true表示允许扩容 超高I/O类型StorageClass,这里取名为csi-disk-ssd,指定云硬盘类型为SSD,即超高I/O。 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-disk-ssd # 超高I/O StorageClass名字,用户可自定义 parameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SSD # 云硬盘超高I/O类型,用户不可自定义 everest.io/passthrough: "true" provisioner: everest-csi-provisioner reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true reclaimPolicy:底层云存储的回收策略,支持Delete、Retain回收策略。 Delete:删除PVC,PV资源与云硬盘均被删除。 Retain:删除PVC,PV资源与底层存储资源均不会被删除,需要手动删除回收。PVC删除后PV资源状态为“已释放(Released)”,不能直接再次被PVC绑定使用。 此处设置的回收策略对SFS Turbo类型的存储无影响,因此删除集群或删除PVC时不会回收包周期的SFS Turbo资源。 如果数据安全性要求较高,建议使用Retain以免误删数据。 定义完之后,使用kubectl create命令创建。 # kubectl create -f sas.yaml storageclass.storage.k8s.io/csi-disk-sas created # kubectl create -f ssd.yaml storageclass.storage.k8s.io/csi-disk-ssd created 再次查询StorageClass,回显如下,可以看到多了两个类型的StorageClass。 # kubectl get sc NAME PROVISIONER AGE csi-disk everest-csi-provisioner 17d csi-disk-sas everest-csi-provisioner 2m28s csi-disk-ssd everest-csi-provisioner 16s csi-disk-topology everest-csi-provisioner 17d csi-nas everest-csi-provisioner 17d csi-obs everest-csi-provisioner 17d csi-sfsturbo everest-csi-provisioner 17d 其他类型存储自定义方法类似,可以使用 kubectl 获取YAML,在YAML基础上根据需要修改。 文件存储 # kubectl get sc csi-nas -oyaml kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: csi-nas provisioner: everest-csi-provisioner parameters: csi.storage.k8s.io/csi-driver-name: nas.csi.everest.io csi.storage.k8s.io/fstype: nfs everest.io/share-access-level: rw everest.io/share-access-to: 5e3864c6-e78d-4d00-b6fd-de09d432c632 # 集群所在VPC ID everest.io/share-is-public: 'false' everest.io/zone: xxxxx # 可用区 reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: Immediate 对象存储 # kubectl get sc csi-obs -oyaml kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: csi-obs provisioner: everest-csi-provisioner parameters: csi.storage.k8s.io/csi-driver-name: obs.csi.everest.io csi.storage.k8s.io/fstype: s3fs # 对象存储文件类型,s3fs是对象桶,obsfs是并行文件系统 everest.io/obs-volume-type: STANDARD # OBS桶的存储类别 reclaimPolicy: Delete volumeBindingMode: Immediate
  • 指定StorageClass的企业项目 CCE支持使用存储类创建云硬盘和对象存储类型PVC时指定企业项目,将创建的存储资源(云硬盘和对象存储)归属于指定的企业项目下,企业项目可选为集群所属的企业项目或default企业项目。 若不指定企业项目,则创建的存储资源默认使用存储类StorageClass中指定的企业项目,CCE提供的 csi-disk 和 csi-obs 存储类,所创建的存储资源属于default企业项目。 如果您希望通过StorageClass创建的存储资源能与集群在同一个企业项目,则可以自定义StorageClass,并指定企业项目ID,如下所示。 该功能需要everest插件升级到1.2.33及以上版本。 kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: csi-disk-epid # 自定义名称 provisioner: everest-csi-provisioner parameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SAS everest.io/enterprise-project-id: 86bfc701-9d9e-4871-a318-6385aa368183 # 指定企业项目id everest.io/passthrough: 'true' reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: Immediate
  • 应用现状 CCE中使用存储时,最常见的方法是创建PVC时通过指定StorageClassName定义要创建存储的类型,如下所示,使用PVC申请一个SAS(高I/O)类型云硬盘/块存储。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-evs-example namespace: default annotations: everest.io/disk-volume-type: SAS spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: csi-disk 可以看到在CCE中如果需要指定云硬盘的类型,是通过everest.io/disk-volume-type: SAS字段指定,这里SAS是云硬盘的类型,代表高I/O,还有SSD(超高I/O)可以指定。 这种写法在如下几种场景下存在问题: 部分用户觉得使用everest.io/disk-volume-type指定云硬盘类型比较繁琐,希望只通过StorageClassName指定。 部分用户是从自建Kubernetes或其他Kubernetes服务切换到CCE,已经写了很多应用的YAML文件,这些YAML文件中通过不同StorageClassName指定不同类型存储,迁移到CCE上时,使用存储就需要修改大量YAML文件或Helm Chart包,这非常繁琐且容易出错。 部分用户希望能够设置默认的StorageClassName,所有应用都使用默认存储类型,在YAML中不用指定StorageClassName也能按创建默认类型存储。
  • 应用现状 随着容器化技术的发展,越来越多的企业使用容器代替了虚拟机完成应用的运行部署。目前许多企业选择自建Kubernetes集群,但是自建集群往往有着沉重的运维负担,需要运维人员自己配置管理系统和监控解决方案。企业自运维大批镜像资源,意味着要付出高昂的运维、人力、管理成本,且效率不高。 容器镜像服务支持Linux、ARM等多架构容器镜像托管。企业可以将镜像仓库迁移到容器镜像服务,节省运维成本。 如何把已有的镜像仓库平滑地迁移到容器镜像服务?这里将介绍3种常见的方案,用户可以根据自己的实际使用场景来选择。
  • 迁移方案 表1 迁移方案及适用场景对比 方案类型 适用场景 注意事项 使用docker命令迁移镜像至SWR 待迁移的镜像数量较少 依赖磁盘存储,需要及时进行本地镜像的清理,而且落盘形成多余的时间开销,难以胜任生产场景中大量镜像的迁移。 依赖docker程序,docker daemon对pull/push的并发数进行了严格的限制,没法进行高并发同步。 一些功能只能经过HTTP api进行操作,单纯使用docker cli 没法做到,使脚本变得复杂。 使用image-syncer迁移镜像至SWR 待迁移的镜像数量庞大 支持多对多镜像仓库同步。 支持基于Docker Registry V2搭建的docker镜像仓库服务 (如Docker Hub、Quay、Harbor等)。 同步只通过内存和网络,不依赖磁盘存储,同步速度快。 增量同步, 经过对同步过的镜像blob信息落盘,不重复同步已同步的镜像。 并发同步,能够经过配置文件调整并发数。 自动重试失败的同步任务,能够解决大部分镜像同步中的网络抖动问题。 不依赖 docker 以及其余程序。 跨云harbor同步镜像至华为云SWR 部分客户存在多云场景,并且使用某一家云上的自建Harbor作为镜像仓库 仅支持 Harbor V1.10.5 及以上版本
  • 响应示例 状态码: 200 返回信息。 { "resolve_details" : [ { "resolve_id" : "29ae28ea-0300-4da1-8e54-6c91319fcccc", "task_id" : "bf04fc77-12c8-408f-a584-cf3d3e91cccc", "task_name" : "ZF2", "send_account" : "myaccount", "tpl_id" : "600000001", "tpl_name" : "【测试】参数通知模板", "cust_flag" : "131****0000", "aim_url" : "km2g.cn/MzNkNP", "result_code" : "0", "generate_date" : "2022-07-19T08:44:04Z", "expire_date" : "2022-07-26T08:44:04Z", "resolved_time" : "2022-07-19T08:44:31Z", "resolved_status" : "success" } ], "page_info" : { "offset" : 0, "limit" : 1, "total" : 18 } }
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 resolve_details Array of AIMResolveDetail objects 查询解析结果集。 page_info Page object 分页信息。 表4 AIMResolveDetail 参数 参数类型 描述 resolve_id String 解析详情唯一标识ID。 task_id String 任务ID。 task_name String 任务名称。 send_account String 发送的用户名。 tpl_id String 智能信息模板ID。 tpl_name String 智能信息模板名称。 cust_flag String 创建解析任务时填写用户唯一标识,手机号码或者任何的唯一标识,唯一标识不超过64个字符。发送智能信息时则必须填客户的手机号码。此处为手机号。样例为:130****0001。 aim_url String 智能信息短链,通过自己的短信渠道发送时,需要把该短链添加到短信模板中,并确保发送短信时的签名与创建短链时的签名保持一致。 result_code String 短链申请结果返回码。 0:成功 非0:失败,具体请参见错误码。 generate_date String 短链生成时间。样例为:2019-10-12T07:20:50Z。 expire_date String 短链到期时间。样例为:2019-10-12T07:20:50Z。 resolved_time String 解析时间。样例为:2019-10-12T07:20:50Z。 resolved_status String 解析状态。 success:解析成功 fail:解析失败 unresolved:未解析 表5 Page 参数 参数类型 描述 offset Integer 偏移量,表示从此偏移量开始查询,offset大于等于0。 limit Integer 每页显示的条目数量。 total Integer 总条数。 状态码: 400 表6 响应Body参数 参数 参数类型 描述 error_code String 结果状态码。 error_msg String 结果详情。 error_message Object 结果详情。 说明: 该字段在以后可能会废弃,建议使用error_msg字段对接。 状态码: 500 表7 响应Body参数 参数 参数类型 描述 error_code String 结果状态码。 error_msg String 结果详情。 error_message Object 结果详情。 说明: 该字段在以后可能会废弃,建议使用error_msg字段对接。
  • URI GET /v1/aim/resolve-details 表1 Query参数 参数 是否必选 参数类型 描述 task_id 否 String 解析任务ID或者发送任务ID。 最小长度:0 最大长度:36 task_name 否 String 任务名称。 最小长度:0 最大长度:30 tpl_id 否 String 智能信息模板ID。 最小长度:0 最大长度:9 tpl_name 否 String 智能信息模板名称。 cust_flag 否 String 创建解析任务时填写用户唯一标识,手机号码或者任何的唯一标识,唯一标识不超过64个字符。发送智能信息时则必须填客户的手机号码。此处为手机号。样例为:130****0001。 最小长度:0 最大长度:64 sms_sign 否 String 签名。 最小长度:0 最大长度:18 aim_url 否 String 智能信息短链,通过自己的短信渠道发送时,需要把该短链添加到短信模板中,并确保发送短信时的签名与创建短链时的签名保持一致。 最小长度:0 最大长度:100 resolved_status 否 String 解析状态。 success:解析成功 fail:解析失败 unresolved:未解析 begin_time 否 String 短链创建开始时间。格式为:2019-10-12T07:20:50Z。 说明: 需同时传入end_time才能生效,单独传begin_time不会作为过滤条件。缺省:查询最近二十四小时数据。 仅支持查询最近1年内创建的短链。 最小长度:0 最大长度:30 end_time 否 String 短链创建结束时间。格式为:2019-10-12T07:20:50Z。 说明: 需同时传入begin_time才能生效,单独传end_time不会作为过滤条件。缺省:查询最近二十四小时数据。 最小长度:0 最大长度:30 offset 是 Integer 偏移量,表示从此偏移量开始查询,offset大于等于0。 说明: 为提高查询效率,offset+limit须小于等于10000,超出范围查询为空。 最小值:0 最大值:1000000 limit 是 Integer 每页显示的条目数量。 最小值:1 最大值:100
  • URI GET /v1/aim/resolve-tasks 表1 Query参数 参数 是否必选 参数类型 描述 task_id 否 String 解析任务ID。 最小长度:0 最大长度:36 task_name 否 String 任务名称。 最小长度:0 最大长度:30 tpl_id 否 String 智能信息模板ID。 最小长度:0 最大长度:9 tpl_name 否 String 智能信息模板名称。 最小长度:0 最大长度:100 cust_flag 否 String 创建解析任务时填写用户唯一标识,手机号码或者任何的唯一标识,唯一标识不超过64个字符。 发送智能信息时则必须填客户的手机号码。样例为:130****0001。 最小长度:0 最大长度:100 aim_url 否 String 完整的短链连接地址。样例:km2g.cn/PDiWqc。 begin_time 否 String 智能信息解析任务创建开始时间。格式为:2019-10-12T07:20:50.522Z。 说明: 需同时传入end_time才能生效,单独传begin_time不会作为过滤条件。 若不填,则默认查询24小时内创建的解析任务。 仅支持查询最近1年内创建的解析任务。 最小长度:0 最大长度:30 end_time 否 String 智能信息解析任务创建结束时间。格式为:2019-10-12T07:20:50.522Z。 说明: 需同时传入begin_time才能生效,单独传end_time不会作为过滤条件。 若不填,则默认查询24小时内创建的解析任务。 offset 否 Integer 偏移量,表示从此偏移量开始查询,offset大于等于0。 说明: 为提高查询效率,offset+limit须小于等于10000,超出范围查询为空。 最小值:0 最大值:1000000 缺省值:0 limit 否 Integer 每页显示的条目数量。 最小值:1 最大值:100 缺省值:20
  • 响应示例 状态码: 200 返回信息。 { "resolve_tasks" : [ { "task_id" : "30d6db9b-cc8a-4dc9-a314-d80d3fd0dbea", "task_name" : "ZF2", "tpl_id" : "600000001", "sms_signs" : [ "华为云KooMessage" ], "resolving_times" : 1, "resolved_times" : 1, "aim_code_type" : "individual", "domain" : "km2g.cn", "expiration_time" : 7, "params" : [ { "cust_flag" : "131****0001", "cust_id" : "231724915a62455ca356e10a085ccccc", "dync_params" : { "param3" : "参数3", "param4" : "参数4", "param1" : "参数1", "param2" : "参数2" }, "custom_url" : "https://www.example.com", "aim_url" : "km2g.cn/PDiWqc", "aim_code" : "PDiWqc", "result_code" : "0", "error_message" : "-", "generate_date" : "2022-07-18T21:00:56", "expire_date" : "2022-07-25T21:00:56", "resolved_date" : "2022-07-21T11:43:00" } ] }, { "task_id" : "30d6db9b-cc8a-4dc9-a314-d80d3fd0dbea", "task_name" : "ZFJ1", "tpl_id" : "600000001", "sms_signs" : [ "华为云KooMessage" ], "resolving_times" : 1, "resolved_times" : 0, "aim_code_type" : "individual", "domain" : "km2g.cn", "expiration_time" : 7, "params" : [ { "cust_flag" : "131****0000", "cust_id" : "231724915a62455ca356e10a085ccccc", "dync_params" : { "param3" : "参数3", "param4" : "参数4", "param1" : "参数1", "param2" : "参数2" }, "custom_url" : "https://www.example.com", "aim_url" : "km2g.cn/PDeag3", "aim_code" : "PDeag3", "result_code" : "0", "error_message" : "-", "generate_date" : "2022-07-18T21:00:56", "expire_date" : "2022-07-25T21:00:56", "resolved_date" : null } ] } ], "page_info" : { "offset" : 0, "limit" : 2, "total" : 80 } }
  • 响应消息体 该部分可选。响应消息体通常以结构化格式(如JSON或XML)返回,与响应消息头中Content-Type对应,传递除响应消息头之外的内容。 对于查询手机号码智能信息解析能力接口,返回如下消息体。 { "supported_mobiles": [ "***********"], "unsupported_mobiles": [ "***********"], "tpl_id": "600042245" } 当接口调用出错时,会返回错误码及错误信息说明,错误响应的Body体格式如下所示。 { "error_msg(或error_message)": "The format of message is error", "error_code": "KM.0001" } 其中,error_code表示错误码,error_msg(或error_message)表示错误描述信息。
  • 响应示例 状态码: 200 返回信息。 { "data" : { "data" : [ { "menu_id" : "b1323ef35b8f4ee3a6767fa5b6cb4922", "pub_id" : "961b0f7d32314b5cb287fc06fe09cccc", "pub_name" : "我的服务号", "approve_state" : 1, "menu_state" : 1, "menu" : { "menu_items" : [ { "name" : "APP", "action_type" : "OPEN_APP", "content" : "imdada://fe.imdada.cn/static/redirect_to_dada.html?page=1000", "ext_msg" : { "app_id" : "10000004", "package_name" : "com.dada.mobile.shop.android", "browser_floor_url" : "" }, "sub_menu_items" : [ ] }, { "name" : "快应用", "action_type" : "OPEN_QUICK", "content" : "hap://app/app.com", "ext_msg" : { "depend_engine_ver" : "v8801", "third_service_name" : "我的服务号" }, "sub_menu_items" : [ ] }, { "name" : "菜单集合", "action_type" : "OPEN_SUBMENU", "content" : "", "ext_msg" : { }, "sub_menu_items" : [ { "name" : "URL", "action_type" : "OPEN_URL", "content" : "https://huawei.com", "ext_msg" : { "web_title" : "huawei", "open_in_browser" : "0" }, "sub_menu_items" : null }, { "name" : "电话联系", "action_type" : "CALLING", "content" : "131****0000", "ext_msg" : { }, "sub_menu_items" : null }, { "name" : "打开APP1", "action_type" : "OPEN_APP", "content" : "imdada://fe.imdada.cn/static/redirect_to_dada.html?page=1000", "ext_msg" : { "app_id" : "10000001", "package_name" : "com.dada.mobile.shop.android", "browser_floor_url" : "" }, "sub_menu_items" : null }, { "name" : "快应用跳转", "action_type" : "OPEN_QUICK", "content" : "hap://app/App888.com", "ext_msg" : { "depend_engine_ver" : "vv88801", "third_service_name" : "华为服务号08" }, "sub_menu_items" : null } ] } ] }, "oper_time" : "2022-08-09T13:12:07Z", "online_time" : null, "logo_img" : "290e1ecc91f043f08d6549ab1484cccc", "logo_url" : "AimSauploadService/1c6c742ca1ff485783a377339deb1437image.jpg" } ], "page_info" : { "offset" : 0, "limit" : 1, "total" : 3 } } }
  • URI GET /v1/aim-sa/menus 表1 Query参数 参数 是否必选 参数类型 描述 menu_id 否 String 菜单ID。 最小长度:0 最大长度:32 pub_id 否 String 服务号ID。 最小长度:0 最大长度:32 pub_name 否 String 服务号名称。 最小长度:0 最大长度:50 online_begin_time 否 String 上线开始时间。格式为:yyyy-MM-ddTHH:mm:ssZ。 online_end_time 否 String 上线结束时间。格式为:yyyy-MM-ddTHH:mm:ssZ。 state 否 Integer 菜单状态。 1:未生效 2:已生效 3:已失效 4:服务号已冻结 最小值:1 最大值:4 menu_name 否 String 一级菜单名称。 最小长度:0 最大长度:50 offset 否 Integer 偏移量,表示从此偏移量开始查询,offset大于等于0。 最小值:0 最大值:2147483647 缺省值:0 limit 否 Integer 每页显示的条目数量。 最小值:1 最大值:100 缺省值:10
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 data ListMenusRsp object 查询智能信息服务号菜单响应体。 表4 ListMenusRsp 参数 参数类型 描述 data Array of MenusRsp objects 菜单信息。 数组长度:1 - 100 page_info PageOffSet object 分页信息。 表5 MenusRsp 参数 参数类型 描述 menu_id String 菜单ID。 pub_id String 服务号ID。 pub_name String 服务号名称。 logo_img String LOGO图片资源ID。 logo_url String LOGO图片资源URL。 menu Menus object 菜单配置。 menu_state Integer 资源状态。 1:未生效 2:已生效 3:已失效 4:已冻结 approve_state Integer 审核状态。 1:待审核 2:通过 3:驳回 online_time String 上线时间。格式为:2020-12-12T12:00:00Z。 oper_time String 最新操作时间。格式为:2020-12-12T12:00:00Z。 表6 Menus 参数 参数类型 描述 menu_items Array of MenuItem objects 各子菜单项配置。 数组长度:0 - 3 表7 MenuItem 参数 参数类型 描述 name String 子菜单名称。 一级菜单名长度和菜单数量有关,具体约束为: 当菜单数量为1个时,菜单名长度范围在1-24个字符。 当菜单数量为2个时,菜单名长度范围在1-12个字符。 当菜单数量为3个时,菜单名长度范围在1-8个字符。 二级菜单名长度范围恒为1-16个字符。 说明: 以上字符区分中英文,一个中文占2个字符,字母和数字占1个字符,且同时生效的一组菜单内名称不能重复。 action_type String 菜单动作类型。 OPEN_SUBMENU:打开子菜单 OPEN_URL:打开URL CALLING:拨打电话 OPEN_APP:打开APP OPEN_QUICK:打开快应用 最小长度:0 最大长度:30 content String 对应值类型。对应不同action_type值,content含义如下: action_type=OPEN_SUBMENU:不填 action_type=OPEN_URL:参数数值为跳转URL action_type=CALLING:参数数值为电话号码 action_type=OPEN_APP:参数数值为APP的跳转deeplink action_type=OPEN_QUICK:参数数值为快应用跳转的deeplink 最小长度:0 最大长度:1000 ext_msg ExtMsg object 额外需要携带的信息。 action_type=OPEN_SUBMENU时,不填 action_type=CALLING时,不填 action_type=OPEN_URL时,必填 action_type=OPEN_APP时,必填 action_type=OPEN_QUICK时,必填 sub_menu_items Array of MenuItem objects 子菜单配置项。 说明: 仅当action_type=OPEN_SUBMENU时生效,且该项内不允许再配置子菜单。 数组长度:0 - 5 表8 ExtMsg 参数 参数类型 描述 open_in_browser String 打开方式。 0:webView打开 1:浏览器打开 说明: action_type=OPEN_URL必填,其他不填。 web_title String 标题,必填,长度范围为1-20个字符。 说明: action_type=OPEN_URL必填,其他不填。 package_name String app包名,长度范围为1-50个字符。 说明: action_type=OPEN_APP必填,其他不填。 app_id String 商家应用的appid,长度范围为0-60个字符。 说明: action_type=OPEN_APP必填,其他不填。 browser_floor_url String 兜底url,长度范围为0-1000个字符,支持http/https。 说明: action_type=OPEN_APP选填,其他不填。 depend_engine_ver String 依赖的快应用引擎版本号,长度范围为1-50个字符。 说明: action_type=OPEN_QUICK必填,其他不填。 third_service_name String 第三方服务名,长度范围为1-50个字符。 说明: action_type=OPEN_QUICK或OPEN_APP必填,其他不填。 表9 PageOffSet 参数 参数类型 描述 offset Integer 偏移量,表示从此偏移量开始查询,offset大于等于0。 limit Integer 每页显示的条目数量。 total Integer 总量。 状态码: 400 表10 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 结果详情。 状态码: 500 表11 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 结果详情。
  • 响应示例 状态码: 200 返回信息。 { "send_details" : [ { "msg_id" : "7e52e4fe-ef00-4826-84b6-756446c5cccc_595223901", "task_id" : "7cc198c3-91d3-425b-9226-54c27cd7cccc", "task_name" : "智能信息发送-动态参数", "tpl_id" : "600000001", "tpl_name" : "【测试市场案例】参数通知模板", "cust_flag" : "131****0000", "send_account" : "131****0000", "send_status" : "success", "send_time" : "2022-07-19T14:57:20Z", "receive_time" : "2022-07-19T14:57:31Z", "result_code" : null }, { "msg_id" : "7e52e4fe-ef00-4826-84b6-756446c5cccc_595223902", "task_id" : "7cc198c3-91d3-425b-9226-54c27cd7cccc", "task_name" : "智能信息发送-动态参数", "tpl_id" : "600000001", "tpl_name" : "【测试市场案例】参数通知模板", "cust_flag" : "131****0001", "send_account" : "131****0001", "send_status" : "success", "send_time" : "2022-07-19T14:57:20Z", "receive_time" : "2022-07-19T14:57:30Z", "result_code" : null } ], "page_info" : { "offset" : 0, "limit" : 2, "total" : 2 } }
共100000条