云容器引擎

创建无状态负载(Deployment)

2022-04-19 13:59:38

操作场景

在运行中始终不保存任何数据或状态的工作负载称为“无状态负载 Deployment”,例如nginx。您可以通过控制台或kubectl命令行创建无状态负载。

前提条件

  • 在创建容器工作负载前,您需要存在一个可用集群。若没有可用集群 ,请参照集群管理->购买混合集群中内容进行创建。
  • 若工作负载需要被外网访问,请确保集群中至少有一个节点已绑定弹性IP,或已购买负载均衡实例。
  • 创建多个工作负载时,请确保容器使用的端口不冲突 ,否则部署会失败。

通过控制台创建

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

  • 基于“我的镜像”创建工作负载,用户首先需要将镜像上传至容器镜像服务。
  • 基于“共享镜像”创建工作负载,即其它租户通过“容器镜像服务”共享给您的镜像。
  • 您希望通过YAML方式创建工作负载,您可在“创建无状态工作负载”高级设置页面单击界面右侧的“YAML创建”,通过yaml的方式创建工作负载。YAML编写完成后,可单击“创建”,直接创建工作负载。

说明:

YAML文件是和界面保持同步的,您也可以通过界面和YAML互动完成工作负载的创建。例如:

  • 界面中填写工作负载名称后,YAML文件会自动关联该名称。
  • 界面中添加完镜像后,YAML中也会自动关联该镜像。

控制台界面右侧的“YAML创建”不支持多个YAML混合,请分别创建,否则创建时将会报错。

步骤 1 登录CCE控制台,在左侧导航栏中选择“工作负载 > 无状态负载 Deployment”,单击“创建无状态工作负载”。参照下表设置工作负载基本信息,其中带“*”标志的参数为必填参数。

工作负载基本信息

参数

参数说明

* 工作负载名称

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

请输入4到63个字符的字符串,可以包含小写英文字母、数字和中划线(-),并以小写英文字母开头,小写英文字母或数字结尾。

* 集群名称

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

* 命名空间

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

* 实例数量

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

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

时区同步

单击开启后,容器将和节点使用相同时区。

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

工作负载描述

工作负载描述信息。

步骤 2 单击“下一步:容器设置”,添加容器。

1. 单击“添加容器”,选择需要部署的镜像。

我的镜像:展示了您创建的所有镜像仓库。

第三方镜像:CCE支持拉取第三方镜像仓库(即镜像仓库之外的镜像仓库)的镜像创建工作负载。使用第三方镜像时,请确保工作负载运行的节点可访问公网。第三方镜像的具体使用方法请参见如何使用第三方镜像。

  • 若您的镜像仓库不需要认证,密钥认证请选择“否”,并输入“镜像名称”,单击“确定”。
  • 若您的镜像仓库都必须经过认证(帐号密码)才能访问,您需要先创建密钥再使用第三方镜像,具体操作请参见如何使用第三方镜像。

共享镜像:其它租户通过“容器镜像服务”共享给您的镜像将在此处展示,您可以基于共享镜像创建工作负载。

2. 配置镜像基本信息。

工作负载是Kubernetes对一组Pod的抽象模型,用于描述业务的运行载体,一个Pod可以封装1个或多个容器,您可以单击右上方的“添加容器”,添加多个容器镜像并分别进行设置。

镜像参数说明

参数

说明

镜像名称

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

* 镜像版本

选择需要部署的镜像版本。

* 容器名称

容器的名称,可修改。

特权容器

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

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

容器规格

CPU配额:

申请:容器需要使用的最小CPU值,默认0.25Core。

限制:允许容器使用的CPU最大值。建议设容器配额的最高限额,避免容器资源超额导致系统故障。

内存配额:

申请:容器需要使用的内存最小值,默认512MiB。

限制:允许容器使用的内存最大值。如果超过,容器会被终止。

申请和限制的具体请参见设置容器规格。

GPU配额:当集群中包含GPU节点时,才能设置GPU,无GPU节点不显示此选项。

容器需要使用的GPU百分比。勾选“使用”并设置百分比,例如设置为10%,表示该容器需使用GPU资源的10%。若不勾选“使用”,或设置为0,则无法使用GPU资源。

GPU显卡:工作负载实例将被调度到GPU显卡类型为指定显卡的节点上。

若勾选“不限制”,容器将会随机使用节点中的任一显卡。您也可以勾选某个显卡,容器将使用特定显卡。

3. 生命周期:用于设置容器启动和运行时需要执行的命令。

启动命令:设置容器启动时执行的命令,具体请参见设置容器启动命令。

