首页 容器计算服务 操作指南 应用管理 工作负载 创建无状态工作负载Deployment

创建无状态工作负载Deployment

更新时间: 2024-01-17 10:15:29

您可以通过镜像、编排模板及命令创建一个无状态应用。容器计算服务Kubernetes集群支持通过Web界面使用镜像密钥。本文以Nginx为例,说明如何通过镜像、编排模板及命令来创建无状态应用。

前提条件

使用镜像创建无状态Deployment应用

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

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

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

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

  4. 应用基本信息配置向导页面中,设置应用的基本信息。

    在配置Deployment负载前,您需在页面上方设置应用所在的命名空间。本例使用默认命名空间default。

    配置项

    描述

    应用名称

    应用的名称。

    副本数量

    即应用包含的Pod数量,默认数量为2。

    工作负载

    定义资源对象的类型,本例中选择无状态(Deployment)类型。

    标签

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

    注解

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

    实例类型

    选择实例类型。

    容器运行退出后

    • 总是重启

    • 失败后重启

    • 永不重启

  5. 单击下一步

    进入容器配置配置向导页面。

步骤二:配置容器

容器配置配置向导页面中,配置容器的镜像、资源、端口、环境变量、健康检查、生命周期、数据卷和日志。

说明

容器1页签右侧,单击添加容器为应用的Pod设置多个容器。

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

    配置项

    描述

    镜像名称

    单击选择镜像,选择所需的镜像并单击确定。本文以官方Nginx镜像为例,可以在搜索页签中,选择Docker镜像,然后在文本框中输入nginx进行搜索。

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

      说明

      您可以在容器镜像服务页签,根据名称搜索托管在容器镜像服务ACR中的镜像。

    • Docker官方镜像:在Docker官方镜像页签中,可以选择Docker官方提供的容器镜像。

    • 用户收藏:在用户收藏页签中,可以选择您收藏的Docker官方镜像。

    • 搜索:在搜索页签中,可以分别在ACR的特定地域和Docker官方镜像中搜索容器镜像。

    镜像Tag

    • 单击选择镜像Tag选择镜像的版本。若不指定,默认为最新版。

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

    CPU

    可指定该容器预留的CPU资源额度和资源限制,默认资源额度和资源限制相等。如果需要设置不同于资源额度的资源限制,可以通过YAML创建资源方式来创建应用。

    内存

    可指定该容器预留的Memory资源额度和资源限制,默认资源额度和资源限制相等。如果需要设置不同于资源额度的资源限制,可以使用YAML创建资源的方式来创建应用。

    容器启动项

    • stdin:表示为该容器开启标准输入。

    • tty:表示为该容器分配一个虚拟终端,以便于向容器发送信号。

    通常这两个选项是一起使用的,表示将终端(tty)绑定到容器的标准输入(stdin)上。例如,一个交互式的程序从用户获取标准输入,并显示到终端中。

    初始化容器

    勾选该项,表示创建一个Init Container。

    Init Container提供了一种机制来阻塞或延迟应用容器的启动,Init Container执行成功后,Pod内的应用容器会并行启动,例如检测依赖服务的可用性。Init Container可以包括一些应用镜像中不存在的实用工具和安装脚本,用来初始化应用容器的运行环境,例如设置内核参数、生成配置文件。更多信息,请参见Init Containers

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

    配置项

    描述

    名称

    设置容器端口名称。

    容器端口

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

    协议

    支持TCP和UDP。

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

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

    配置项

    描述

    类型

    设置环境变量的类型。

    配置项、保密字典支持全部文件的引用,以保密字典为例。选择保密字典类型,只选择目标保密字典,则默认引用全部文件。环境变量

    对应的YAML,也引用了整个密钥(Secret)。yaml

    变量名称

    设置环境变量名称。

    变量/变量引用

    设置变量引用的值。

  4. 可选:健康检查区域,根据需要开启存活检查就绪检查启动探测

    更多信息,请参见配置存活、就绪和启动探测器

    展开查看探针选项

    配置项

    请求类型

    配置说明

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

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

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

    HTTP请求

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

    TCP连接

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

    命令行

    通过在容器中执行探针检测命令,来检测容器的健康情况。

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

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

    参数

    描述

    启动执行

    为容器设置预启动命令和参数。

    启动后处理

    为容器设置启动后的命令。

    停止前处理

    为容器设置预结束命令。

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

    参数

    描述

    增加本地存储

    本地存储:包括配置项保密字典临时目录,将对应的挂载源挂载到容器路径中。更多信息,请参见volumes

    增加云存储声明(PersistentVolumeClaim)

    支持通过PVC挂载云存储卷。在选择目标挂载源前,您需要创建云存储声明。

    本例中配置了一个云存储类型的数据卷声明disk-ssd,将其挂载到容器的/tmp路径下。配置数据卷

  7. 单击下一步

    进入高级配置配置向导页面。

步骤三:完成高级配置

