文档首页 > > 用户指南> 工作负载> 创建有状态工作负载(StatefulSet)

创建有状态工作负载(StatefulSet)

分享
更新时间: 2019/10/21 GMT+08:00

在运行过程中会保存数据或状态的工作负载称为“有状态工作负载statefulset)”。例如Mysql,它需要存储产生的新数据。

因为容器可以在不同主机间迁移,所以在宿主机上并不会保存数据,这依赖于CCE提供的高可用存储卷,将存储卷挂载在容器上,从而实现有状态工作负载的数据持久化。

准备工作

在创建容器工作负载前,您需要存在一个可用集群。若没有请参照创建混合集群中内容创建。

创建多个容器的工作负载时,请确保容器使用的端口不冲突 ,否则部署会失败。

通过控制台创建

  1. 云容器引擎提供了多种创建工作负载的方式,您可以通过如下方式进行创建:

    1. 基于Dockerhub官方镜像创建工作负载,无需上传镜像。
    2. 基于镜像创建工作负载,用户首先需要将镜像上传至容器镜像服务,上传镜像的方式请参考镜像管理
    3. 基于共享镜像创建工作负载,即其它租户通过“容器镜像服务”共享给您的镜像。
    4. 若您希望通过YAML方式创建工作负载,您可在“创建有状态工作负载”页面单击界面右侧的YAML创建,通过yaml的方式创建工作负载。YAML的说明请参见通过kubectl命令行创建。YAML编写完成后,可单击“创建”,直接创建工作负载。

      YAML文件是和界面保持同步的,您也可界面和YAML互动完成工作负载的创建。例如界面中填写工作负载名称后,YAML文件会自动关联该名称。例如界面中添加完镜像后,YAML中也会自动关联该镜像。

  2. 登录CCE控制台,在左侧导航栏中选择“工作负载 > 有状态(StatefulSet)”,单击“创建有状态工作负载”。在打开的创建有状态工作负载页面中,参照表1设置工作负载基本信息,其中带“*”标志的参数为必填参数。

    表1 工作负载基本信息

    参数

    参数说明

    * 工作负载名称

    新建工作负载的名称,命名必须唯一。

    * 集群名称

    新建工作负载所在的集群。

    * 命名空间

    在单集群中,不同命名空间中的数据彼此隔离。使应用可以共享同个集群的服务,也能够互不干扰。若您不设置命名空间,系统会默认使用default命名空间。

    * 实例数量

    工作负载的实例数量。工作负载可以有一个或多个实例,用户可以设置具体实例个数,默认为2,可自定义设置为1。

    每个工作负载实例都由相同的容器部署而成。设置多个实例主要用于实现高可靠性,当某个实例故障时,工作负载还能正常运行。若使用单实例,节点异常或实例异常会导致服务异常。

    时区同步

    勾选“开启”,容器将和节点使用相同时区。

    须知:

    时区同步功能开启后,在“数据存储 > 本地磁盘”中,将会自动添加HostPath类型的磁盘,请勿修改删除该磁盘。

    工作负载描述

    工作负载描述信息。

  3. 单击“下一步”,添加容器。

    1. 单击“添加容器”,选择需要部署的镜像。
      • 我的镜像:展示了您创建的所有镜像仓库。
      • Dockerhub官方镜像:展示了Dockerhub仓库中的官方镜像。
      • 第三方镜像:CCE支持拉取第三方镜像仓库(即镜像仓库与Dockerhub之外的镜像仓库)的镜像创建工作负载。使用第三方镜像时,请确保工作负载运行的节点可访问公网。第三方镜像的具体使用方法请参见如何使用第三方镜像
        • 若您的镜像仓库不需要认证,密钥认证请选择“否”,并输入“镜像地址”,单击“确定”
        • 若您的镜像仓库都必须经过认证(帐号密码)才能访问,您需要先创建密钥再使用第三方镜像,具体操作请参见如何使用第三方镜像
      • 共享镜像:其它租户通过“容器镜像服务”共享给您的镜像将在此处展示,您可以基于共享镜像创建工作负载。
    2. 配置镜像基本信息。
      表2 镜像参数说明

      参数

      说明

      镜像名称

      导入的镜像,您可单击“更换镜像”进行更换。

      * 镜像版本

      若选择Dockerhub官方镜像,请选择需要部署的镜像版本。

      * 容器名称

      容器的名称,可修改。

      特权容器

      特权容器是指容器里面的程序具有一定的特权。

      若选中,容器将获得超级权限,例如可以操作宿主机上面的网络设备、修改内核参数等。

      容器规格

      CPU配额:

      • 申请:容器需要使用的最小CPU值,默认0.25Core。
      • 限制:允许容器使用的CPU最大值。建议设容器配额的最高限额,避免容器资源超额导致系统故障。

      内存配额:

      • 申请:容器需要使用的内存最小值,默认512MiB。
      • 限制:允许容器使用的内存最大值。如果超过,容器会被终止。

      申请和限制的详情请参见设置容器规格

      GPU配额:当集群中包含GPU节点时,才能设置GPU,无GPU节点不显示此选项。
      • GPU配额:容器需要使用的GPU百分比。勾选“使用”并设置百分比,例如设置为10%,表示该容器需使用GPU资源的10%。若不勾选“使用”,或设置为0,则无法使用GPU资源。
      • GPU显卡:工作负载实例将被调度到GPU显卡类型为指定显卡的节点上。若勾选“不限制”,容器将会随机使用节点中的任一显卡。您也可以勾选某个显卡,容器将使用特定显卡。
    3. 生命周期:用于管理容器启动和运行时需要执行的命令。
      • 启动命令:设置容器启动时执行的命令,详情请参见设置容器启动命令
      • 启动后处理:设置容器成功运行后执行的命令,详细配置方法请参见设置容器生命周期
      • 停止前处理:设置容器结束前执行的命令,通常用于删除日志/临时文件等,详细配置方法请参见设置容器生命周期
    4. 健康检查:用于判断容器和用户业务是否正常运行。CCE提供了存活与业务两种探针,详细配置方法请参见设置容器健康检查
      • 工作负载存活探针:检查容器是否正常,不正常则重启实例。
      • 工作负载业务探针:检查用户业务是否就绪,不就绪则不转发流量到当前实例。
    5. 环境变量:在容器中添加环境变量,一般用于通过环境变量设置参数。
      “环境变量”页签,单击 “添加环境变量”。当前支持三种类型。
      • 手动添加:输入变量名称、变量/变量引用。
      • 密钥导入:输入变量名称,选择导入的密钥名称和数据。您需要提前创建密钥,详情请参见创建密钥
      • 配置项导入:输入变量名称,选择导入的配置项名称和数据。您需要提前创建配置项,详情请参见创建配置项
    6. 数据存储:给容器挂载数据存储,适用于需持久化存储、高磁盘IO等场景。详细配置请参见存储管理
    7. 安全设置:对容器权限进行设置,保护系统和其他容器不受其影响。

      请输入用户ID,容器将以当前用户权限运行。

    8. 容器日志:设置容器日志采集策略、配置日志目录。用于收集容器日志便于统一管理和分析。详细配置请参见采集容器标准输出日志采集容器内路径日志

  4. 单击“下一步”,设置“实例间发现服务”,如表3

    表3 实例间发现服务参数配置

    参数

    参数说明

    服务名称

    入工作负载所对应的服务名称,用于集群内工作负载间的互相访问。该服务主要用于实例的内部发现,不需要有单独的IP地址,也不需要做负载均衡。

    端口名称

    端口名称用于给容器端口命名,通常以端口用途命名。

    容器端口

    输入容器的监听端口。

  5. 单击“添加服务”,设置工作负载访问方式。

    若工作负载需要和其它服务互访,或需要被公网访问,您需要添加服务,设置工作负载访问方式。

    工作负载访问的方式决定了这个工作负载的网络属性,不同访问方式的工作负载可以提供不同网络能力,详情请参见网络概述

  6. 单击“下一步”,配置高级设置。

    • 升级策略:仅支持“滚动升级”
    • 实例管理策略:支持“有序策略”“并行策略”两种。

      有序策略:有状态负载会逐个的、按顺序的进行部署、删除、伸缩实例, 只有前一个实例部署Ready或删除完成后,有状态负载才会操作后一个实例。

      并行策略:有状态负载并行创建或删除所有的实例,有状态负载发生变更时立刻在实例上生效。

    • 缩容策略:“缩容时间窗 (s)”中输入时间,该时间为工作负载停止前命令的执行时间窗(0-9999秒),默认30秒。为工作负载删除提供一个时间窗,预留给生命周期中PreStop阶段执行命令。若超过此时间窗,进程仍未停止,该工作负载将被强制删除。
    • 迁移策略:输入时间。当工作负载实例所在的节点不可用时,系统将实例重新调度到其它可用节点的时间窗,默认为300秒。
    • 调度策略:你可以根据需要自由组合静态的全局调度策略或动态的运行时调度策略来实现自己的需求。详情请参见调度策略概述
    • Pod高级设置
      • Pod标签:内置app标签在工作负载创建时指定,暂不支持修改。您可以单击下方的“添加标签”增加标签。
      • 弹性网卡:Pod中的容器支持绑定弹性网卡。单击选中“绑定弹性网卡”可以绑定已有的网络平面,如果没有可绑定的网络平面,请单击右侧的“添加网络平面”,完成添加后单击刷新按钮。更多网络平面信息请参见网络平面(NetworkAttachmentDefinition)
        • 仅v1.13.7-r0及以上版本且网络模型为VPC网络的混合集群才能绑定弹性网卡,不符合条件的集群将不显示“弹性网卡”选项。
        • 网络平面是CCE新增的一种crd资源,记录了租户ID,子网ID,安全组等的配置项,作为申请弹性网卡的配置信息。
        • 创建工作负载时,在设置工作负载访问方式步骤中如果添加了节点级别的Service,将无法绑定弹性网卡;同理,绑定了弹性网卡的工作负载,将无法添加节点级别的Service。
      图1 Pod高级设置
    • 客户端DNS配置:CCE集群内置DNS插件CoreDNS,为集群内的工作负载提供域名解析服务。详细使用方法请参见Kubernetes集群内置DNS使用指南
      • DNS策略:
        • 追加域名解析配置:将保留默认配置,以下“IP地址”“搜索域”配置可能不生效。
        • 替换域名解析配置:将仅使用以下配置进行域名解析。
        • 继承Pod所在节点域名解析配置:将继承Pod所在节点的域名解析配置。
      • IP地址:您可对自定义的域名配置域名服务器,值为一个或一组DNS IP地址,如“1.2.3.4”。
      • 搜索域:定义域名的搜索域列表,当访问的域名不能被DNS解析时,会把该域名与搜索域列表中的域依次进行组合,并重新向DNS发起请求,直到域名被正确解析或者尝试完搜索域列表为止。
      • 超时时间(s):查询超时时间,请自定义。
      • ndots:表示域名中必须出现的“.”的个数,如果域名中的“.”的个数不小于ndots,则该域名为一个FQDN,操作系统会直接查询;如果域名中的“.”的个数小于ndots,操作系统会在搜索域中进行查询。
    • 自定义指标监控:是指监控系统提供的一种指标收集机制,该机制允许工作负载在部署时自定义需要上报的指标名称以及获取这些指标数据的接入点信息,在应用运行时由监控系统按固定的频率访问接入点进行指标的收集。详细请参见对接普罗米修斯(自定义监控)
    • 性能管理配置:华为云的性能管理服务可协助您快速进行工作负载的问题定位与性能瓶颈分析。详细请参见性能管理配置(性能瓶颈分析)

  7. 配置完成后,单击“创建”,单击“返回工作负载列表”。

    • 在工作负载列表中,当工作负载状态为“运行中”时,表示工作负载创建成功。
    • 工作负载状态不会实时更新,请单击右上角的图标或按F5刷新页面查看。
    • 工作负载列表页在超过500条以上时,将采用Kubernetes的分页机制进行分页。Kubernetes的分页机制:仅支持回到第一页和查看下一页,不支持查看上一页,且在分页显示的情况下,资源总数显示的是批量查询出的数目而不是真实总数。