启动后处理:设置容器成功运行后执行的命令,详细配置方法请参见设置容器生命周期。

停止前处理:设置容器结束前执行的命令,通常用于删除日志/临时文件等,详细配置方法请参见设置容器生命周期。

4. 健康检查:CCE提供了存活与业务两种探针,用于判断容器和用户业务是否正常运行。详细配置方法请参见设置容器健康检查。

工作负载存活探针:检查容器是否正常,不正常则重启实例。

工作负载业务探针:检查用户业务是否就绪,不就绪则不转发流量到当前实例。

5. 环境变量:在容器中添加环境变量,一般用于通过环境变量设置参数。

在“环境变量”页签,单击“添加环境变量”,当前支持三种类型:

手动添加:输入变量名称、变量/变量引用。

密钥导入:输入变量名称,选择导入的密钥名称和数据。您需要提前创建密钥,具体请参见配置中心->创建密钥。

配置项导入:输入变量名称,选择导入的配置项名称和数据。您需要提前创建配置项,具体请参见配置中心->创建配置项。

说明:

对于已设置的环境变量,单击环境变量后的“编辑”,可对该环境变量进行编辑。单击环境变量后的“删除”,可删除该环境变量。

6. 数据存储:给容器挂载数据存储,支持本地磁盘和云存储,适用于需持久化存储、高磁盘IO等场景。具体请参见存储管理。

7. 安全设置:对容器权限进行设置,保护系统和其他容器不受其影响。

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

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

步骤 3 单击“下一步:工作负载访问设置”,单击“添加服务”,设置工作负载访问方式。

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

工作负载访问的方式决定了这个工作负载的网络属性,不同访问方式的工作负载可以提供不同网络能力,具体请参见网络管理->网络概述。

步骤 4 单击“下一步:高级设置”,配置更多高级策略。

  • 升级策略:您可以指定无状态工作负载的升级方式,包括逐步“滚动升级”和整体“替换升级”。

滚动升级:将逐步用新版本的实例替换旧版本的实例,升级的过程中,业务流量会同时负载均衡分布到新老的实例上,因此业务不会中断。

  • 最大无效实例数:每次滚动升级允许的最大无效实例数,如果等于实例数有断服风险(最小存活实例数 = 实例数 - 最大无效实例数)。

替换升级:将先把您工作负载的老版本实例删除,再安装指定的新版本,升级过程中业务会中断。

  • 缩容策略:为工作负载删除提供一个时间窗,预留给生命周期中PreStop阶段执行命令。若超过此时间窗,进程仍未停止,该工作负载将被强制删除。

缩容时间窗 (s):请输入时间,该时间为工作负载停止前命令的执行时间窗(0-9999秒),默认30秒。

缩容优先级:可根据业务需要选择“优先减少新实例”或“优先减少老实例”。

  • 迁移策略:当工作负载实例所在的节点不可用时,系统将实例重新调度到其它可用节点的时间窗。

迁移时间窗 (s):请输入时间,默认为300秒。

  • 调度策略:您可以根据需要自由组合静态的全局调度策略或动态的运行时调度策略来实现自己的需求。具体请参见亲和反亲和性调度->调度策略概述。
  • Pod高级设置

Pod标签:内置app标签在工作负载创建时指定,主要用于设置亲和性与反亲和性调度,暂不支持修改。您可以单击下方的“添加标签”增加标签。

 说明:

  • 客户端DNS配置:CCE集群内置DNS插件CoreDNS,为集群内的工作负载提供域名解析服务。详细使用方法请参见Kubernetes集群内置DNS配置说明。

DNS策略:

  • 追加域名解析配置:选择该配置后,将保留默认配置,以下“IP地址”和“搜索域”配置可能不生效。
  • 替换域名解析配置:选择该配置后,将仅使用以下“IP地址”和“搜索域”配置进行域名解析。
  • 继承Pod所在节点域名解析配置:将继承Pod所在节点的域名解析配置。

IP地址:您可对自定义的域名配置域名服务器,值为一个或一组DNS IP地址,如“1.2.3.4”。

搜索域:定义域名的搜索域列表,当访问的域名不能被DNS解析时,会把该域名与搜索域列表中的域依次进行组合,并重新向DNS发起请求,直到域名被正确解析或者尝试完搜索域列表为止。

超时时间(s):查询超时时间,请自定义。

