使用镜像创建无状态应用

使用镜像创建无状态应用

无状态工作负载不会保存任何数据或状态,例如Nginx。您可以通过镜像、编排模板及命令行创建一个无状态应用。通过私有镜像创建应用时,您还可以通过容器服务控制台为私有镜像设置密钥,以确保镜像安全。本文介绍如何在容器服务控制台上使用镜像创建无状态应用。

前提条件

已创建 ACK Serverless集群 。具体操作,请参见 创建ACK Serverless集群

步骤一:配置应用基本信息

  1. 登录 容器服务管理控制台 ,在左侧导航栏选择 集群

  2. 集群列表 页面,单击目标集群名称,然后在左侧导航栏,选择 工作负载 > 无状态

  3. 无状态 页面,单击 使用镜像创建

  4. 应用基本信息 页面,设置应用的基本信息。

    在配置Deployment负载之前,您需要在页面顶部设置应用所在的命名空间。本例中设置命名空间为 default ,应用类型为 无状态(Deployment)

    配置项

    描述

    应用名称

    设置应用的名称。

    副本数量

    应用包含的Pod数量。

    类型

    定义资源对象的类型,可选择 无状态(Deployment) 有状态(StatefulSet) 任务(Job) 定时任务(CronJob)

    标签

    为该应用添加一个标签,标识该应用。

    注解

    为该应用添加一个注解(Annotation)。

  5. 单击 下一步 。进入 容器配置 页面。

步骤二:配置容器

容器配置 页签中,配置容器的镜像与资源、端口、环境变量、健康检查、生命周期、数据卷等。

说明