高级配置配置向导页面中设置访问、伸缩、调度和标签注解。

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

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

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

      配置服务(Service)

      配置项

      描述

      名称

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

      类型

      选择服务类型,即服务访问的方式。

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

        说明

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

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

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

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

        说明

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

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

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

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

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

        • 不支持跨集群复用SLB。

      本例中选择虚拟集群IP

      端口映射

      添加服务端口和容器端口。容器端口需要与后端的Pod中暴露的容器端口一致。

      外部流量策略

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

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

      说明

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

      注解

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

      标签

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

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

      配置路由(Ingress)

      说明

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

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

      配置项

      描述

      名称

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

      规则

      路由规则是指授权入站到达集群服务的规则。更多信息,请参见创建Nginx Ingress

      • 域名:输入Ingress域名。

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

      • 服务:选择服务的名称和对应端口。

      • 开启TLS:配置安全的路由服务。具体操作,请参见Ingress高级用法

      本例中使用测试域名foo.bar.com;设置服务为nginx-svc。

      灰度发布

      设置灰度规则后,请求头中满足灰度发布匹配规则的请求才能被路由到新版本服务中。如果该服务设置了100%以下的权重比例,满足灰度规则的请求会继续依据权重比例路由到对应服务。容器服务支持多种流量切分方式,适用于灰度发布以及AB测试场景。

      • 基于Request Header的流量切分。

      • 基于Cookie的流量切分。

      • 基于Query Param的流量切分。

      说明

      目前阿里云容器服务Kubernetes Ingress Controller需要0.12.0-5及其以上版本才支持流量切分特性。

      配置参数如下所示:

      • 服务:路由规则配置的服务。

      • 类型:支持Header(请求头)、CookieQuery(请求参数)的匹配规则。

      • 名称匹配值:您自定义的请求字段,名称和匹配值为键值对。

      • 匹配规则:支持正则匹配和完全匹配。

      注解

      • 单击重定向注解,可为路由添加一条典型的重定向注解。即nginx.ingress.kubernetes.io/rewrite-target:/,表示将/path路径重定向到后端服务能够识别的根路径/上面。

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

      标签

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

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

    说明

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

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

  4. 单击创建

步骤四:查看应用

创建完成配置向导页面中查看应用任务。

  1. 创建应用任务已提交面板中单击查看应用详情

  2. 单击左侧导航栏的路由与负载均衡 > 路由,可以看到路由列表下出现一条规则。

    路由规则

  3. 在浏览器中访问路由测试域名,您可访问Nginx欢迎页。

通过YAML模板创建资源

在容器服务Kubernetes模板编排中,您需要自己定义一个应用运行所需的资源对象,通过标签选择器等机制,将资源对象组合成一个完整的应用。

本例演示如何通过一个编排模板创建Nginx应用,包含一个Deployment和Service,后端Deployment会创建Pod资源对象,Service会绑定到后端Pod上,形成一个完整的Nginx应用。

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

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

  3. 无状态(Deployment)页面,单击右上角的使用YAML创建资源

  4. 对模板进行相关配置,完成配置后单击创建

    下面是一个Nginx应用的示例编排,基于容器服务内置的编排模板。通过该编排模板,即可快速创建一个属于Nginx应用的Deployment。

    说明
    • 容器计算服务支持Kubernetes YAML编排,支持通过---符号将资源对象分隔,从而通过一个模板创建多个资源对象。

    • 可选:在应用中通过Volume方式挂载存储卷时,默认情况下挂载目录下的文件在挂载后将会被覆盖。若要不影响挂载目录下的其他文件,您可以配置subPath参数。

    展开查看 Nginx YAML

    apiVersion: apps/v1 
    kind: Deployment
    metadata:
        name: nginx-deployment-basic
        labels:
          app: nginx
    spec:
        replicas: 2
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx:1.7.9 #replace it with your exactly <image_name:tags>
              ports:
              - containerPort: 80
              volumeMounts:
              - name: nginx-config
                mountPath: /etc/nginx/nginx.conf 
                subPath: nginx.conf   #设置subPath。    
            volumes:
            - name: nginx-config
              configMap:
                name: nginx-conf
    ---
    apiVersion: v1     
    kind: Service
    metadata:
       name: my-service1        #to specify your service name
       labels:
         app: nginx
    spec:
       selector:
         app: nginx             #change label selector to match your backend pod
       ports:
       - protocol: TCP
         name: http
         port: 30080          
         targetPort: 80
       type: LoadBalancer       
    ---
    #存储卷的配置项
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: nginx-conf
      namespace: default
    data:
      nginx.conf: |-
       user  nginx;
       worker_processes  1;
       error_log  /var/log/nginx/error.log warn;
       pid        /var/run/nginx.pid;
       events {
            worker_connections  1024;
        }
        http {
            include       /etc/nginx/mime.types;
            default_type  application/octet-stream;
            log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                              '$status $body_bytes_sent "$http_referer" '
                              '"$http_user_agent" "$http_x_forwarded_for"';
            access_log  /var/log/nginx/access.log  main;
            sendfile        on;
            #tcp_nopush     on;
            keepalive_timeout  65;
            #gzip  on;
            include /etc/nginx/conf.d/*.conf;
        } 

  5. 单击创建后。会提示部署状态信息。

通过命令管理应用

您可以通过命令创建应用或者查看应用的容器。

通过命令创建应用

  1. 执行以下命令启动容器(本示例中为Nginx Web服务器)。

     kubectl run -it nginx --image=registry.aliyuncs.com/spacexnice/netdia:latest
  2. 执行以下命令,为该容器创建一个服务入口,指定--type=LoadBalancer将会为您创建一个阿里云负载均衡路由到该Nginx容器。

    kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer

通过命令查看容器

运行kubectl get pods命令,列出所有default命名空间里正在运行的容器。

NAME                                   READY     STATUS    RESTARTS   AGE
nginx-2721357637-d****                 1/1       Running   1          9h