在运行中始终不保存任何数据或状态的工作负载称为无状态负载,对应 Kubernetes 中的 Deployment。用户可以通过镜像在集群中创建一个无状态负载。本文介绍如何创建无状态负载应用。
前提条件
通过控制台创建
- 登录无状态负载页面。
- 登录 容器服务管理控制台。
- 单击左侧导航栏中的 集群。
- 在集群列表页面,单击需要创建无状态负载的目标集群。
- 在集群管理页面的左侧导航栏中,单击 工作负载 > 无状态负载。
- 在无状态负载页面,单击 创建无状态负载。
- 配置无状态负载信息。
- 自定义 基本信息。完成后单击页面右下角的 下一步:容器配置。
参数 | 说明 |
---|
名称 | 根据系统提示,配置工作负载的名称。在同一个命名空间下,名称必须唯一。 |
命名空间 | 选择工作负载部署的命名空间,支持选择自定义创建的命名空间或 Kubernetes 自建的命名空间。Kubernetes 自建命名空间的说明,请参见 命名空间概述。 |
实例个数 | 输入工作负载的 Pod 实例个数。 |
标签 | 填写工作负载的标签,对应 Kubernetes 中的 Label,用于识别工作负载的键值对,配合选择器,帮助 Kubernetes 快速筛选目标工作负载。例如service.istio.io/canonical-revision:latest 。
单击 添加标签,根据界面提示输入 键 和 值。 |
注解 | 填写工作负载的注解信息,对应 Kubernetes 中的 Annotation,主要记录用于应用部署、安全策略、调度策略的附加信息,不用于标识和区分资源。
单击 添加注解,根据界面提示输入 键 和 值。 |
算力类型 | 选择部署工作负载的基础设施资源,有如下两种算力类型: - 云服务器实例 ECS:在集群中的云服务器节点(Node)上部署该工作负载。
- 弹性容器实例 VCI:在集群中的弹性容器实例(VCI),即虚拟节点(VirtualNode)上部署该工作负载。弹性容器实例相关介绍,请参见 什么是弹性容器实例。
|
同步时区 | 算力类型 选择 云服务器实例 ECS 后显示该参数。开启后,容器(Container)使用节点本地所属时区的 CST(Central Standard Time)时区。 |
日志采集 | 算力类型 选择 弹性容器实例 VCI 后显示该参数。要开启后采集弹性容器实例日志。详细说明,请参见 通过日志服务采集 VCI 容器日志。 |
- 自定义 容器配置。完成后单击页面右下角的 下一步:高级配置。
- 基本信息
参数 | 说明 |
---|
容器名称 | 根据系统提示的命名规则,输入容器名称。同一个工作负载下容器名称必须唯一。 |
容器镜像 | 容器使用的镜像。支持使用第三方镜像和镜像仓库 CR 中的镜像: - 第三方镜像:直接输入第三方镜像仓库地址(包括镜像 Tag),例如:
example.com/namespace/repository:v1 。 - 镜像仓库 CR 中的镜像:单击 选择镜像,从右侧弹出的面板中选择目标镜像仓库实例下的镜像。
说明 - 若需要使用 CR 中的私有镜像,请先安装 cr-credential-controller 免密组件。详细操作,请参见 使用免密组件拉取私有镜像创建工作负载。
- 若不使用 cr-credential-controller 免密组件拉取私有镜像,则需要配置 镜像密钥。
- 使用 CR 标准版实例中的镜像时,若您的标准版实例未配置当前集群所在 VPC 的访问控制权限,需要根据系统提示配置。详细操作,请参见 连通本账号 VPC。
|
镜像版本 | 选择镜像的版本,不选择则默认拉取latest 版本。 注意 - 如果镜像不存在
latest 版本,此处必须填写或选择镜像版本。 - 使用第三方镜像时,无需配置该参数。
|
镜像拉取策略 | 拉取容器镜像的策略: - 默认策略:使用系统指定的默认策略。默认策略说明如下:
- 当前集群 kube-apiserver 未启用 AlwaysPullImages 插件:
- 若未指定 镜像版本(Tag)或指定为
latest 时,镜像拉取策略默认为 Always。 - 若已指定 镜像版本(Tag)且不为
latest 时,镜像拉取策略默认为 IfNotPresent。
- 当前集群 kube-apiserver 已启用 AlwaysPullImages 插件:镜像拉取策略默认为 Always,选择其余策略不会生效。
- Always:总是拉取镜像。
- IfNotPresent:优先使用本地镜像。
- Never:仅使用本地镜像。
|
镜像密钥 | 默认不开启。开启后需要配置镜像仓库密钥。选择已有的仓库密钥或单击 创建仓库密钥,按如下说明在容器服务侧补充镜像仓库的密钥: - 名称:容器使用的镜像的仓库名称。以使用镜像仓库 CR 中的镜像为例,则此处填写镜像所在的 OCI 制品仓库名称。
- 仓库域名:填写镜像仓库域名,示例:
cr-cn-beijing.volces.com 。 - 用户名:登录镜像仓库的用户名。以使用镜像仓库 CR 中的镜像为例,则此处填写镜像所在实例的登录用户名。可在 镜像仓库控制台 目标实例的 概览 页面获取。
- 密码:镜像仓库登录用户名对应的密码。
注意 不使用免密组件,且需要拉取私有镜像时,必须配置该参数。 |
资源配额 | 支持按照业务需求,在容器维度配置 CPU 和内存的上下限,保障容器的健康运行。若不设置,则表示容器资源配额无限制。 - CPU 请求:容器需要使用的最小 CPU 值。
- CPU 上限:允许容器使用的 CPU 最大值。如果超过,容器会被终止。
- 内存请求:容器需要使用的最小内存值。
- 内存上限:允许容器使用的内存最大值。如果超过,容器会被终止。
- GPU 资源类型:仅具有 GPU 计算型节点的集群,可配置 GPU 资源。有如下两种 GPU 资源:
- Nvidia:使用 NVIDIA GPU 资源。根据系统提示输入您需要使用的 NVIDIA GPU 算力 和 显卡类型。详细说明,请参见 NVIDIA GPU 调度、 弹性容器实例 GPU 调度。
该功能依赖 nvidia-device-plugin 组件,若未安装组件,请根据系统提示安装。 - mGPU:使用容器共享 GPU 资源。根据系统提示输入您需要使用的容器共享 GPU 算力、GPU 显存 和 显卡类型。详细说明,请参见 容器共享 GPU 调度 。
该功能依赖 mgpu 组件,若未安装组件,请根据系统提示安装。
- RDMA 卡数:【邀测·申请试用】提供 Pod Container 使用 RDMA 设备能力,推荐配置 2 或者 4。详细说明,请参见 VKE 集群中使用 RDMA 资源。
说明 - 单个工作负载中,只能选用一种 GPU 资源。
- RDMA 和 mGPU 不能同时使用。
|
特权级容器 | 默认不开启。开启后特权级容器可以访问宿主上的设备。支持部署在 Linux 系统上的容器控制网络堆栈或访问设备。 |
Init 容器 | 默认不开启。开启后表示将该容器设置为 Init 容器。Init 容器是 Pod 中,运行在应用容器前的容器,并且它可以包括仅在安装过程中使用的工具(例如 python、dig)和代码,避免在应用容器中的重复部署,提升应用镜像的安全性。 说明 Init 容器不支持设置生命周期管理中的启动后处理、停止前处理,不支持开启健康检查。 |
Stdin | 开启后,在容器运行时为容器标准输入 (Stdin) 分配缓冲区。 |
Tty | 开启后,为容器分配一个终端,需同时勾选 Stdin。 |
- 容器端口
单击 添加端口,根据界面提示,配置容器中应用对容器外服务的连接端口,包括支持的协议(TCP、UDP)、端口号、端口名称。例如 Nignx 监听端口名称为nginx
的 TCP 协议 80 端口。 - 环境变量
单击 添加环境变量,配置环境变量。Kubernetes 在创建 Pod 时,会将环境变量的信息注入到容器中。
类型 | 说明 |
---|
自定义 | 支持输入变量名称和变量值,创建自定义的环境变量。 |
配置项 | 支持部分引用或全部引用配置项中的变量。部分引用时,一条规则仅支持为一个 Key 创建环境变量。 |
保密字典 | 支持部分引用或全部引用保密字典中的变量。部分引用时,一条规则仅支持为一个 Key 创建环境变量。 |
实例字段 | 支持引用实例字段中的值,创建环境变量。 - metadata.name:工作负载的名称。
- metadata.namespace:工作负载所处的命名空间。
- metadata.labels:工作负载的标签。
- metadata.annotations:工作负载的注解。
- spec.nodeName:工作负载所处的节点。
- spec.serviceAccountName:所使用的服务账号。
- status.hostIP:工作负载所处节点的 IP。
- status.podIP:工作负载中 Pod 的 IPv4 地址。
- status.podIPs:工作负载中 Pod 的 IPv4 和 IPv6 地址。
|
容器资源 | 支持引用容器中的字段作为环境变量。- limits.cpu:容器 CPU 的使用上限。
- limits.memory:容器内存的使用上限。
- request.cpu:容器 CPU 请求的大小。
- request.memory:容器内存请求的大小。
|
- 储存配置
在容器中存储数据分两步:先在 Pod 定义卷(Volume),也就是添加卷,然后在容器挂载卷。
- 添加卷:单击 添加卷,添加数据卷。卷(Volume)是容器中存储数据的位置。为一类数据分配存储资源前,需要先在容器中指定待存储数据的目录。
类型 | 说明 |
---|
配置项 | 支持为配置项中的全部数据或部分数据创建数据卷。为部分数据创建存储卷时,支持配置多数据 item,用半角分号 (;)分隔。例如 cm1:path1;cm2:path2 。 |
保密字典 | 支持部分挂载或全部挂载保密字典中的数据。为部分数据创建存储卷时,支持配置多数据 item,用半角分号 (;)分隔。例如 cm1:path1;cm2:path2 。 |
存储卷声明 | 选择当前工作负载命名空间中已创建的存储卷声明,并为其指定数据卷的名称。 |
临时目录 | 为临时目录创建数据卷名称。 |
主机目录 | 为主机中的目录创建数据卷。 |
- 挂载卷:单击 添加挂载卷,为已创建的卷分配存储资源,并分配读写权限。其中,支持通过 subPath 方式挂载卷的子目录;支持通过 subPathExpr 方式挂载卷的扩展路径。
- 生命周期
支持在创建容器时,自动注入容器运行前后的执行命令,设置的命令和参数将填写在配置文件中。如果容器镜像中存在相同的命令和参数,那么配置文件中命令和参数将覆盖容器镜像中的对应命令和参数。
类型 | 说明 |
---|
运行命令 | 输入容器启动前运行的命令。 |
运行参数 | 输入容器启动前所运行命令的参数。 |
启动后处理 | 输入启动后命令。 |
停止前处理 | 输入停止前处理命令。 |
- 健康检查
支持配置 存活检查、就绪检查 和 启动检查。允许基于 HTTP 协议、TCP 协议或执行具体命令的方式,探测容器中的负载是否正常。以下以配置存活检查为例,介绍配置参数。
配置项 | 说明 |
---|
检查方式 | 配置检查的方式,包括: - HTTP 请求检查:使用 HTTP 或 HTTPS 协议,向容器发送一个 HTTP Get 请求,通过检查响应确认容器状态。您需要进行如下检查配置:
- 协议:HTTP 或 HTTPS。
- HTTP 请求头:HTTP 请求中自定义的请求头(HTTP Headers)。单击 添加 输入键值对的配置方式。
- 路径:访问 HTTP Server 的路径。
- 端口:容器暴露的访问端口号或端口名称。
- TCP 端口检查:向容器发送一个 TCP Socket,Kubelet 将尝试在指定端口上打开容器的 Socket。 如果可以建立连接,容器被认为是健康的,如果不能就认为是失败的。您需要进行如下检查配置:
- 执行命令检查:在容器内执行指定的命令,通过检查命令执行的结果确认容器状态。 您需要进行如下检查配置:
|
时间设置 | 配置检查的时间参数,包括: - 初始等待时间:指容器启动后,第一次执行探测时需要等待的时间,默认为 1 秒。
- 超时时间:指发送检查请求后,等待响应的超时时间。超过此时间表示容器无响应,默认为 1 秒。
- 检查间隔:相邻两次检查的时间间隔。默认为 10 秒。
|
阈值设置 | 配置检查的结果阈值。包括: - 成功阈值:检查请求发送后,表示系统正常的响应次数,默认为 1 次。该项不可配置。
- 失败阈值:检查请求发送后,表示系统异常的无响应次数,默认为 3 次。即如果容器对请求 3 次无响应,则认为容器状态异常。
|
- 自定义 高级配置。
- VCI 规格配置
说明
仅 基本信息 配置步骤中,算力类型 选择 弹性容器实例 VCI 的工作负载需要进行 VCI 规格配置。
配置项 | 说明 |
---|
规格族类型 | 选择使用 VCI 实例规格族的方式,支持使用 系统默认规格族 中的规格创建工作负载,也支持自定义 指定规格族 中的规格创建工作负载。 |
规格族 | 选择 指定规格族 时需要配置该参数。请选择具体的 VCI 实例规格族及其下规格。相关说明,请参见 VCI 实例规格介绍。 |
实例个数 | 工作负载的 Pod 实例个数,用于校验工作负载可用的 VCI 资源配额和库存。 - 对于 Deployment 和 Statefulset 类工作负载:与 基本信息 步骤中配置的 实例个数 一致,两者会相互同步更新。
- 对于 Job 和 CornJob 类工作负载:与 高级配置 步骤 运行策略 模块中配置的 可并行数 一致,此处不可更改。
|
Pod 子网 | 设置 VCI 实例子网,有如下两种子网选项: - 集群 Pod 子网:使用所在集群的 Pod 子网作为 VCI 实例子网。
- 指定 Pod 子网:自定义指定 VCI 实例子网,您还需要配置 可用区、选择子网。
|
- 实例配置
配置项 | 说明 |
---|
镜像缓存 | 【邀测·申请试用】在 基本信息 配置步骤中 算力类型 选择 弹性容器实例 VCI 的工作负载显示该配置。
系统根据您选择的 容器镜像,显示该镜像是否已进行镜像缓存: - 未匹配到镜像缓存:表示上一页配置中选择的容器镜像,没有进行镜像缓存。您可以单击 创建镜像缓存,为已选的容器镜像进行镜像缓存。参数配置说明,请参见 使用手动镜像缓存创建 VCI 实例。
- 镜像缓存加速可用:表示上一页配置中选择的容器镜像,已进行镜像缓存。创建当前工作负载时,可缩短镜像下载耗时,加速容器启动速度。镜像缓存相关介绍,请参见 镜像缓存。
|
优雅退出 | 优雅时间是指实例终止前的缓冲时间,默认为 30 秒。当配置为 0 时,表示立即删除实例。 |
更新策略 | 配置实例更新策略,包括: - 滚动更新:将逐步用新版本的实例替换旧版本的实例,升级的过程中,业务流量会同时负载均衡分布到新老的实例上,因此业务不会中断。
- 重新创建:将先把工作负载的老版本实例删除,再安装指定的新版本,升级过程中业务会中断。
|
最大不可用 | 指定 滚动更新 缩容过程中,工作负载中可用的实例 (Pod) 的数量的下限。选择 滚动更新 策略时,需要配置此配置项。支持基于百分比或具体数值配置 Pod 的最大不可用数量。使用百分比时,会将计算结果转换成绝对值并去除小数部分。最大不可用 和 最大超量 不能同时为 0。 |
最大超量 | 指定 滚动更新 扩容过程中,工作负载中可用的实例 (Pod) 的数量的上限。选择 滚动更新 策略时,需要配置此配置项。支持基于百分比或具体数值配置 Pod 的最大超量。使用百分比时,会将计算结果转换成绝对值并去除小数部分。最大不可用 和 最大超量 不能同时为 0。 |
实例标签 | 配置 Pod 实例标签,配合标签选择器,帮助 Kubernetes 筛选目标 Pod。单击 添加实例标签,根据界面提示输入符合要求的 键 和 值。 |
实例注解 | 配置 Pod 实例注解。单击 添加实例注解,根据界面提示输入符合要求的 键 和 值。 注解对应 Kubernetes 中的 Annotation,不用于标识和区分资源,主要记录用于应用部署、安全策略、调度策略的附加信息。 |
DNS 策略 | 配置实例的 DNS 策略。包括: - ClusterFirst:在该模式下,会将 Kube-dns 或 CoreDNS 的信息当作预设置参数,写入到该 Pod 内的 DNS 配置。
- Default:在该模式下,Pod 里面的 DNS 配置继承了宿主机上的 DNS 配置。即该 Pod 的 DNS 配置与宿主机完全一致。
- ClusterFirstWithHostNet:在该模式下, 宿主机上的 DNS 配置与 Kube-dns 同时作为 Pod 的预设 DNS 配置。
- None:该模式下, Kubernetes 不会为 Pod 预先加载任何逻辑,用于判定得到 DNS 的配置。
|
- 调度策略
配置项 | 说明 |
---|
节点亲和调度 | 配置工作负载和节点的亲和性调度。包括:强制调度和优先调度。 - 强制调度:通过匹配标签进行调度选择。可以设置 6 种匹配关系(In, NotIn, Exists, DoesNotExist, gt, lt)。
- 优先调度:通过匹配标签进行调度选择,允许配置权重。可以设置 6 种匹配关系(In, NotIn, Exists, DoesNotExist, gt, lt)。
|
节点污点调度 | 配置节点污点调度。通过匹配标签进行调度选择,可以设置 2 种匹配关系(equal, exists)。 |
实例亲和调度 | 配置工作负载和其他实例的亲和性调度。包括:强制调度和优先调度。 - 强制调度:基于命名空间、拓扑域。支持配置选择器(MatchExpressions、MatchLabels)。通过匹配标签进行调度选择。可以设置 4 种匹配关系(In, NotIn, Exists, DoesNotExist)。
- 优先调度:基于命名空间、拓扑域。支持配置选择器(MatchExpressions、MatchLabels)。通过匹配标签进行调度选择,允许配置权重。可以设置 4 种匹配关系(In, NotIn, Exists, DoesNotExist)。
|
实例反亲和调度 | 配置工作负载和其他实例的反亲和性调度。包括:强制调度和优先调度。 - 强制调度:基于命名空间、拓扑域。支持配置选择器(MatchExpressions、MatchLabels)。通过匹配标签进行调度选择。可以设置 4 种匹配关系(In, NotIn, Exists, DoesNotExist)。
- 优先调度:基于命名空间、拓扑域。支持配置选择器(MatchExpressions、MatchLabels)。通过匹配标签进行调度选择,允许配置权重。可以设置 4 种匹配关系(In, NotIn, Exists, DoesNotExist)。
|
- 其他
在页面底部 其他 区域开启 非 root 用户运行 开关后,指定容器必须以非root
用户权限运行,否则容器将会启动失败。
- 单击页面右下角的 确定,完成无状态负载创建。
通过 kubectl 命令行创建
说明
通过 kubectl 命令行创建无状态负载前请确保:
- 创建工作负载的 YAML 文件。示例文件
deployment-demo.yaml
代码如下:apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-demo # 无状态负载名称。
namespace: default # 无状态负载所在的命名空间。
spec:
replicas: 2 # 无状态负载的副本数。
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx # 容器名称。
image: cr-cn-beijing.volces.com/demo-namespace/demo-repo:v1 # 容器镜像地址和 Tag。
ports:
- containerPort: 80 # 容器开放的端口号。
resources:
requests: # 指定容器的 CPU 和内存请求。
cpu: "500m"
memory: "1024Mi"
limits: # 指定资源配额,例如:CPU 上限、内存上限、RDMA 卡数等。
cpu: "1"
memory: "2Gi"
vke.volcengine.com/rdma: 2
- 执行以下命令,创建工作负载。
kubectl apply -f deployment-demo.yaml
操作结果
操作完成后可以在 工作负载 > 无状态负载 页面查看工作负载的状态。