容器配置 页签上方,单击 添加容器 为应用的Pod设置多个容器。

  1. 基本配置 区域,完成容器的基本配置。

    配置项

    描述

    镜像名称

    • 选择镜像

      您可以单击 选择镜像 ,选择所需的镜像。支持选择以下三种类型的镜像。

      • 容器镜像服务企业版 :可以选择托管在容器镜像服务ACR中的企业版镜像。需要选择镜像所属地域,以及镜像服务实例。关于ACR的更多信息,请参见 什么是容器镜像服务ACR

      • 容器镜像服务个人版 :可以选择托管在容器镜像服务ACR中的个人版镜像。需要选择镜像所属地域,以及镜像服务实例。

      • 制品中心 :包含应用容器化基础OS镜像、基础语言镜像、AI/大数据相关镜像,本示例以制品中心的Nginx镜像为例说明。关于制品中心的更多信息,请参见 制品中心

        说明

        容器镜像服务ACR提供制品中心便于您的基础镜像使用,这些基础镜像由阿里云或者龙蜥社区做版本更新及安全修复。如果您有额外的镜像需求或者问题,请加入钉钉群33605007047进行咨询。

      您还可以填写私有镜像。填写的格式为 domainname/namespace/imagename:tag

    • 选择镜像拉取策略

      ACK支持以下三种镜像拉取策略(imagePullPolicy):

      • 优先使用本地镜像(IfNotPresent) :如果本地有该镜像(之前拉取过该镜像至宿主机中),则使用本地镜像,本地不存在时拉取镜像。

      • 总是拉取镜像(Always) :表示每次部署或扩容都会从容器镜像服务重新拉取镜像,而不会从本地拉取镜像。

      • 仅使用本地镜像(Never) :仅使用本地镜像。

      说明

      当您选中 镜像拉取策略 时,默认不设置镜像拉取策略。

    • 设置镜像密钥

      您可以单击 设置镜像密钥 ,为私有镜像设置密钥以确保安全。

    所需资源

    即为该应用预留资源额度,包括 CPU 内存 两种资源,即容器独占这些资源,防止因资源不足而被其他服务或进程争夺资源,导致应用不可用。

    容器启动项

    • stdin :将控制台输入发送到容器。

    • tty :将标准输入控制台作为容器的控制台输入。

    初始化容器

    选中该项,表示创建一个Init Container。Init Container包含一些实用的工具。更多信息,请参见 Init Containers

  2. 端口设置 区域,单击 新增 设置容器的端口。

    • 名称 :设置容器端口名称。

    • 容器端口 :设置暴露的容器访问端口或端口名,端口号必须介于1~65535。

    • 协议 :支持TCP和UDP。

  3. 环境变量 区域,单击 新增 设置环境变量。

    说明

    如需配置环境变量,请确保已创建配置项或密钥。如需创建,请参见 管理配置项 管理保密字典

    支持通过键值对的形式为Pod配置环境变量。用于给Pod添加环境标志或传递配置等。更多信息,请参见 Pod variable

    • 类型 :设置环境变量的类型,支持 自定义 配置项 保密字典 变量/变量引用 资源引用 类型。配置项、密钥支持全部文件的引用。以密钥为例,

      选择 保密字典 ,选择 变量 ,默认全部文件引用。

      对应的YAML,则引用了整个Secret。 yaml

    • 变量名称 :设置环境变量名称。

    • 变量/变量引用 :设置变量引用的值。

  4. 健康检查 区域,根据需要开启 存活检查 就绪检查

    说明

    如需配 置健康检查 ,请在 基础配置 区域,关闭 初始化容器 开关。

    关于健康检查的更多信息,请参见 Configure Liveness, Readiness and Startup Probes

    参数

    请求类型

    配置说明

    • 存活检查 (Liveness):用于检测何时重启容器。

    • 就绪检查 (Readiness):确定容器是否已经就绪,且可以接受流量。

    • 启动探测 (Startup Probes):用于检测何时启动容器。

      说明

      仅Kubernetes集群1.18及之后版本支持启动探测。

    HTTP请求

    即向容器发送一个HTTP GET请求,支持的参数包括:

    • 协议 HTTP / HTTPS

    • 路径 :访问HTTP Server的路径。

    • 端口 :容器暴露的访问端口或端口名,端口号必须介于1~65535。

    • Http头 :即HTTP Headers,HTTP请求中自定义的请求头,HTTP允许重复的Header。支持键值对的配置方式。

    • 延迟探测时间 (秒):即 initialDelaySeconds ,容器启动后第一次执行探测时需要等待多少秒,默认为3秒。

    • 执行探测频率 (秒):即 periodSeconds ,指执行探测的时间间隔,默认为10秒,最小为1秒。

    • 超时时间 (秒):即 timeoutSeconds ,探测超时时间。默认1秒,最小1秒。

    • 健康阈值 :探测失败后,最少连续探测成功多少次才被认定为成功。默认是1,最小值是1。对于存活检查(liveness)必须是1。

    • 不健康阈值 :探测成功后,最少连续探测失败多少次才被认定为失败。默认是3,最小值是1。

    TCP连接

    即向容器发送一个TCP Socket,Kubelet将尝试在指定端口上打开容器的套接字。 如果可以建立连接,容器被认为是健康的,如果不能就认为是失败的。支持的参数包括:

    • 端口 :容器暴露的访问端口或端口名,端口号必须介于1~65535。

    • 延迟探测时间 (秒):即 initialDelaySeconds ,容器启动后第一次执行探测时需要等待多少秒,默认为15秒。

    • 执行探测频率 (秒):即 periodSeconds ,指执行探测的时间间隔,默认为10秒,最小为1秒。

    • 超时时间 (秒):即 timeoutSeconds ,探测超时时间。默认1秒,最小1秒。

    • 健康阈值 :探测失败后,最少连续探测成功多少次才被认定为成功。默认是1,最小值是1。对于存活检查(liveness)必须是1。

    • 不健康阈值 :探测成功后,最少连续探测失败多少次才被认定为失败。默认是3,最小值是1。

    命令行

    通过在容器中执行探针检测命令,来检测容器的健康情况。支持的参数包括:

    • 命令行 :用于检测容器健康情况的探测命令。

    • 延迟探测时间 (秒):即 initialDelaySeconds ,容器启动后第一次执行探测时需要等待多少秒,默认为5秒。

    • 执行探测频率 (秒):即 periodSeconds ,指执行探测的时间间隔,默认为10秒,最小为1秒。

    • 超时时间 (秒):即 timeoutSeconds ,探测超时时间。默认1秒,最小1秒。

    • 健康阈值 :探测失败后,最少连续探测成功多少次才被认定为成功。默认是1,最小值是1。对于存活检查(liveness)必须是1。

    • 不健康阈值 :探测成功后,最少连续探测失败多少次才被认定为失败。默认是3,最小值是1。

  5. 生命周期 区域,设置容器的生命周期。

    您可以为容器的生命周期配置启动执行、启动后处理和停止前处理。具体操作,请参见 配置生命周期

    • 启动执行 :为容器设置预启动命令和参数。

    • 启动后处理 :为容器设置启动后的命令。

    • 停止前处理 :为容器设置预结束命令。

  6. 数据卷 区域,增加本地存储、云存储声明PVC(Persistent Volume Claim)或NAS等。

    支持增加以下存储卷:

    • 本地存储

    • 云存储声明(PersistentVolumeClaim)

    • NAS

    • 云盘

    更多信息,请参见 使用云盘静态存储卷 使用云盘动态存储卷 使用NAS静态存储卷 等。

  7. 在日志服务区域,配置日志相关参数。具体操作,请参见 使用镜像创建

  8. 单击 下一步 ,进行高级设置。

