更新时间:2025-08-12 GMT+08:00

无状态负载

无状态负载与Kubernetes中Deployment Workloads的定义方式相同,是对Pod的服务化封装。一个无状态负载可以包含一个或多个Pod,每个Pod的角色相同,所以系统会自动为无状态负载的多个Pod分发请求。同一无状态负载的所有Pod共享存储卷。

容器组章节介绍了Pod,Pod是创建或部署的最小单位。云容器实例提供了Controller(控制器)来管理Pod,Controller可以创建和管理多个Pod,提供副本管理、滚动升级和自愈能力,其中最为常用的就是Deployment。

一个Deployment可以包含一个或多个Pod副本,每个Pod副本的角色相同,所以系统会自动为Deployment的多个Pod副本分发请求。

Deployment集成了上线部署、滚动升级、创建副本,恢复上线任务,在某种程度上,Deployment可以帮用户实现无人值守的上线,大大降低了上线过程的复杂沟通、操作风险。

图1 无状态负载

通过控制台界面创建无状态负载

  1. 登录云容器实例 CCI2.0控制台。
  2. 左侧导航栏中选择“负载管理 > 无状态负载”,在页面单击“创建工作负载”
  3. 添加基础配置。

    参数

    说明

    负载名称

    请输入以小写字母或数字开头,小写字母、数字、中划线(-)、点(.)组成(其中两点不能相连,点不能与中划线相连),小写字母或数字结尾的1到63字符的字符串。负载名称不支持修改,如需修改名称,需要重新创建。

    命名空间

    选择命名空间,如果还未创建命名空间,请参考命名空间创建。

    CPU架构

    X86计算或鲲鹏。

    实例类型

    通用型或通用型(轻享)。

    说明:

    仅X86计算CPU架构支持通用型(轻享)实例类型。

    vCPUs

    选择vCPU大小,0.25核-64核之间。

    内存

    根据选择的vCPU大小,选择内存大小。

    数据存储(可选)

    为容器提供存储,目前支持临时目录、配置项、密钥,请先为容器组添加数据存储后再挂载到指定容器中。

    单击“添加数据存储”,选择存储卷类型,并输入存储卷名称。

    实例数量

    负载可以有一个或多个Pod,您可以设置具体Pod个数。每个负载Pod都由相同的容器部署而成。设置多个Pod主要用于实现高可靠性,当某个Pod故障时,负载还能正常运行。

  4. 添加容器配置。一个Pod可以包含一个或多个运行不同镜像的容器,通常情况下一个Pod中只有一个容器,如果您的应用程序需要多个容器,请添加容器。

    1. 请单击“添加容器”。
    2. 填写基本信息。
      表1 基本信息

      参数

      说明

      容器名称

      请输入1到63个字符的字符串,可以包含小写英文字母、数字和中划线(-),并以小写英文字母或数字开头,小写英文字母或数字结尾。

      镜像

      选择镜像。

      须知:

      同一个Pod实例中的不同容器如果监听了相同的端口,则会导致端口冲突,Pod可能会启动失败。例如在Pod中添加了一个nginx镜像容器,启动了80端口,如果该Pod中另一个http服务的镜像也启动80端口,那么这个Pod就会出现端口冲突。

      • 我的镜像:展示了您上传到容器镜像服务的镜像。
        说明:
        • 如您是IAM用户,您需要参考(可选)上传镜像进行权限设置后才可使用账号的私有镜像。
        • CCI当前暂不支持对接第三方镜像仓库。
        • 镜像单层解压后的实际大小不能超过20G。
      • 共享镜像:展示了容器镜像服务中他人共享的镜像。
      • 镜像中心:展示了镜像中心的公共镜像。

      镜像版本

      选择镜像的版本。

      vCPUs

      输入值不能小于0或大于剩余规格额度。

      内存

      输入值不能小于0或大于剩余规格额度。

    3. 高级设置(可选):
    • 生命周期:生命周期脚本定义,在容器的生命周期的特定阶段执行调用。详细步骤请参见生命周期
    • 健康检查:健康检查是指容器运行过程中,根据您需要,定时检查容器健康状况。详细步骤请参见健康检查
    • 环境变量:在容器中设置环境变量,支持手动输入和引用变量。环境变量为应用提供极大的灵活性,您可以在应用程序中使用环境变量,在创建容器时为环境变量赋值,容器运行时读取环境变量的值,从而做到灵活地配置,而不是每次都重新编写应用程序制作镜像。

      手动输入只需要直接输入变量名称和变量值。

      变量引用支持引用PodIP(Pod的IP地址)、PodName(Pod的名称)以及Secret,输入变量名称,选择引用类型、引用值。其中Secret引用的创建请参见使用Secret

    • 数据存储:支持挂载数据存储到容器中,以实现容器内的数据访问。
    • 安全设置:支持配置容器的运行用户。

  5. 选择升级策略。

    • 升级策略:升级方式支持“滚动升级”和“替换升级”。
      • 滚动升级:滚动升级将逐步用新版本的实例替换旧版本的实例,升级的过程中,业务流量会同时负载均衡分布到新老的实例上,因此业务不会中断。

        最大无效实例数:每次滚动升级允许的最大无效实例数,如果等于实例数有断服风险(最小存活实例数 = 实例数 - 最大无效实例数)。

      • 替换升级:先删除旧实例,再创建新实例。升级过程中业务会中断。

  6. 配置完成后,单击“创建工作负载”。

    在负载列表中,待负载状态为“运行中”,负载创建成功。您可以单击负载名进入负载详情界面,刷新负载状态。