ndots:表示域名中必须出现的“.”的个数,如果域名中的“.”的个数不小于ndots,则该域名为一个FQDN,操作系统会直接查询;如果域名中的“.”的个数小于ndots,操作系统会在搜索域中进行查询。

  • 自定义指标监控:是指监控系统提供的一种指标收集机制,该机制允许工作负载在部署时自定义需要上报的指标名称以及获取这些指标数据的接入点信息,在应用运行时由监控系统按固定的频率访问接入点进行指标的收集。
  • 性能管理配置:性能管理服务可协助您快速进行工作负载的问题定位与性能瓶颈分析。

步骤 5 配置完成后,单击“创建”,在创建成功页面单击“返回工作负载列表”,查看工作负载状态。

在工作负载列表中,当工作负载状态为“运行中”时,表示工作负载创建成功。工作负载状态不会实时更新,请刷新页面查看。

步骤 6 在“无状态负载 Deployment”页面的工作负载列表中,复制“外部访问地址”,可在浏览器中访问工作负载。

说明:

  • 当工作负载访问方式设为“节点访问(NodePort)”并绑定弹性IP或设为“负载均衡 ( LoadBalancer )”时,才可以获取外部访问地址,可以访问外网。
  • 工作负载列表页在超过500条以上时,将采用Kubernetes的分页机制进行分页。Kubernetes的分页机制:仅支持回到第一页和查看下一页,不支持查看上一页,且在分页显示的情况下,资源总数显示的是批量查询出的数目而不是真实总数。


通过kubectl命令行创建

本节以nginx工作负载为例,说明kubectl命令创建工作负载的方法。

前提条件

请参见通过kubectl操作CCE集群配置kubectl命令,使弹性云主机连接集群。

操作步骤

步骤 1 登录已配置好kubectl命令的弹性云主机。

步骤 2 创建一个名为nginx-deployment.yaml的描述文件。其中,nginx-deployment.yaml为自定义名称,您可以随意命名。

vi nginx-deployment.yaml

描述文件内容如下。此处仅为示例,deployment的详细说明请参见kubernetes官方文档。

apiVersion: apps/v1 

kind: Deployment 

metadata: 

  name: nginx 

spec: 

  replicas: 1 

  selector: 

    matchLabels: 

      app: nginx 

  strategy: 

    type: RollingUpdate 

  template: 

    metadata: 

      labels: 

        app: nginx 

    spec: 

      containers: 

      - image: nginx  

        imagePullPolicy: Always 

        name: nginx 

      imagePullSecrets: 

      - name: default-secret

以上yaml字段解释如下表。

deployment字段详解

字段名称

字段说明

必选/可选

apiVersion

表示API的版本号。

说明

集群版本为1.9之前的无状态应用apiVersion格式为extensions/v1beta1,1.9之后的集群兼容extensions/v1beta1和apps/v1两种格式Version,请根据集群版本输入。

必选

kind

创建的对象类别。

必选

metadata

资源对象的元数据定义。

必选

name

deployment的名称。

必选

Spec

用户对deployment的详细描述的主体部分都在spec中给出。

必选

replicas

实例数量。

必选

selector

定义Deployment可管理的容器实例。

必选

strategy

升级类型。当前支持两种升级方式,默认为滚动升级。

RollingUpdate:滚动升级。

ReplaceUpdate:替换升级。

可选

template

描述创建的容器实例详细信息。

必选

metadata

元数据。

必选

labels

metadata.labels定义容器标签。

可选

spec:

containers

image(必选):容器镜像名称。

imagePullPolicy(可选):获取镜像的策略,可选值包括Always(每次都尝试重新下载镜像)、Never(仅使用本地镜像)、IfNotPresent(如果本地有该镜像,则使用本地镜像,本地不存在时下载镜像),默认为Always。

name(必选):容器名称。

必选

imagePullSecrets

Pull镜像时使用的secret名称。若使用私有镜像,该参数为必选。

需要Pull SWR容器镜像仓库的镜像时,参数值固定为default-secret。

当Pull第三方镜像仓库的镜像时,需设置为创建的secret名称。

可选

步骤 3 创建deployment。

kubectl create -f nginx-deployment.yaml

回显如下表示已开始创建deployment。

deployment "nginx" created

步骤 4 查看deployment状态。

kubectl get pods

deployment状态显示为Running,表示deployment已创建成功。

NAME                     READY     STATUS    RESTARTS   AGE 

icagent-m9dkt            0/0       Running   0          3d 

nginx-1212400781-qv313   1/1       Running   0          3d

参数解析:

  • NAME:pod的名称
  • READY:已经部署完毕的pod副本数
  • STATUS:状态
  • RESTARTS:重启次数
  • AGE:已经运行的时间

步骤 5 若工作负载(即deployment)需要被访问(集群内访问或节点访问),您需要设置访问方式,具体请参见8 网络管理创建对应服务。