
# 无状态负载
无状态负载与Kubernetes中Deployment Workloads的定义方式相同，是对Pod的服务化封装。一个无状态负载可以包含一个或多个Pod，每个Pod的角色相同，所以系统会自动为无状态负载的多个Pod分发请求。同一无状态负载的所有Pod共享存储卷。
在[容器组](https://support.huaweicloud.com/usermanual-cci2/cci_01_0057.html#cci_01_0057__section75255539102)章节介绍了Pod，Pod是创建或部署的最小单位。云容器实例提供了Controller（控制器）来管理Pod，Controller可以创建和管理多个Pod，提供副本管理、滚动升级和自愈能力，其中最为常用的就是Deployment。一个Deployment可以包含一个或多个Pod副本，每个Pod副本的角色相同，所以系统会自动为Deployment的多个Pod副本分发请求。
Deployment集成了上线部署、滚动升级、创建副本，恢复上线任务，在某种程度上，Deployment可以帮用户实现无人值守的上线，大大降低了上线过程的复杂沟通、操作风险。
图1无状态负载   
![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0198439521.png)
#### 通过控制台界面创建无状态负载
CCI负载访问云服务需要通过VPCEP打通网络，如拉取SWR镜像、访问OBS、调用云服务API等场景。
1. 登录[云容器实例 CCI2.0](https://console.huaweicloud.com/cci2.0/?#/cci/cluster/list)控制台。
2. 左侧导航栏中选择"负载管理 \> 无状态负载"，在页面单击"创建工作负载"。
3. 添加基础配置。 
   
   | 参数       | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   |:---|:---|
   | 负载名称     | 请输入以小写字母或数字开头，小写字母、数字、中划线（-）、点（.）组成（其中两点不能相连，点不能与中划线相连），小写字母或数字结尾的1到63字符的字符串。负载名称不支持修改，如需修改名称，需要重新创建。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | 命名空间     | 选择命名空间，如果还未创建命名空间，请参考[命名空间](https://support.huaweicloud.com/usermanual-cci2/cci_01_0001.html)创建。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | CPU架构    | X86计算或鲲鹏。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | 实例类型     | 通用型或通用型（轻享）。 说明： 仅X86计算CPU架构支持通用型（轻享）实例类型。相比于通用型，通用型（轻享）提供性能接近且高性价比的算力资源。 通用型（轻享）和鲲鹏通用型当前处于公测阶段。对于不同的实例类型，费用也不同，具体请参见[按需计费区域单价](https://support.huaweicloud.com/price-cci2/cci_06_1004.html#section6)。                                                                                                                                                                                                                                                                                                                           |
   | vCPUs    | 选择vCPU大小，0.25核-64核之间。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | 内存       | 根据选择的vCPU大小，选择内存大小。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   | 数据存储（可选） | 为容器提供存储，目前支持临时目录、配置项、密钥，请先为容器组添加数据存储后再挂载到指定容器中。 单击"添加数据存储"，选择存储卷类型，并输入存储卷名称。 - 临时目录：输入CCI容器组默认提供30GiB的免费存储空间，临时目录与系统盘共享。  - 配置项：选择[已创建的配置项](https://support.huaweicloud.com/usermanual-cci2/cci_01_0034.html#cci_01_0034__section18512531861)。  - 密钥：选择[已创建的密钥](https://support.huaweicloud.com/usermanual-cci2/cci_01_0035.html#cci_01_0035__section18512531861)。   |
   | 实例数量     | 负载可以有一个或多个Pod，您可以设置具体Pod个数。每个负载Pod都由相同的容器部署而成。设置多个Pod主要用于实现高可靠性，当某个Pod故障时，负载还能正常运行。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
      
   
   
4. 添加容器配置。一个Pod可以包含一个或多个运行不同镜像的容器，通常情况下一个Pod中只有一个容器，如果您的应用程序需要多个容器，请添加容器。 
   1. 单击"添加容器"。
   
   2. 填写基本信息。
      表1基本信息 
      | 参数    | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
      |:---|:---|
      | 容器名称  | 请输入1到63个字符的字符串，可以包含小写英文字母、数字和中划线（-），并以小写英文字母或数字开头，小写英文字母或数字结尾。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
      | 镜像    | 选择镜像。 须知： 同一个Pod实例中的不同容器如果监听了相同的端口，则会导致端口冲突，Pod可能会启动失败。例如在Pod中添加了一个nginx镜像容器，启动了80端口，如果该Pod中另一个http服务的镜像也启动80端口，那么这个Pod就会出现端口冲突。 - 我的镜像：展示了您上传到容器镜像服务的镜像。 说明： - 如您是IAM用户，您需要参考[（可选）上传镜像](https://support.huaweicloud.com/usermanual-cci2/cci_01_0005.html#cci_01_0005__section1593133403517)进行权限设置后才可使用账号的私有镜像。  - CCI当前暂不支持对接第三方镜像仓库。  - 镜像单层解压后的实际大小不能超过20G。     - 共享镜像：展示了容器镜像服务中他人共享的镜像。  - 镜像中心：展示了镜像中心的公共镜像。   |
      | 镜像版本  | 选择镜像的版本。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
      | vCPUs | 输入值不能小于0或大于剩余规格额度。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
      | 内存    | 输入值不能小于0或大于剩余规格额度。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
         
      
   
   3. 高级设置（可选）：
   
   
   - 生命周期：生命周期脚本定义，在容器的生命周期的特定阶段执行调用。详细步骤请参见[生命周期](https://support.huaweicloud.com/usermanual-cci2/cci_01_0110.html)。
   
   - 健康检查：健康检查是指容器运行过程中，根据您需要，定时检查容器健康状况。详细步骤请参见[健康检查](https://support.huaweicloud.com/usermanual-cci2/cci_01_0013.html)。
   
   - 环境变量：在容器中设置环境变量，支持手动输入和引用变量。环境变量为应用提供极大的灵活性，您可以在应用程序中使用环境变量，在创建容器时为环境变量赋值，容器运行时读取环境变量的值，从而做到灵活地配置，而不是每次都重新编写应用程序制作镜像。 手动输入只需要直接输入变量名称和变量值。
     变量引用支持引用PodIP（Pod的IP地址）、PodName（Pod的名称）以及Secret，输入变量名称，选择引用类型、引用值。其中Secret引用的创建请参见[使用Secret](https://support.huaweicloud.com/usermanual-cci2/cci_01_0035.html)。
     
   
   - 数据存储：支持挂载数据存储到容器中，以实现容器内的数据访问。
   
   - 安全设置：支持配置容器的运行用户。
   
   
   
   
5. 选择升级策略。 
   - 升级策略：升级方式支持"滚动升级"和"替换升级"。
     - 滚动升级：滚动升级将逐步用新版本的实例替换旧版本的实例，升级的过程中，业务流量会同时负载均衡分布到新老的实例上，因此业务不会中断。 最大无效实例数：每次滚动升级允许的最大无效实例数，如果等于实例数有断服风险（最小存活实例数 = 实例数 - 最大无效实例数）。
       
     
     - 替换升级：先删除旧实例，再创建新实例。升级过程中业务会中断。
      
   
   
   
   
6. **可选：** 如需将容器日志投递至云日志服务（LTS）进行集中管理，请勾选"日志对接LTS"，并参考[表2]完成相关配置。如需了解约束限制等更多信息请参见[日志采集](https://support.huaweicloud.com/usermanual-cci2/cci_01_0037.html)。
   
    表2日志对接LTS 
   | 参数   | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   |:---|:---|
   | 日志组  | 选择日志所属的逻辑分组。可选择已有日志组，或单击"创建日志组"新建。 说明： 日志组名称不能与其他日志组名称或原始名称相同。只支持输入英文、数字、中文、中划线、下划线及小数点，且不能以小数点、下划线开头或以小数点结尾。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | 日志流  | 选择日志组中具体的日志流（日志存储的基本单位）。可选择已有日志流，或单击"创建日志流"新建。 说明： 只支持输入英文、数字、中文、中划线、下划线及小数点，且不能以小数点、下划线开头或以小数点结尾。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   | 策略名称 | 自定义日志采集策略名称，用于识别本次日志采集规则。 说明： 名称由小写字母、数字和横线（-）组成，且必须以字母或数字开头和结尾，最长支持63个字符                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | 日志类型 | - 容器标准输出：采集容器在运行过程中打印到标准输出或标准错误的日志。  - 容器日志文件：采集容器内部指定日志文件的内容。 说明： - 路径配置最多支持添加20个日志目录。  - 重复的路径配置只生效一次日志目录，请填写绝对路径。  - 日志文件名，不支持.gz .tar .zip 后缀类型。  - 最多有三级目录采用通配符匹配，且第一级目录不能使用通配符。目录名和文件名支持完整名称和通配符模式，通配符只支持星号（\*）和半角问号（?）。星号（\*）表示匹配多个任意字符。半角问号（?）表示匹配单个任意字符。      |
   | 日志格式 | - 单行文本：每条日志仅包含一行文本，以换行符 \\n 作为各条日志的分界线。  - 多行文本：每条日志可能横跨多行文本，采用首行正则的方式进行匹配，当选择多行文本时，需填写日志匹配格式。                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
      
   
   
7. 配置完成后，单击"创建工作负载"。 
   在负载列表中，待负载状态为"运行中"，负载创建成功。您可以单击负载名进入负载详情界面，刷新负载状态。
   
   
 
#### 通过YAML创建无状态工作负载
1. 登录[云容器实例 CCI2.0](https://console.huaweicloud.com/cci2.0/?#/cci/cluster/list)控制台。

2. 左侧导航栏中选择"负载管理 \> 无状态负载"，在页面单击"YAML创建"。
3. 导入或者添无状态负载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](https://console.huaweicloud.com/cci2.0/?#/cci/cluster/list)控制台。
2. 左侧导航栏中选择"负载管理 \> 无状态负载"，选择需要更新的deployment右侧操作中"YAML编辑"。 
   ![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000001863424320.png "点击放大")
   
   
   
3. 编辑修改无状态负载yaml，单击确定，更新无状态负载。
 
#### 删除Pod
负载创建完后，可以对Pod进行手动删除操作，由于Pod是有控制器在控制，单击删除按钮后会立即重新创建一个新的Pod。手动删除Pod在某些场景下非常有用，比如升级到一半出现失败时、想重启业务进程时。
#### 删除无状态负载
1. 登录[云容器实例 CCI2.0](https://console.huaweicloud.com/cci2.0/?#/cci/cluster/list)控制台。
2. 左侧导航栏中选择"负载管理 -\> 无状态负载"，选择需要删除的无状态负载，单击操作栏中"删除"，删除负载。
 
