You need to enable JavaScript to run this app.
导航

创建无状态负载

最近更新时间2024.02.02 11:21:00

首次发布时间2022.03.04 23:10:38

在运行中始终不保存任何数据或状态的工作负载称为无状态负载,对应 Kubernetes 中的 Deployment。用户可以通过镜像在集群中创建一个无状态负载。本文介绍如何创建无状态负载应用。

前提条件

通过控制台创建

  1. 登录无状态负载页面。
    1. 登录 容器服务管理控制台
    2. 单击左侧导航栏中的 集群
    3. 在集群列表页面,单击需要创建无状态负载的目标集群。
    4. 在集群管理页面的左侧导航栏中,单击 工作负载 > 无状态负载
  2. 在无状态负载页面,单击 创建无状态负载
  3. 配置无状态负载信息。
    1. 配置基本信息。完成后单击页面右下角 下一步:容器配置
      alt
      参数说明
      名称根据系统提示,配置无状态负载的名称。在同一个命名空间下,名称必须唯一。
      命名空间选择无状态负载部署的命名空间,支持选择自定义创建的命名空间或 Kubernetes 自建的命名空间。Kubernetes 自建命名空间的说明,请参见 命名空间概述
      实例个数输入无状态负载的 Pod 实例个数。

      标签

      填写无状态负载的标签,对应 Kubernetes 中的 Label,用于识别无状态负载的键值对,配合选择器,帮助 Kubernetes 快速筛选目标无状态负载。例如service.istio.io/canonical-revision:latest
      单击 添加标签,根据界面提示输入

      注解

      填写无状态负载的注解信息,对应 Kubernetes 中的 Annotation,主要记录用于应用部署、安全策略、调度策略的附加信息,不用于标识和区分资源。
      单击 添加注解,根据界面提示输入

      算力类型

      VPC-CNI 网络模型的集群显示该参数。选择部署工作负载的基础设施资源,有如下两种算力类型:

      • 云服务器实例 ECS:在集群中的云服务器节点(Node)上部署该工作负载。
      • 弹性容器实例 VCI:在集群中的弹性容器实例(VCI),即虚拟节点(VirtualNode)上部署该工作负载。弹性容器实例相关介绍,请参见 什么是弹性容器实例
      日志采集算力类型 选择 以弹性容器实例方式部署 后显示该参数。要开启后采集弹性容器实例日志。详细说明,请参见 通过日志服务采集 VCI 容器日志
    2. 配置容器信息。配置完成后单击页面右下角 下一步:高级配置
      • 基本信息
        alt
        参数说明
        容器名称根据系统提示的命名规则,输入容器名称。同一个工作负载下容器名称必须唯一。

        容器镜像

        容器使用的镜像。支持使用第三方镜像和镜像仓库 CR 中的镜像:

        • 第三方镜像:直接输入第三方镜像仓库地址(包括镜像 Tag),例如:example.com/namespace/repository:v1
        • 镜像仓库 CR 中的镜像:单击 选择镜像,从右侧弹出的面板中选择目标镜像仓库实例下的镜像。

          说明

          • 若需要使用 CR 中的私有镜像,请先安装 cr-credential-controller 免密组件。详细操作,请参见 使用免密组件拉取私有镜像创建工作负载
          • 若不使用 cr-credential-controller 免密组件拉取私有镜像,则需要配置 镜像密钥
          • 使用 CR 标准版实例中的镜像时,若您的标准版实例未配置当前集群所在 VPC 的访问控制权限,需要根据系统提示配置。详细操作,请参见 镜像安全

        镜像版本

        选择镜像的版本,不选择则默认拉取latest版本。

        注意

        • 如果镜像不存在latest版本,此处必须填写或选择镜像版本。
        • 使用第三方镜像时,无需配置该参数。

        镜像密钥

        默认不开启。开启后需要配置镜像仓库密钥。选择已有的仓库密钥或单击 创建仓库密钥,按如下说明在容器服务侧补充镜像仓库的密钥:

        • 名称:容器使用的镜像的仓库名称。以使用镜像仓库 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 容器不支持设置生命周期管理中的启动后处理、停止前处理,不支持开启健康检查。

      • 容器端口
        单击 添加端口,根据界面提示,配置容器中应用对容器外服务的连接端口,包括支持的协议(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 协议或执行具体命令的方式,探测容器中的负载是否正常。以下以配置存活检查为例,介绍配置参数。
        alt
        配置项说明

        检查方式

        配置检查的方式,包括:

        • HTTP 请求检查:使用 HTTP 或 HTTPS 协议,向容器发送一个 HTTP Get 请求,通过检查响应确认容器状态。您需要进行如下检查配置:
          • 协议:HTTP 或 HTTPS。
          • HTTP 请求头:HTTP 请求中自定义的请求头(HTTP Headers)。单击 添加 输入键值对的配置方式。
          • 路径:访问 HTTP Server 的路径。
          • 端口:容器暴露的访问端口号或端口名称。
        • TCP 端口检查:向容器发送一个 TCP Socket,Kubelet 将尝试在指定端口上打开容器的 Socket。 如果可以建立连接,容器被认为是健康的,如果不能就认为是失败的。您需要进行如下检查配置:
          • 端口:容器暴露的访问端口号或端口名称。
        • 执行命令检查:在容器内执行指定的命令,通过检查命令执行的结果确认容器状态。 您需要进行如下检查配置:
          • 命令:检测容器健康情况的探测命令。

        时间设置

        配置检查的时间参数,包括:

        • 初始等待时间:指容器启动后,第一次执行探测时需要等待的时间,默认为 1 秒。
        • 超时时间:指发送检查请求后,等待响应的超时时间。超过此时间表示容器无响应,默认为 1 秒。
        • 检查间隔:相邻两次检查的时间间隔。默认为 10 秒。

        阈值设置

        配置检查的结果阈值。包括:

        • 成功阈值:检查请求发送后,表示系统正常的响应次数,默认为 1 次。该项不可配置。
        • 失败阈值:检查请求发送后,表示系统异常的无响应次数,默认为 3 次。即如果容器对请求 3 次无响应,则认为容器状态异常。
    3. 配置无状态负载的高级配置。
      • 配置实例参数。
        alt
        配置项说明
        优雅退出优雅时间是指实例终止前的缓冲时间,默认为 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 角色运行将会启动失败。
  4. 单击页面右下角的 确定,完成无状态负载创建。

通过 kubectl 命令行创建

说明

通过 kubectl 命令行创建无状态负载前请确保:

  • 已安装 kubectl 工具到本地。具体操作说明,请参见 安装和设置 kubectl
  • 已通过 kubectl 连接目标集群。具体操作说明,请参见 连接集群
  1. 创建工作负载的 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
    
  2. 执行以下命令,创建工作负载。
    kubectl apply -f deployment-demo.yaml
    

操作结果

操作完成后可以在 工作负载 > 无状态负载 页面查看工作负载的状态。