在运行中会保存数据或状态的工作负载称为有状态负载 ,对应 Kubernetes 中的 StatefulSet,例如 MySQL,它在运行中会保存产生的数据。本文描述了如何通过边缘智能控制台创建并部署有状态负载。
背景信息 边缘智能为有状态的应用实现了无头服务(Headless Service),这使得客户端可以直接访问 Pod,而无需使用 Kubernetes 的服务发现和负载均衡机制。这对于那些需要持久网络标识符以实现稳定通信的有状态负载特别有用,例如需要明确网络地址进行通信的分布式系统和数据库等应用。更多信息可参见 Kubernetes 官方文档 。
前提条件 您已经为项目绑定了节点。相关操作,请参见绑定节点 。 您已获取应用镜像的 URL。您可以将制作好的应用镜像托管在某个镜像仓库,获取镜像的 URL。我们推荐您将镜像托管到火山引擎镜像仓库 。
操作步骤 登录边缘智能控制台 。
在左侧导航栏顶部的 我的项目 区域,选择您的项目。
在左侧导航栏,选择 应用管理 > 工作负载 。
单击 有状态负载 页签。
单击 创建工作负载 。
在 创建工作负载 对话框,选择一种创建方式,然后单击 确定 。
可选择的创建方式包括:
快捷创建 :通过配置参数指定工作负载的相关属性。YAML创建 :通过 YAML 文件指定工作负载的相关属性。
快捷创建 根据以下说明,完成 创建工作负载 配置向导:
配置工作负载 。
完成工作负载相关参数的配置,然后单击 下一步:配置部署节点 。
工作负载配置包括 基础信息 、容器配置 、访问设置 、发布策略 配置。
基础信息
配置项
说明
名称
为工作负载设置名称。输入要求如下:
允许使用以下字符:英文小写字母、数字、下划线(_)、连字符(-)。 长度不超过 32 个字符。开头和结尾不允许使用特殊字符。不允许连续使用特殊字符。 在同一个边缘智能项目中,工作负载的名称必须保持唯一。 描述
可选。为工作负载添加描述。
允许使用任意字符。长度不超过 128 个字符。
副本数
设置工作负载在节点中运行的副本总数。取值范围:1~10。
容器配置
类型
配置项
说明
容器
N/A
单击左侧的 + 添加容器 ,可以添加多个容器。
选择一个容器后,需要完成以下容器配置。
基本信息
容器名称
为容器设置名称。输入要求如下:
允许使用以下字符:小写字母、数字、连字符(-)。 长度不超过 128 个字符。 开头和结尾不允许使用特殊字符。 同一个工作负载下,容器名称不允许重复。 镜像地址
输入镜像的 URL 地址。地址需符合 URL 格式。长度不超过 1024 个字符。
说明
您可以将制作好的应用镜像托管在某个镜像仓库,获取镜像的 URL。我们推荐您将镜像托管到火山引擎镜像仓库 。
仓库密钥
针对私有镜像仓库,可设置仓库密钥,以获得镜像访问权限。
选择已有的仓库密钥或单击 创建仓库密钥 ,按如下说明在 创建仓库密钥 对话框补充镜像仓库的密钥:
名称 :容器使用的镜像的仓库名称。
以使用镜像仓库 CR 中的镜像为例,则此处填写镜像所在的 OCI 制品仓库名称。仓库域名 :填写镜像仓库域名,示例:cr-cn-beijing.volces.com
。用户名 :登录镜像仓库的用户名。
以使用镜像仓库 CR 中的镜像为例,则此处填写镜像所在实例的登录用户名。可在 镜像仓库控制台 目标实例的 概览 页面获取。密码 :镜像仓库登录用户名对应的密码。注意
不使用免密组件,且需要拉取私有镜像时,必须配置该参数。
资源配额
可选。按照业务需求,在容器维度配置 CPU 和内存的上下限,保障容器的健康运行。
注意
如果不设置资源配额和限额,则 K8s 会尽最大可能向工作负载提供资源,但是相应的优先级会降低。例如,另一个配置了资源配额和限额的工作负载,会更容易抢占到资源。
CPU配额 :容器需要使用的最小 CPU 核数。单位:Core。使用一位小数表示。取值范围:0.1 ~ 128.0。CPU限额 :允许容器使用的最大 CPU 核数。单位:Core。使用一位小数表示。取值范围:0.1 ~ 128.0。
如果 CPU 超过限额,容器会被终止。内存配额 :容器需要使用的最小内存值。单位:MB 或 GB。使用整数表示。取值范围:0 MB ~128 GB。内存限额 :允许容器使用的内存最大值。单位:MB 或 GB。使用整数表示。取值范围:0 MB ~128 GB。
如果内存超过限额,容器会被终止。特权级容器
默认不开启。开启后特权级容器表示赋予该容器特权,允许访问宿主机全部资源。支持部署在 Linux 系统上的容器控制网络堆栈或访问设备。
Init容器
默认不开启。开启后表示将该容器设置为Init容器。Init容器是 Pod 中运行在应用容器前的容器,并且它可以包括仅在安装过程中使用的工具(例如 python、dig)和代码,避免在应用容器中的重复部署,提升应用镜像的安全性。
Init容器不支持设置生命周期管理中的启动后处理、停止前处理,不支持开启健康检查。
容器端口
端口
可选。支持将容器内端口号与宿主机的端口号进行映射。支持 UDP 和 TCP 两种协议。单击 + 添加端口映射。可以添加多个端口映射。
环境变量
环境变量
可选。支持手动设置环境变量和引用实例字段作为环境变量。Kubernetes 在创建 Pod 时,会将环境变量的信息注入到容器中。
单击 + 添加一个环境变量。您可以添加多个环境变量。
对于 手动配置 类型的环境变量,您需要设置环境变量的 变量名 和 变量值 ;对于 实例字段 类型的环境变量,您需要设置环境变量的 变量名 并选择一个实例字段作为 变量值 。可选择的实例字段包括:
metadata.name:工作负载的名称。 metadata.namespace:工作负载所处的命名空间。 spec.nodeName:工作负载所处的节点。 spec.serviceAccountName:所使用的服务账号。 status.hostIP:工作负载所处节点的 IP。 status.podIP:工作负载中 Pod 的 IPv4 地址。 status.podIPs:工作负载中 Pod 的 IPv4 和 IPv6 地址。 存储配置
存储卷
可选。在容器中存储数据分两步:先在 Pod 定义存储卷,也就是添加存储卷,然后在容器挂载卷。
单击 添加存储卷 ,添加存储卷。存储卷是容器中存储数据的位置。为一类数据分配存储资源前,需要先在容器中指定待存储数据的目录。
可以添加的存储卷分为以下类型:
临时目录 :在临时目录下添加存储卷。主机目录 :在主机下的指定目录下添加存储卷。配置文件 :配置文件对应 K8s 中的 ConfigMap 对象。
您必须先在 配置管理 页面创建一个配置文件,然后可以将配置文件作为数据卷挂载。密钥文件 :密钥文件对应 K8s 中的 Secret 对象。
您必须先在 配置管理 页面创建一个密钥文件,然后可以将该密钥文件作为数据卷挂载。挂载卷
可选。支持将宿主机的卷挂载到容器上,可以挂载多个卷。
单击 添加挂载卷 ,为已创建的卷分配存储资源,并分配读写权限。
支持通过 subPath 方式挂载卷的子目录;支持通过 subPathExpr 方式挂载卷的扩展路径。
设备挂载
设备挂载
可选。选择是否开启设备挂载。
开启设备挂载表示允许容器使用宿主机的设备资源。
生命周期
启动命令
可选。
运行命令 :输入容器启动前运行的命令。多行命令使用换行符分隔。运行参数 :输入容器启动前所运行命令的参数。启动后处理
可选。输入容器启动后需要运行的命令。多行命令使用换行符分隔。
停止前处理
可选。输入容器停止需要运行的命令。多行命令使用换行符分隔。
访问设置 (创建无头服务)
配置项
说明
名称
为无头服务设置一个名称。输入要求如下:
允许使用英文小写字母、数字、连字符(-)。 长度不超过 63 个字符。只能以小写字母开头。不能以连字符(-)结尾,不能连续使用连字符。 端口
设置无头服务要暴露的端口。在无头服务中,暴露的端口通常是与应用服务相关的,比如,如果后端 Pod 运行的是 HTTP 服务器,那么通常暴露 80(HTTP)或者 443(HTTPS)端口。
最多允许添加 10 个端口。
发布策略
配置项
说明
发布策略
选择一种发布策略。可选项:
滚动更新 : 当有状态负载的模板发生更改时,控制器会自动地按照顺序更新 Pod。这种方法可以使您在更新过程中,服务仍然可用。删除时更新 : 当有状态负载的模板发生更改时,新的 Pod 不会马上被创建,只有当您手动删除旧的 Pod 时,才会创建新的 Pod。这种方式相对更加的一种手动的更新方式,适用于需要更细粒度控制的场合。标签
为工作负载添加标签。您可以使用标签来标识一个 Pod 所属的应用程序、环境、版本等信息,从而方便您查找和管理 Pod。标签的示例:environment: production
、app:nginx
。
标签由键值对(key-value)组成,其中键和值都是字符串类型。
标签 key 包含两个部分:可选的前缀和标签名。这两部分之间使用斜杠(/)分隔。
标签名部分是必须的。
标签名允许使用英文大小写字母、数字及连字符(-)、下划线(_)和半角句号(.),并且开头和结尾必须是英文大小写字母、数字。长度不超过 63 个字符。 标签前缀部分是可选的。
标签前缀是由半角句号(.)连接的一组 DNS 标签,长度不超过 253 个字符。 如果省略标签前缀,则标签的 key 将被认为是专属于用户的。 标签 value 是必须的。
允许使用英文大小写字母、数字、连字符(-)、下划线(_)和半角句号(.)。长度不超过 63 个字符。特殊字符不允许用在开头和结尾,并且不能连用。 最多允许为工作负载指定 64 个标签。
配置部署节点 。
工作负载支持两种部署方式:部署到指定节点、部署到节点组。
部署到指定节点:
设置 配置部署 为 节点 ,然后从 全部节点 列表选择一个或多个节点,以将工作负载部署到选择的节点。 部署到节点组:
设置 配置部署 为 节点组 ,然后从 全部节点组 列表选择一个节点组,以将工作负载部署到该节点组包含的所有节点。
选定节点或节点组后,单击 立即部署 。 创建工作负载后,您可以在工作负载列表查看工作负载的状态。当工作负载已经就绪,表示工作负载已成功部署到节点上。
YAML创建 根据以下说明,完成 创建工作负载 配置向导:
配置工作负载 。
您需要提供编写好的 YAML 文件,通过 YAML 文件定义工作负载的规范和预期状态。从以下方式中选择一种方式,提供 Yaml 文件:
在 Yaml 输入框中填写 YAML 文件的内容。 单击 Yaml 输入框旁边的上传图标,从本地上传编写好的 Yaml 文件。
完成后单击 下一步:配置部署节点 。
以下是一个示例 YAML 文件,用于创建一个有状态的 Nginx 工作负载: apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-statefulset
spec:
serviceName: "nginx"
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
在这个 YAML 文件中,我们定义了一个名为 nginx-statefulset
的 Statefulset 对象,它包含了 2 个 Pod 副本。每个 Pod 包含一个名为 nginx
的容器。
配置部署节点 。
工作负载支持两种部署方式:部署到指定节点、部署到节点组。
部署到指定节点:
设置 配置部署 为 节点 ,然后从 全部节点 列表选择一个或多个节点,以将工作负载部署到选择的节点。 部署到节点组:
设置 配置部署 为 节点组 ,然后从 全部节点组 列表选择一个节点组,以将工作负载部署到该节点组包含的所有节点。
选定节点或节点组后,单击 立即部署 。 创建工作负载后,您可以在工作负载列表查看工作负载的状态。当工作负载已经就绪,表示工作负载已成功部署到节点上。