通过YAML创建无状态工作负载

  1. 登录云容器实例 CCI2.0控制台。
  1. 左侧导航栏中选择“负载管理 > 无状态负载”,在页面单击“YAML创建”
  2. 导入或者添无状态负载YAML,单击“确定”,创建无状态负载。

    Deployment文件格式说明

    • deployment.yaml资源描述
      apiVersion: cci/v2
      kind: Deployment
      metadata:
        annotations:
          description: ''
        labels: {}
        name: nginx
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            annotations:
              vm.cci.io/pod-size-specs: 2.00_4.0
              resource.cci.io/pod-size-specs: 2.00_4.0
              metrics.alpha.kubernetes.io/custom-endpoints: '[{api:'''',path:'''',port:'''',names:''''}]'
              log.stdoutcollection.kubernetes.io: '{"collectionContainers": ["container-0"]}'
            labels:
              app: nginx
          spec:
            containers:
              - image: library/nginx:stable-alpine-perl
                name: container-0
                resources:
                  limits:
                    cpu: 2000m
                    memory: 4096Mi
                  requests:
                    cpu: 2000m
                    memory: 4096Mi
                command: []
                lifecycle: {}
            dnsPolicy: ''
            imagePullSecrets:
              - name: imagepull-secret
            dnsConfig: {}
        minReadySeconds: 0
        strategy:
          type: RollingUpdate
          rollingUpdate:
            maxSurge: 0
            maxUnavailable: 1
    • deployment.json资源描述
      {
      	"apiVersion": "cci/v2",
      	"kind": "Deployment",
      	"metadata": {
      		"annotations": {
      			"description": ""
      		},
      		"labels": {},
      		"name": "nginx"
      	},
      	"spec": {
      		"replicas": 2,
      		"selector": {
      			"matchLabels": {
      				"app": "nginx"
      			}
      		},
      		"template": {
      			"metadata": {
      				"annotations": {
      					"vm.cci.io/pod-size-specs": "2.00_4.0",
      					"resource.cci.io/pod-size-specs": "2.00_4.0",
      					"metrics.alpha.kubernetes.io/custom-endpoints": "[{api:'',path:'',port:'',names:''}]",
      					"log.stdoutcollection.kubernetes.io": "{\"collectionContainers\": [\"container-0\"]}"
      				},
      				"labels": {
      					"app": "nginx"
      				}
      			},
      			"spec": {
      				"containers": [
      					{
      						"image": "library/nginx:stable-alpine-perl",
      						"name": "container-0",
      						"resources": {
      							"limits": {
      								"cpu": "2000m",
      								"memory": "4096Mi"
      							},
      							"requests": {
      								"cpu": "2000m",
      								"memory": "4096Mi"
      							}
      						},
      						"command": [],
      						"lifecycle": {}
      					}
      				],
      				"dnsPolicy": "",
      				"imagePullSecrets": [
      					{
      						"name": "imagepull-secret"
      					}
      				],
      				"dnsConfig": {}
      			}
      		},
      		"minReadySeconds": 0,
      		"strategy": {
      			"type": "RollingUpdate",
      			"rollingUpdate": {
      				"maxSurge": 0,
      				"maxUnavailable": 1
      			}
      		}
      	}
      }

使用ccictl创建负载

云容器实例 CCI2.0支持使用ccictl工具,相比从控制台创建负载,使用ccictl的体验更接近Kubernetes。

约束与限制

已配置ccictl连接到CCI2.0。

操作步骤

  1. 使用命令“ccictl create namespace cci-test”创建命名空间。
  2. 使用命令“ccictl create -f network.yaml”创建网络,yaml示例如下:

    apiVersion: yangtse/v2
    kind: Network
    metadata:
      annotations:
        yangtse.io/domain-id: ${domain-id}
        yangtse.io/project-id: ${project-id}
      name: cci-network
      namespace: cci-test
    spec:
      networkType: underlay_neutron
      securityGroups:
        - ${security-group-id}
      subnets:
        - subnetID: ${subnet-id}

  3. 使用命令“ccictl apply -f deployment.yaml”创建负载,yaml示例如下:

    kind: Deployment
    apiVersion: cci/v2
    metadata:
      name: nginx
      namespace: cci-test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx:latest
              ports:
              - containerPort: 80
              resources:
                limits:
                  cpu: 500m
                  memory: 1Gi
                requests:
                  cpu: 500m
                  memory: 1Gi
          dnsPolicy: Default

  4. 使用命令“ccictl apply -f service.yaml”创建Service,yaml示例如下:

    kind: Service
    apiVersion: cci/v2
    metadata:
      name: service-nginx
      namespace: cci-test
      annotations:
        kubernetes.io/elb.class: elb
        kubernetes.io/elb.id: '${elb_id}'
    spec:
      ports:
        - name: service-nginx-port
          protocol: TCP
          port: 80
          targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer

  5. 使用elb的公网ip和端口,访问nginx服务。

更新无状态负载

  1. 登录云容器实例 CCI2.0控制台。
  2. 左侧导航栏中选择“负载管理 > 无状态负载”,选择需要更新的deployment右侧操作中“YAML编辑”

  3. 编辑修改无状态负载yaml,单击确定,更新无状态负载。

删除Pod

负载创建完后,可以对Pod进行手动删除操作,由于Pod是有控制器在控制,单击删除按钮后会立即重新创建一个新的Pod。手动删除Pod在某些场景下非常有用,比如升级到一半出现失败时、想重启业务进程时。

删除无状态负载

  1. 登录云容器实例 CCI2.0控制台。
  2. 左侧导航栏中选择“负载管理 -> 无状态负载”,选择需要删除的无状态负载,单击操作栏中“删除”,删除负载。