步骤三:完成高级配置

高级配置 页签中设置访问、伸缩和标签注解。

  1. 访问设置 区域,设置暴露后端Pod的方式。

    说明

    针对应用的通信需求,您可灵活进行访问设置:

    • 内部应用:对于只在集群内部工作的应用,您可以在创建服务时,根据需要选择 虚拟集群IP 节点端口 类型的服务,来进行内部通信。

    • 外部应用:对于需要暴露到公网的应用,您可以采用两种方式进行访问设置。

      • 创建负载均衡类型的服务:您可以在创建服务时,选择 负载均衡 类型的服务。通过阿里云提供的负载均衡服务SLB(Server Load Balancer),使得该服务提供公网访问能力。

      • 创建路由(Ingress):通过创建路由(Ingress)提供公网访问能力。更多信息,请参见 Ingress

    您可以设置暴露后端Pod的方式。本例中选择虚拟集群IP和路由(Ingress),构建一个公网可访问的Nginx应用。

    • 配置服务(Service):在 服务(Service) 右侧,单击 创建 设置创建服务配置项。

      配置项

      描述

      名称

      输入服务的名称。本例为nginx-svc。

      类型

      选择服务类型,即服务访问的方式。本例中选择 负载均衡

      • 虚拟集群IP :即ClusterIP,指通过集群的内部IP暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的ServiceType。

        说明

        您的服务类型为 虚拟集群IP 时,才能设置 实例间发现服务(Headless Service)

      • 负载均衡 :即LoadBalancer,指阿里云提供的负载均衡服务(SLB),可选择公网访问或私网访问。阿里云负载均衡服务可以路由到NodePort服务和ClusterIP服务。

        • 新建SLB:您可以通过单击 修改 ,修改SLB规格。

        • 使用已有SLB:您可以在已有的列表中选择SLB规格。

        说明

        负载均衡类型支持新建SLB和使用已有SLB,且多个Kubernetes Service可以复用同一个SLB,但是存在以下限制:

        • 使用已有的负载均衡实例会强制覆盖已有监听。

        • Kubernetes通过Service创建的SLB不能复用(会导致SLB被意外删除)。只能复用您手动在控制台(或调用OpenAPI)创建的SLB。

        • 复用同一个SLB的多个Service不能有相同的前端监听端口,否则会造成端口冲突。

        • 复用SLB时,监听的名称以及虚拟服务器组的名称被Kubernetes作为唯一标识符。请勿修改监听和虚拟服务器组的名称。

        • 不支持跨集群复用SLB。

      端口映射

      添加服务端口和容器端口。容器端口需要与后端的Pod中暴露的容器端口一致。本文示例值为:

      服务端口 :80

      容器端口 :80

      外部流量策略

      • Local:流量只发给本机的Pod。

      • Cluster:流量可以转发到其他节点上的Pod。

      说明

      您的服务类型为 节点端口 负载均衡 时,才能设置 外部流量策略

      注解

      为该服务添加一个注解(annotation),配置负载均衡的参数。例如设置 service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:20 表示将该服务的带宽峰值设置为20 Mbit/s,从而控制服务的流量。更多信息,请参见 通过Annotation配置传统型负载均衡CLB

      标签

      为该服务添加一个标签,标识该服务。

    • 配置路由(Ingress):在 路由(Ingress) 右侧,单击 创建 设置后端Pod的路由规则。

      详细的路由配置信息,请参见 路由配置说明

      重要

      通过镜像创建应用时,您仅能为一个服务创建路由(Ingress)。本例中使用一个虚拟主机名称作为测试域名,您需要在Hosts文件中添加一条域名映射( Ingress外部端点 + Ingress域名 )。在实际工作场景中,请使用备案域名。

      101.37.XX.XX   foo.bar.com    #即Ingress的IP。

      Ingress的IP获取方式:在应用详情页面,单击 访问方式 页签, 外部端点 显示的IP即为Ingress的IP。

      配置项

      说明

      名称

      输入路由的名称。本例为 nginx-ingress

      规则

      路由规则是指授权入站到达集群服务的规则。更多信息,请参见 路由配置说明

      • 域名 :输入Ingress域名。本例中使用测试域名 foo.bar.com

      • 路径 :指定服务访问的URL路径,默认为根路径 / ,本例中不做配置。每个路径(Path)都关联一个Backend(服务),在阿里云SLB将流量转发到Backend之前,所有的入站请求都要先匹配域名和路径。

      • 服务 :选择服务的名称和对应端口。本例中为 nginx-svc

      • 开启TLS :配置安全的路由服务。更多信息,请参见 Nginx Ingress高级用法

      服务权重

      设置该路径下多个服务的权重。服务权重采用相对值计算方式,默认值为100。

      灰度发布

      开启灰度发布开关。此处建议选择社区版。

      Ingress Class

      自定义Ingress的类。

      注解

      单击 添加 按钮,输入注解名称和值,即Ingress的Annotation键值对。关于Ingress的注解,请参见 Annotations

      标签

      为Ingress添加对应的标签,标示该Ingress的特点。

    访问设置 区域,您可以看到创建完毕的服务和路由,您可单击 变更 删除 进行二次配置。

  2. 伸缩配置 区域,勾选是否开启 指标伸缩 定时伸缩 ,从而满足应用在不同负载下的需求。

    容器服务支持容器组的弹性伸缩,即根据容器CPU和内存资源占用情况自动调整容器组数量。

    说明

    若要启用自动伸缩,您必须为容器设置所需资源,否则容器自动伸缩无法生效。

    配置项

    说明

    指标

    支持CPU和内存,需要和设置的所需资源类型相同。

    触发条件

    资源使用率的百分比,超过该使用量,容器开始扩容。

    最大副本数

    该应用可扩容的容器数量上限。

    最小副本数

    该应用可缩容的容器数量下限。

  3. 标签和注释 区域,单击 添加 设置容器组的标签和注释。

    • Pod标签:为该Pod添加一个标签,标识该应用。

    • Pod注解:为该Pod添加一个注解(Annotation)。

  4. 单击 创建

步骤四:查看应用

创建完成 页签中查看应用任务。

  1. 创建完成 页签中单击 查看应用详情 。您可以看到新建的 serverless-app-svc 出现在无状态列表下。

    部署列表

  2. 在集群管理页左侧导航栏中,选择 网络 > 服务 ,可以看到新建的服务 serverless-app-svc 出现在服务列表下。

    服务列表

  3. 在浏览器中访问外部端点或域名,您可访问Nginx欢迎页,本示例为Nginx。

    重要
    • 浏览器访问时,需保证服务访问的方式为 负载均衡

    • 使用域名访问时,需配置Host文件。具体操作,请参见 说明

    nginx