通过kubectl命令行创建

本节以etcd为例来进行说明。

前提条件

请参见通过kubectl连接集群配置kubectl命令,使弹性云服务器连接集群。

操作步骤

  1. 登录已配置好kubectl命令的弹性云服务器。登录方法请参见登录Linux弹性云服务器
  2. 创建一个名为etcd-statefulset.yaml的文件。

    其中,etcd-statefulset.yaml为自定义名称,您可以随意命名。

    vi etcd-statefulset.yaml

    以下内容仅为示例,若需要了解statefulset的详细内容,请参考kubernetes官方文档

    apiVersion: apps/v1beta1
    kind: StatefulSet
    metadata:
      name: etcd
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: etcd
      serviceName: etcd-svc
      template:
        metadata:
          labels:
            app: etcd
        spec:
          containers:
          - env:
            - name: PAAS_APP_NAME
              value: tesyhhj
            - name: PAAS_NAMESPACE
              value: default
            - name: PAAS_PROJECT_ID
              value: 9632fae707ce4416a0ab1e3e121fe555
            image: etcd
            imagePullPolicy: IfNotPresent
            name: container-0
      updateStrategy:
        type: RollingUpdate

    vi etcd-headless.yaml

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: etcd
      name: etcd-svc
    spec:
      clusterIP: None
      ports:
      - name: etcd-svc
        port: 3120
        protocol: TCP
        targetPort: 3120
      selector:
        app: etcd
      sessionAffinity: None
      type: ClusterIP

  3. 创建工作负载以及对应headless服务。

    kubectl create -f etcd-statefulset.yaml

    回显如下,表示有状态工作负载(stateful)已创建成功。

    statefulset "etcd" created

    kubectl create -f etcd-headless.yaml

    回显如下,表示对应headless服务已创建成功。

    service "etcd-svc" created

  4. 工作负载需要被访问(集群内访问或节点访问),您需要设置访问方式,详情请参见网络管理创建对应服务。
分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区