华为云用户手册

  • mask_partial(column_name, mask_field1, mask_value1, mask_field2, mask_value2, mask_field3, mask_value3) 描述:按指定三个时间域做部分脱敏,仅适用于日期或时间类型数据。若mask_value取-1,即此mask_field不脱敏。其中,mask_field可以取"month"、"day"、"year"、"hour"、"minute"、"second"六个时间域之一。各域的取值范围需满足实际时间单位的取值范围。 返回值类型:与入参column_name数据类型相同。
  • 约束与限制 单个GPU卡最多虚拟化成20个GPU虚拟设备。 使用GPU虚拟化后,不支持init容器。 GPU虚拟化支持显存隔离、显存与算力隔离两种隔离模式。单个GPU卡仅支持调度同一种隔离模式的工作负载。 使用GPU虚拟化后,不支持使用Autoscaler插件自动扩缩容GPU虚拟化节点。 XGPU服务的隔离功能不支持以UVM的方式申请显存,即调用CUDA API cudaMallocManaged(),更多信息,请参见NVIDIA官方文档。请使用其他方式申请显存,例如调用cudaMalloc()等。 受GPU虚拟化技术的限制,容器内应用程序初始化时,通过nvidia-smi监测工具监测到的实时算力可能超过容器可用的算力上限。
  • 前提条件 配置 支持版本 集群版本 v1.23.8-r0、v1.25.3-r0及以上 操作系统 Huawei Cloud EulerOS 2.0操作系统 GPU类型 支持T4、V100类型的GPU 驱动版本 GPU虚拟化功能仅支持470.57.02、510.47.03、535.54.03版本的GPU驱动。 运行时 仅支持containerd 插件 集群中需要同时安装以下插件: Volcano调度器插件:1.10.5及以上版本 CCE AI套件(NVIDIA GPU)插件:2.0.5及以上版本
  • 获取驱动链接-公网地址 登录CCE控制台。 创建节点,在节点规格处选择要创建的GPU节点,选中后下方显示的信息中可以看到节点的GPU显卡型号。 图3 查看显卡型号 登录到https://www.nvidia.com/Download/Find.aspx?lang=cn网站。 如图4所示,在“NVIDIA驱动程序下载”框内选择对应的驱动信息。其中“操作系统”必须选Linux 64-bit。 图4 参数选择 驱动信息确认完毕,单击“搜索”按钮,会跳转到驱动信息展示页面,该页面会显示驱动的版本信息如图5,单击“下载”到下载页面。 图5 驱动信息 获取驱动软件链接方式分两种: 方式一:如图6,在浏览器的链接中找到路径为url=/tesla/470.103.01/NVIDIA-Linux-x86_64-470.103.01.run的路径,补齐全路径https://us.download.nvidia.com/tesla/470.103.01/NVIDIA-Linux-x86_64-470.103.01.run该方式节点需要绑定EIP 。 方式二:如图6,单击“下载”按钮下载驱动,然后上传到OBS,获取软件的链接,该方式节点不需要绑定EIP。 图6 获取链接
  • 版本记录 表3 CCE AI套件(NVIDIA GPU)版本记录 插件版本 支持的集群版本 更新特性 2.6.4 v1.28 v1.29 更新GPU卡逻辑隔离逻辑 2.6.1 v1.28 v1.29 升级GPU插件基础镜像 2.5.6 v1.28 修复安装驱动的问题 2.5.4 v1.28 支持v1.28集群 2.0.72 v1.21 v1.23 v1.25 v1.27 更新GPU卡逻辑隔离逻辑 2.0.69 v1.21 v1.23 v1.25 v1.27 升级GPU插件基础镜像 2.0.48 v1.21 v1.23 v1.25 v1.27 修复安装驱动的问题 2.0.46 v1.21 v1.23 v1.25 v1.27 支持535版本Nvidia驱动 支持非root用户使用XGPU 优化启动逻辑 2.0.44 v1.21 v1.23 v1.25 v1.27 支持535版本Nvidia驱动 支持非root用户使用XGPU 优化启动逻辑 2.0.18 v1.21 v1.23 v1.25 v1.27 支持HCE 2.0 2.0.17 v1.21 v1.23 v1.25 v1.27 RollingUpdate参数配置优化 2.0.14 v1.19 v1.21 v1.23 v1.25 v1.27 支持xGPU设备监控 支持nvidia.com/gpu与volcano.sh/gpu-* api兼容 2.0.5 v1.19 v1.21 v1.23 v1.25 - 2.0.0 v1.19 v1.21 v1.23 v1.25 支持GPU虚拟化 驱动安装目录更新至节点/usr/local/nvidia 1.2.28 v1.19 v1.21 v1.23 v1.25 适配OS Ubuntu22.04 GPU驱动目录自动挂载优化 1.2.24 v1.19 v1.21 v1.23 v1.25 节点池支持配置GPU驱动版本 支持GPU指标采集 1.2.20 v1.19 v1.21 v1.23 v1.25 设置插件别名为gpu 1.2.17 v1.15 v1.17 v1.19 v1.21 v1.23 增加nvidia-driver-install pod limits 配置 1.2.15 v1.15 v1.17 v1.19 v1.21 v1.23 适配CCE v1.23集群 1.2.11 v1.15 v1.17 v1.19 v1.21 支持EulerOS 2.10系统 1.2.10 v1.15 v1.17 v1.19 v1.21 CentOS系统支持新版本GPU驱动 1.2.9 v1.15 v1.17 v1.19 v1.21 适配CCE v1.21集群 1.2.2 v1.15 v1.17 v1.19 适配EulerOS新内核 1.2.1 v1.15 v1.17 v1.19 适配CCE v1.19集群 插件增加污点容忍 1.1.13 v1.13 v1.15 v1.17 支持Centos7.6 3.10.0-1127.19.1.el7.x86_64内核系统 1.1.11 v1.15 v1.17 支持用户自定义驱动地址下载驱动 支持v1.15、v1.17集群
  • 验证插件 插件安装完成后,在GPU节点及调度了GPU资源的容器中执行nvidia-smi命令,验证GPU设备及驱动的可用性。 GPU节点: # 插件版本为2.0.0以下时,执行以下命令: cd /opt/cloud/cce/nvidia/bin && ./nvidia-smi # 插件版本为2.0.0及以上时,驱动安装路径更改,需执行以下命令: cd /usr/local/nvidia/bin && ./nvidia-smi 容器: cd /usr/local/nvidia/bin && ./nvidia-smi 若能正常返回GPU信息,说明设备可用,插件安装成功。
  • 安装插件 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“插件中心”,在右侧找到CCE AI套件(NVIDIA GPU)插件,单击“安装”。 设置插件支持的“参数配置”。 Nvidia驱动:填写Nvidia驱动的下载链接,集群下全部GPU节点将使用相同的驱动。 如果下载链接为公网地址,如nvidia官网地址(https://us.download.nvidia.com/tesla/470.103.01/NVIDIA-Linux-x86_64-470.103.01.run),各GPU节点均需要绑定EIP。获取驱动链接方法请参考获取驱动链接-公网地址。 若下载链接为OBS上的链接,无需绑定EIP 。获取驱动链接方法请参考获取驱动链接-OBS地址。 请确保Nvidia驱动版本与GPU节点适配。配套关系请参见GPU驱动支持列表。 更改驱动版本后,需要重启节点才能生效。 对于Linux 5.x内核系统:Huawei Cloud EulerOS 2.0建议使用470及以上版本驱动;Ubuntu 22.04建议使用515及以上版本驱动。 图1 填写Nvidia驱动 驱动选择:若您不希望集群中的所有GPU节点使用相同的驱动,CCE支持以节点池为单位安装不同的GPU驱动。 插件将根据节点池指定的驱动版本进行安装,仅对节点池新建节点生效。 更新驱动版本后,节点池中新建节点可直接生效,存量节点需重启节点生效。 GPU虚拟化(2.0.5及以上版本支持):选择开启GPU虚拟化,支持GPU单卡的算力、显存分割与隔离。 图2 开启GPU虚拟化 若集群中未安装Volcano插件,将不支持开启GPU虚拟化,您可单击“一键安装”进行安装。如需配置Volcano插件参数,请单击“自定义安装”,详情请参见Volcano调度器。 若集群中已安装Volcano插件,但插件版本不支持使用GPU虚拟化,您可单击“一键升级”进行升级。如需配置Volcano插件参数,请单击“自定义升级”,详情请参见Volcano调度器。 开启GPU虚拟化后,可选择“虚拟化节点兼容GPU共享模式”选项,即兼容Kubernetes默认GPU调度能力。该能力需要配套gpu-device-plugin插件版本为2.0.10及以上、Volcano插件版本为1.10.5及以上。 开启该兼容能力后,在工作负载中声明nvidia.com/gpu配额(即配置nvidia.com/gpu为小数,例如0.5)时将通过虚拟化GPU提供,实现GPU显存隔离,按照设定值的百分比为容器分配GPU显存(例如分配0.5×16GiB=8GiB的GPU显存,该数值需为128MiB的整数倍否则会自动向下取整)。如果在开启兼容能力前工作负载中已经使用nvidia.com/gpu资源,则不会转成虚拟化GPU,依然使用整卡资源。 开启该兼容能力后,使用nvidia.com/gpu配额时等价于开启虚拟化GPU显存隔离,可以和显存隔离模式的工作负载共用一张GPU卡,但不支持和算显隔离模式负载共用一张GPU卡。同时,还需遵循GPU虚拟化的其他约束与限制。 未开启该兼容能力时,在工作负载中声明nvidia.com/gpu配额仅影响调度结果,并不会有显存隔离的限制。即虽然配置nvidia.com/gpu为0.5,依然可以在容器中看到完整的GPU显存资源。且使用nvidia.com/gpu资源的工作负载无法和使用虚拟化显存的工作负载共同调度到同一节点。 编辑插件配置时,修改“虚拟化节点兼容GPU共享模式”选项,不会影响已运行的工作负载。修改该配置可能工作负载导致调度失败。例如,兼容能力从开启到关闭,已使用nvidia.com/gpu资源的工作负载仍存在虚拟化GPU显存隔离,会导致该GPU卡无法调度算显隔离模式的工作负载,您需要将使用nvidia.com/gpu资源的工作负载删除才可重新调度。 单击“安装”,安装插件的任务即可提交成功。 卸载插件将会导致重新调度的GPU Pod无法正常运行,但已运行的GPU Pod不会受到影响。
  • 约束与限制 下载的驱动必须是后缀为“.run”的文件。 仅支持Nvidia Tesla驱动,不支持GRID驱动。 安装或重装插件时,需要保证驱动下载链接正确且可正常访问,插件对链接有效性不做额外校验。 插件仅提供驱动的下载及安装脚本执行功能,插件的状态仅代表插件本身功能正常,与驱动是否安装成功无关。 对于GPU驱动版本与您业务应用的兼容性(GPU驱动版本与CUDA库版本的兼容性),CCE不保证两者之间兼容性,请您自行验证。 对于已经安装GPU驱动的自定义操作系统镜像,CCE无法保证其提供的GPU驱动与CCE其他GPU组件兼容(例如监控组件等)。 如果您使用不在GPU驱动支持列表内的GPU驱动版本,可能引发GPU驱动与操作系统版本、 ECS实例类型 、Container Runtime等不兼容,继而导致驱动安装失败或者GPU插件异常。对于使用自定义GPU驱动的场景,请您自行验证。
  • GPU驱动支持列表 当前GPU驱动支持列表仅针对1.2.28及以上版本的GPU插件。 如果您需要安装最新版本的GPU驱动,请将您的GPU插件升级到最新版本。 表1 GPU驱动支持列表 GPU型号 支持集群类型 机型规格 操作系统 Huawei Cloud EulerOS 2.0(支持GPU虚拟化) Ubuntu 22.04 CentOS Linux release 7.6 EulerOS release 2.9 EulerOS release 2.5 Ubuntu 18.04(停止维护) EulerOS release 2.3(停止维护) Tesla T4 CCE Standard集群 g6 pi2 535.54.03 510.47.03 470.57.02 535.54.03 470.141.03 535.54.03 470.141.03 535.54.03 470.141.03 535.54.03 470.141.03 470.141.03 470.141.03 Volta V100 CCE Standard集群 p2s p2vs p2v 535.54.03 510.47.03 470.57.02 535.54.03 470.141.03 535.54.03 470.141.03 535.54.03 470.141.03 535.54.03 470.141.03 470.141.03 470.141.03
  • 安装插件 登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“插件中心”,在右侧找到Grafana,单击“安装”。 在安装插件页面,设置“规格配置”。 表1 Grafana插件规格配置 参数 参数说明 插件规格 该插件可配置“自定义”规格。 容器 选择“自定义”规格时,您可根据需求调整插件实例的容器规格。 设置插件支持的“参数配置”。 表2 Grafana插件参数配置 参数 参数说明 云硬盘类型 安装Grafana需创建云硬盘用于存储本地数据,卸载插件时Grafana的云硬盘不会删除。创建云硬盘会收取存储费用,并占用云硬盘的配额。 您可以选择云硬盘的类型,不同局点支持的云硬盘类型可能不同,请以控制台选择项为准。 容量 (GiB) 云硬盘的大小默认为5GiB。您可以在创建完成后对存储卷进行扩容,详情请参见相关操作。 对接 AOM 将普罗数据上报至 AOM 服务。开启后,可选择对应的AOM实例。采集的基础指标免费,自定义指标将由AOM服务进行收费,详情请参见价格详情。对接AOM需要用户具备一定权限,目前仅华为云/华为账号,或者在admin用户组下的用户支持此操作。 设置插件实例的“调度策略”。 表3 插件调度配置 参数 参数说明 节点亲和 不配置:插件实例不指定节点亲和调度。 指定节点调度:指定插件实例部署的节点。若不指定,将根据集群默认调度策略进行随机调度。 指定节点池调度:指定插件实例部署的节点池。若不指定,将根据集群默认调度策略进行随机调度。 自定义亲和策略:填写期望插件部署的节点标签实现更灵活的调度策略,若不填写将根据集群默认调度策略进行随机调度。 同时设置多条自定义亲和策略时,需要保证集群中存在同时满足所有亲和策略的节点,否则插件实例将无法运行。 容忍策略 容忍策略与节点的污点能力配合使用,允许(不强制)插件的 Deployment 实例调度到带有与之匹配的污点的节点上,也可用于控制插件的 Deployment 实例所在的节点被标记污点后插件的 Deployment 实例的驱逐策略。 插件会对实例添加针对node.kubernetes.io/not-ready和node.kubernetes.io/unreachable污点的默认容忍策略,容忍时间窗为60s。 详情请参见容忍策略。 单击“安装”。 待插件安装完成后,选择对应的集群,然后单击左侧导航栏的“插件中心”,可筛选“已安装插件”查看相应的插件。
  • 使用说明 如需通过公网访问Grafana图表,您需要为Grafana容器实例绑定LoadBalancer类型的服务。 登录CCE控制台,选择一个已安装Grafana插件的集群,在左侧导航栏中选择“服务”。 单击右上角“YAML创建”,为Grafana创建一个公网LoadBalancer类型Service。 apiVersion: v1 kind: Service metadata: name: grafana-lb #服务名称,可自定义 namespace: monitoring labels: app: grafana annotations: kubernetes.io/elb.id: 038ff*** #请替换为集群所在VPC下的ELB实例ID,且ELB实例为公网访问类型 spec: ports: - name: cce-service-0 protocol: TCP port: 80 #服务端口号,可自定义 targetPort: 3000 #Grafana的默认端口号,无需更改 selector: app: grafana type: LoadBalancer 创建完成后在浏览器访问“负载均衡公网IP地址:服务端口”,访问Grafana并选择合适的DashBoard,即可以查到相应的聚合内容。 图1 Grafana面板
  • 操作场景 环境变量是指容器运行环境中设定的一个变量,环境变量可以在工作负载部署后修改,为工作负载提供极大的灵活性。 CCE中设置的环境变量与Dockerfile中的“ENV”效果相同。 容器启动后,容器中的内容不应修改。如果修改配置项(例如将容器应用的密码、证书、环境变量配置到容器中),当容器重启(例如节点异常重新调度Pod)后,会导致配置丢失,业务异常。 配置信息应通过入参等方式导入容器中,以免重启后配置丢失。 环境变量支持如下几种方式设置。 自定义:手动填写环境变量名称及对应的参数值。 配置项导入:将配置项中所有键值都导入为环境变量。 配置项键值导入:将配置项中某个键的值导入作为某个环境变量的值。例如图1中将configmap-example这个配置项中configmap_key的值configmap_value导入为环境变量key1的值,导入后容器中将会存在一个名为key1的环境变量,其值为configmap_value。 密钥导入:将密钥中所有键值都导入为环境变量。 密钥键值导入:将密钥中某个键的值导入作为某个环境变量的值。例如图1中将secret-example这个配置项中secret_key的值secret_value导入为环境变量key2的值,导入后容器中将会存在一个名为key2的环境变量,其值为secret_value。 变量/变量引用:用Pod定义的字段作为环境变量的值。例如图1中将此Pod的名称导入为环境变量key3的值,导入后容器中将会存在一个名为key3的环境变量,其值为该Pod的名称。 资源引用:用容器定义的资源申请值或限制值作为环境变量的值。例如图1中将容器container-1的CPU限制值导入为环境变量key4的值,导入后容器中将会存在一个名为key4的环境变量,其值为容器container-1的CPU限制值。
  • YAML样例 apiVersion: apps/v1 kind: Deployment metadata: name: env-example namespace: default spec: replicas: 1 selector: matchLabels: app: env-example template: metadata: labels: app: env-example spec: containers: - name: container-1 image: nginx:alpine imagePullPolicy: Always resources: requests: cpu: 250m memory: 512Mi limits: cpu: 250m memory: 512Mi env: - name: key # 自定义 value: value - name: key1 # 配置项键值导入 valueFrom: configMapKeyRef: name: configmap-example key: configmap_key - name: key2 # 密钥键值导入 valueFrom: secretKeyRef: name: secret-example key: secret_key - name: key3 # 变量引用,用Pod定义的字段作为环境变量的值 valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name - name: key4 # 资源引用,用Container定义的字段作为环境变量的值 valueFrom: resourceFieldRef: containerName: container1 resource: limits.cpu divisor: 1 envFrom: - configMapRef: # 配置项导入 name: configmap-example - secretRef: # 密钥导入 name: secret-example imagePullSecrets: - name: default-secret
  • 环境变量查看 如果configmap-example和secret-example的内容如下。 $ kubectl get configmap configmap-example -oyaml apiVersion: v1 data: configmap_key: configmap_value kind: ConfigMap ... $ kubectl get secret secret-example -oyaml apiVersion: v1 data: secret_key: c2VjcmV0X3ZhbHVl # c2VjcmV0X3ZhbHVl为secret_value的base64编码 kind: Secret ... 则进入Pod中查看的环境变量结果如下。 $ kubectl get pod NAME READY STATUS RESTARTS AGE env-example-695b759569-lx9jp 1/1 Running 0 17m $ kubectl exec env-example-695b759569-lx9jp -- printenv / # env key=value # 自定义环境变量 key1=configmap_value # 配置项键值导入 key2=secret_value # 密钥键值导入 key3=env-example-695b759569-lx9jp # Pod的metadata.name key4=1 # container1这个容器的limits.cpu,单位为Core,向上取整 configmap_key=configmap_value # 配置项导入,原配置项中的键值直接会导入结果 secret_key=secret_value # 密钥导入,原密钥中的键值直接会导入结果
  • 资源变更与弃用 社区1.23 ReleaseNotes FlexVolume废弃,建议使用 CS I。 HorizontalPodAutoscaler v2版本GA,HorizontalPodAutoscaler API v2在1.23版本中逐渐稳定。不建议使用HorizontalPodAutoscaler v2beta2 API,建议使用新的v2版本API。 PodSecurity支持beta,PodSecurity替代废弃的PodSecurityPolicy,PodSecurity是一个准入控制器,它根据设置实施级别的特定命名空间标签在命名空间中的Pod上实施Pod安全标准。在1.23中PodSecurity默认启用。 社区1.22 ReleaseNotes Ingress资源不再支持networking.k8s.io/v1beta1和extensions/v1beta1 API。如果使用旧版本API管理Ingress,会影响应用对外暴露服务,请尽快使用networking.k8s.io/v1替代。 CustomResourceDefinition资源不再支持apiextensions.k8s.io/v1beta1 API。如果使用旧版本API创建自定义资源定义,会导致定义创建失败,进而影响调和(reconcile)该自定资源的控制器,请尽快使用apiextensions.k8s.io/v1替代。 ClusterRole、ClusterRoleBinding、Role和RoleBinding资源不再支持rbac.authorization.k8s.io/v1beta1 API。如果使用旧版本API管理RBAC资源,会影响应用的权限服务,甚至无法在集群内正常使用,请尽快使用rbac.authorization.k8s.io/v1替代。 Kubernetes版本发布周期由一年4个版本变为一年3个版本。 StatefulSets 支持minReadySeconds。 缩容时默认根据Pod uid排序随机选择删除Pod(LogarithmicScaleDown)。基于该特性,可以增强Pod被缩容的随机性,缓解由于Pod拓扑分布约束带来的问题。更多信息,请参见KEP-2185和issues 96748。 BoundServiceAccountTokenVolume特性已稳定,该特性能够提升服务账号(ServiceAccount)Token的安全性,改变了Pod挂载Token的方式,Kubernetes 1.21及以上版本的集群中会默认开启。
  • Ingress支持的Service类型 ELB Ingress支持的Service类型如表1所示。 表1 ELB Ingress支持的Service类型 集群类型 ELB类型 集群内访问(ClusterIP) 节点访问(NodePort) CCE Standard集群 共享型负载均衡 不支持 支持 独享型负载均衡 不支持(集群内访问服务关联实例未绑定eni网卡,独享型负载均衡无法对接) 支持 CCE Turbo 集群 共享型负载均衡 不支持 支持 独享型负载均衡 支持 不支持(节点访问服务关联实例已绑定eni网卡,独享型负载均衡无法对接) Nginx Ingress支持的Service类型如表2所示。 表2 Nginx Ingress支持的Service类型 集群类型 ELB类型 集群内访问(ClusterIP) 节点访问(NodePort) CCE Standard集群 共享型负载均衡 支持 支持 独享型负载均衡 支持 支持 CCE Turbo集群 共享型负载均衡 支持 支持 独享型负载均衡 支持 支持
  • Nginx Ingress Controller工作原理 Nginx型的Ingress使用弹性负载均衡(ELB)作为流量入口,并在集群中部署nginx-ingress插件来对流量进行负载均衡及访问控制。 nginx-ingress插件使用开源社区的模板与镜像,使用过程中可能存在缺陷,CCE会定期同步社区版本来修复已知漏洞。请评估是否满足您的业务场景要求。 开源社区地址:https://github.com/kubernetes/ingress-nginx Nginx型的Ingress Controller通过pod部署在工作节点上,因此引入了相应的运维成本和Nginx组件运行成本,其工作原理如图4,实现步骤如下: 当用户更新Ingress资源后,Ingress Controller就会将其中定义的转发规则写入到Nginx的配置文件(nginx.conf)中。 内置的Nginx组件进行reload,加载更新后的配置文件,完成Nginx转发规则的修改和更新。 在流量访问集群时,首先被已创建的负载均衡实例转发到集群内部的Nginx组件,然后Nginx组件再根据转发规则将其转发至对应的各个工作负载。 图4 Nginx Ingress Controller工作原理
  • ELB Ingress Controller工作原理 CCE自研的ELB Ingress Controller基于弹性负载均衡服务ELB实现公网和内网(同一VPC内)的七层网络访问,通过不同的URL将访问流量分发到对应的服务。 ELB Ingress Controller部署于Master节点上,与集群所在VPC下的弹性负载均衡器绑定,支持在同一个ELB实例(同一IP)下进行不同域名、端口和转发策略的设置。ELB Ingress Controller的工作原理如图2,实现步骤如下: 用户创建Ingress资源,在Ingress中配置流量访问规则,包括负载均衡器、URL、SSL以及访问的后端Service端口等。 Ingress Controller监听到Ingress资源发生变化时,就会根据其中定义的流量访问规则,在ELB侧重新配置监听器以及后端服务器路由。 当用户进行访问时,流量根据ELB中配置的转发策略转发到对应的后端Service端口,然后再经过Service二次转发访问到关联的各个工作负载。 图2 ELB Ingress工作原理(CCE Standard集群以及CCE Turbo集群使用共享型ELB场景) 在使用CCE Turbo集群 + 独享型ELB实例时,Pod IP直接从VPC中分配,支持ELB直通Pod。创建集群外部访问的Ingress时,可使用ELB对接ClusterIP服务,直接将Pod作为ELB监听器的后端服务器,外部流量可以不经过节点端口转发直接访问集群中的Pod。 图3 ELB Ingress直通容器原理(CCE Turbo集群使用独享型ELB场景)
  • 为什么需要Ingress Service基于TCP和UDP协议进行访问转发,为集群提供了四层负载均衡的能力。但是在实际场景中,Service无法满足应用层中存在着大量的HTTP/HTTPS访问需求。因此,Kubernetes集群提供了另一种基于HTTP协议的访问方式——Ingress。 Ingress是Kubernetes集群中一种独立的资源,制定了集群外部访问流量的转发规则。如图1所示,用户可根据域名和路径对转发规则进行自定义,完成对访问流量的细粒度划分。 图1 Ingress示意图 下面对Ingress的相关定义进行介绍: Ingress资源:一组基于域名或URL把请求转发到指定Service实例的访问规则,是Kubernetes的一种资源对象,通过接口服务实现增、删、改、查的操作。 Ingress Controller:请求转发的执行器,用以实时监控资源对象Ingress、Service、Endpoint、Secret(主要是TLS证书和Key)、Node、ConfigMap的变化,解析Ingress定义的规则并负责将请求转发到相应的后端Service。 Ingress Controller在不同厂商之间的实现方式不同,根据负载均衡器种类的不同,可以将其分成ELB型和Nginx型。CCE支持上述两种Ingress Controller类型,其中ELB Ingress Controller基于弹性负载均衡服务(ELB)实现流量转发;而Nginx Ingress Controller使用Kubernetes社区维护的模板与镜像,通过Nginx组件完成流量转发。
  • 监控NGINX Ingress控制器指标 访问Prometheus,在“Graph”页面中,查看NGINX Ingress控制器指标。 图3 查看NGINX Ingress控制器监控指标 表1 NGINX Ingress控制器监控指标 指标 指标类型 说明 nginx_ingress_controller_bytes_sent 基础指标 发送到客户端的字节数 nginx_ingress_controller_connect_duration_seconds 基础指标 与上游服务器建立连接花费的时间 nginx_ingress_controller_header_duration_seconds 基础指标 从上游服务器接收第一个报头所花费的时间 nginx_ingress_controller_ingress_upstream_latency_seconds 基础指标 上游服务时延 nginx_ingress_controller_request_duration_seconds 基础指标 请求处理时间(以毫秒为单位) nginx_ingress_controller_request_size 基础指标 请求长度(包括请求行、请求头和请求体) nginx_ingress_controller_requests 基础指标 客户端请求的总数 nginx_ingress_controller_response_duration_seconds 基础指标 从上游服务器接收响应所花费的时间 nginx_ingress_controller_response_size 基础指标 响应长度(包括请求行、报头和请求体) nginx_ingress_controller_nginx_process_connections 基础指标 当前状态为{活动,读取,写入,等待}的客户端连接数 nginx_ingress_controller_nginx_process_connections_total 基础指标 状态为{已接受,已处理}的连接总数 nginx_ingress_controller_nginx_process_cpu_seconds_total 基础指标 CPU使用率(秒) nginx_ingress_controller_nginx_process_num_procs 基础指标 进程数 nginx_ingress_controller_nginx_process_oldest_start_time_seconds 基础指标 从1970年1月1日开始以秒为单位的开始时间 nginx_ingress_controller_nginx_process_read_bytes_total 基础指标 读取的字节数 nginx_ingress_controller_nginx_process_requests_total 基础指标 客户端请求总数 nginx_ingress_controller_nginx_process_resident_memory_bytes 基础指标 正在使用的内存字节数 nginx_ingress_controller_nginx_process_virtual_memory_bytes 基础指标 正在使用的内存字节数 nginx_ingress_controller_nginx_process_write_bytes_total 基础指标 写入字节数 nginx_ingress_controller_build_info 基础指标 一个带有常量“1”的度量,标记有关于构建的信息。 nginx_ingress_controller_check_success 基础指标 Ingress controller语法检查累计次数 nginx_ingress_controller_config_hash 基础指标 正在运行的Nginx配置hash值 nginx_ingress_controller_config_last_reload_successful 基础指标 最后一次尝试重新加载配置是否成功 nginx_ingress_controller_config_last_reload_successful_timestamp_seconds 基础指标 最后一次成功重新加载配置的时间戳 nginx_ingress_controller_ssl_certificate_info 基础指标 保留与证书相关的所有标签 nginx_ingress_controller_success 基础指标 Ingress controller重新加载操作的累计次数 nginx_ingress_controller_orphan_ingress 基础指标 孤立ingress的状态,1表示孤立ingress。 namespace:是用于标识ingress名称空间的字符串。 ingress:表示ingress名称。 type:表示孤立ingress的状态,取值为no-service或no-endpoint。 nginx_ingress_controller_admission_config_size 基础指标 被测试配置的大小 nginx_ingress_controller_admission_render_duration 基础指标 允许ingress渲染入口的处理持续时间(浮点秒) nginx_ingress_controller_admission_render_ingresses 基础指标 由admission controller渲染的ingress长度 nginx_ingress_controller_admission_roundtrip_duration 基础指标 admission controller在处理新事件时的完整持续时间(浮点秒) nginx_ingress_controller_admission_tested_duration 基础指标 admission controller测试的处理持续时间(浮点秒) nginx_ingress_controller_admission_tested_ingresses 基础指标 admission controller处理的ingress长度 Nginx Ingress在高负载请求下,开启全量指标采集存在内存泄露的问题(详情请参见社区issue)。经过验证,屏蔽以下指标后,能够有效抑制内存增长。为避免内存泄露导致业务受损,Nginx Ingress插件默认屏蔽上述指标。我们将持续关注社区最新动态,及时同步修复该问题。 nginx_ingress_controller_success nginx_ingress_controller_header_duration_seconds nginx_ingress_controller_ingress_upstream_latency_seconds
  • 自定义存储类应用场景 在CCE中使用存储时,最常见的方法是创建PVC时通过指定StorageClassName定义要创建存储的类型,如下所示,使用PVC申请一个SAS(高I/O)类型云硬盘/块存储。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-evs-example namespace: default annotations: everest.io/disk-volume-type: SAS spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: csi-disk 可以看到在CCE中如果需要指定云硬盘的类型,是通过everest.io/disk-volume-type字段指定,这里SAS是云硬盘的类型。 以上是较为基础的StorageClass使用方法,在实际应用中,也可以使用StorageClass进行更为简便的操作: 应用场景 解决方案 操作步骤 在使用annotations指定存储配置时,配置较为繁琐。例如此处使用everest.io/disk-volume-type字段指定云硬盘的类型。 在StorageClass的parameters字段中定义PVC的annotations,编写YAML时只需要指定StorageClassName。 例如,将SAS、SSD类型云硬盘分别定义一个StorageClass,比如定义一个名为csi-disk-sas的StorageClass,这个StorageClass创建SAS类型的存储, 自定义StorageClass 当用户从自建Kubernetes或其他Kubernetes服务迁移到CCE,原先的应用YAML中使用的StorageClass与CCE中使用的不同,导致使用存储时需要修改大量YAML文件或Helm Chart包,非常繁琐且容易出错。 在CCE集权中创建与原有应用YAML中相同名称的StorageClass,迁移后无需再修改应用YAML中的StorageClassName。 例如,迁移前使用的云硬盘存储类为disk-standard,在迁移CCE集群后,可以复制CCE集群中csi-disk存储类的YAML,将其名称修改为disk-standard后重新创建。 在YAML中必须指定StorageClassName才能使用存储,不指定StorageClass时无法正常创建。 在集群中设置默认的StorageClass,则YAML中无需指定StorageClassName也能创建存储。 指定默认StorageClass
  • 自定义StorageClass 本文以自定义云硬盘类型的StorageClass为例,将SAS、SSD类型云硬盘分别定义一个StorageClass,比如定义一个名为csi-disk-sas的StorageClass,这个StorageClass创建SAS类型的存储,则前后使用的差异如下图所示,编写YAML时只需要指定StorageClassName。 自定义高I/O类型StorageClass,使用YAML描述如下,这里取名为csi-disk-sas,指定云硬盘类型为SAS,即高I/O。 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-disk-sas # 高IO StorageClass名字,用户可自定义 parameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SAS # 云硬盘高I/O类型,用户不可自定义 everest.io/passthrough: "true" provisioner: everest-csi-provisioner reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true # true表示允许扩容 超高I/O类型StorageClass,这里取名为csi-disk-ssd,指定云硬盘类型为SSD,即超高I/O。 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-disk-ssd # 超高I/O StorageClass名字,用户可自定义 parameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SSD # 云硬盘超高I/O类型,用户不可自定义 everest.io/passthrough: "true" provisioner: everest-csi-provisioner reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true reclaimPolicy:底层 云存储 的回收策略,支持Delete、Retain回收策略。 Delete:删除PVC,PV资源与云硬盘均被删除。 Retain:删除PVC,PV资源与底层存储资源均不会被删除,需要手动删除回收。PVC删除后PV资源状态为“已释放(Released)”,不能直接再次被PVC绑定使用。 如果数据安全性要求较高,建议使用Retain以免误删数据。 定义完之后,使用kubectl create命令创建。 # kubectl create -f sas.yaml storageclass.storage.k8s.io/csi-disk-sas created # kubectl create -f ssd.yaml storageclass.storage.k8s.io/csi-disk-ssd created 再次查询StorageClass,回显如下: # kubectl get sc NAME PROVISIONER AGE csi-disk everest-csi-provisioner 17d csi-disk-sas everest-csi-provisioner 2m28s csi-disk-ssd everest-csi-provisioner 16s csi-disk-topology everest-csi-provisioner 17d csi-nas everest-csi-provisioner 17d csi-obs everest-csi-provisioner 17d csi-sfsturbo everest-csi-provisioner 17d
  • 指定StorageClass的企业项目 CCE支持使用存储类创建云硬盘和对象存储类型PVC时指定企业项目,将创建的存储资源(云硬盘和对象存储)归属于指定的企业项目下,企业项目可选为集群所属的企业项目或default企业项目。 若不指定企业项目,则创建的存储资源默认使用存储类StorageClass中指定的企业项目,CCE提供的 csi-disk 和 csi-obs 存储类,所创建的存储资源属于default企业项目。 如果您希望通过StorageClass创建的存储资源能与集群在同一个企业项目,则可以自定义StorageClass,并指定企业项目ID,如下所示。 该功能需要everest插件升级到1.2.33及以上版本。 kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: csi-disk-epid # 自定义名称 provisioner: everest-csi-provisioner parameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SAS everest.io/enterprise-project-id: 86bfc701-9d9e-4871-a318-6385aa368183 # 指定企业项目id everest.io/passthrough: 'true' reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: Immediate
  • 配置验证 使用csi-disk-sas创建PVC。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: sas-disk spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: csi-disk-sas 创建并查看详情,如下所示,可以发现能够创建,且StorageClass显示为csi-disk-sas # kubectl create -f sas-disk.yaml persistentvolumeclaim/sas-disk created # kubectl get pvc NAME STATUS VOLUME CAPACITY AC CES S MODES STORAGECLASS AGE sas-disk Bound pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO csi-disk-sas 24s # kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO Delete Bound default/sas-disk csi-disk-sas 30s 在CCE控制台界面上查看PVC详情,在“PV详情”页签下可以看到磁盘类型是高I/O。 不指定StorageClassName,使用默认配置,如下所示,并未指定storageClassName。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ssd-disk spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi 创建并查看,可以看到PVC ssd-disk的StorageClass为csi-disk-ssd,说明默认使用了csi-disk-ssd。 # kubectl create -f ssd-disk.yaml persistentvolumeclaim/ssd-disk created # kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE sas-disk Bound pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO csi-disk-sas 16m ssd-disk Bound pvc-4d2b059c-0d6c-44af-9994-f74d01c78731 10Gi RWO csi-disk-ssd 10s # kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-4d2b059c-0d6c-44af-9994-f74d01c78731 10Gi RWO Delete Bound default/ssd-disk csi-disk-ssd 15s pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO Delete Bound default/sas-disk csi-disk-sas 17m 在CCE控制台界面上查看PVC详情,在“PV详情”页签下可以看到磁盘类型是超高I/O。
  • 指定默认StorageClass 您还可以指定某个StorageClass作为默认StorageClass,这样在创建PVC时不指定StorageClassName就会使用默认StorageClass创建。 例如将csi-disk-ssd指定为默认StorageClass,则可以按如下方式设置。 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-disk-ssd annotations: storageclass.kubernetes.io/is-default-class: "true" # 指定集群中默认的StorageClass,一个集群中只能有一个默认的StorageClass parameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SSD everest.io/passthrough: "true" provisioner: everest-csi-provisioner reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true 先删除之前创建的csi-disk-ssd,再使用kubectl create命令重新创建,然后再查询StorageClass,显示如下。 # kubectl delete sc csi-disk-ssd storageclass.storage.k8s.io "csi-disk-ssd" deleted # kubectl create -f ssd.yaml storageclass.storage.k8s.io/csi-disk-ssd created # kubectl get sc NAME PROVISIONER AGE csi-disk everest-csi-provisioner 17d csi-disk-sas everest-csi-provisioner 114m csi-disk-ssd (default) everest-csi-provisioner 9s csi-disk-topology everest-csi-provisioner 17d csi-nas everest-csi-provisioner 17d csi-obs everest-csi-provisioner 17d csi-sfsturbo everest-csi-provisioner 17d
  • 存储类介绍 StorageClass可译为存储类,描述了集群中的存储类型“分类”,可以表示为一个创建PV存储卷的配置模板。在创建PVC/PV均需要指定StorageClass。 作为使用者,只需要在声明PVC时指定StorageClassName即可自动创建PV及底层存储,大大减少了创建并维护PV的工作量。 除了使用CCE提供的默认存储类外,您也可以根据需求自定义存储类。 自定义存储类应用场景 自定义StorageClass 指定默认StorageClass 指定StorageClass的企业项目
  • CCE默认存储类 目前CCE默认提供csi-disk、csi-nas、csi-obs等StorageClass,在声明PVC时使用对应StorageClassName,就可以自动创建对应类型PV,并自动创建底层的存储资源。 执行如下kubectl命令即可查询CCE提供的默认StorageClass。您可以使用CCE提供的CSI插件自定义创建StorageClass。 # kubectl get sc NAME PROVISIONER AGE csi-disk everest-csi-provisioner 17d # 云硬盘 csi-disk-topology everest-csi-provisioner 17d # 延迟创建的云硬盘 csi-nas everest-csi-provisioner 17d # 文件存储 1.0 csi-sfs everest-csi-provisioner 17d # 文件存储 3.0 csi-obs everest-csi-provisioner 17d # 对象存储 csi-sfsturbo everest-csi-provisioner 17d # 极速文件存储 csi-local everest-csi-provisioner 17d # 本地持久卷 csi-local-topology everest-csi-provisioner 17d # 延迟创建的本地持久卷 每个StorageClass都包含了动态制备PersistentVolume时会使用到的默认参数。如以下云硬盘存储类的示例: kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: csi-disk provisioner: everest-csi-provisioner parameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SAS everest.io/passthrough: 'true' reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: Immediate 表1 关键参数说明 参数 描述 provisioner 存储资源提供商,CCE均由everest插件提供,此处只能填写everest-csi-provisioner。 parameters 存储参数,不同类型的存储支持的参数不同。详情请参见表2。 reclaimPolicy 用来指定创建PV的persistentVolumeReclaimPolicy字段值,支持Delete和Retain。如果StorageClass 对象被创建时没有指定reclaimPolicy,它将默认为Delete。 Delete:表示动态创建的PV,在PVC销毁的时候PV也会自动销毁。 Retain:表示动态创建的PV,在PVC销毁的时候PV不会自动销毁。 allowVolumeExpansion 定义由此存储类创建的PV是否支持动态扩容,默认为false。是否能动态扩容是由底层存储插件来实现的,这里只是一个开关。 volumeBindingMode 表示卷绑定模式,即动态创建PV的时间,分为立即创建和延迟创建。 Immediate:创建PVC时完成PV绑定和动态创建。 WaitForFirstConsumer:延迟PV的绑定和创建,当在工作负载中使用该PVC时才执行PV创建和绑定流程。 mountOptions 该字段需要底层存储支持,如果不支持挂载选项,却指定了挂载选项,会导致创建PV操作失败。 表2 parameters参数说明 存储类型 参数 是否必选 描述 云硬盘 csi.storage.k8s.io/csi-driver-name 是 驱动类型,使用云硬盘类型时,参数取值固定为“disk.csi.everest.io”。 csi.storage.k8s.io/fstype 是 使用云硬盘时,支持的参数值为“ext4”。 everest.io/disk-volume-type 是 云硬盘类型,全大写。 SAS:高I/O SSD:超高I/O GPSSD:通用型SSD ESSD:极速型SSD GPSSD2:通用性SSD v2,Everest版本为2.4.4及以上支持使用,使用时需同时指定everest.io/disk-iops和everest.io/disk-throughput注解。 ESSD2:极速型SSD v2,Everest版本为2.4.4及以上支持使用,使用时需指定everest.io/disk-iops注解。 everest.io/passthrough 是 参数取值固定为“true”,表示云硬盘的设备类型为SCSI类型。不允许设置为其他值。 文件存储 csi.storage.k8s.io/csi-driver-name 是 驱动类型,使用文件存储类型时,参数取值固定为“nas.csi.everest.io”。 csi.storage.k8s.io/fstype 是 使用文件存储时,支持的参数值为“nfs”。 everest.io/share-access-level 是 参数取值固定为“rw”,表示文件存储可读写。 everest.io/share-access-to 是 集群所在VPC ID。 everest.io/share-is-public 否 参数取值固定为“false”,表示文件共享为私人可见。 使用SFS 3.0时无需填写。 everest.io/sfs-version 否 仅使用SFS 3.0时需要填写,固定值为“sfs3.0”。 极速文件存储 csi.storage.k8s.io/csi-driver-name 是 驱动类型,使用极速文件存储类型时,参数取值固定为“sfsturbo.csi.everest.io”。 csi.storage.k8s.io/fstype 是 使用极速文件存储时,支持的参数值为“nfs”。 everest.io/share-access-to 是 集群所在VPC ID。 everest.io/share-expand-type 否 扩展类型,默认值为“bandwidth”,表示增强型的文件系统。该字段不起作用。 everest.io/share-source 是 参数取值固定为“sfs-turbo”。 everest.io/share-volume-type 否 极速文件存储类型,默认值为“STANDARD”,表示标准型和标准型增强版。该字段不起作用。 对象存储 csi.storage.k8s.io/csi-driver-name 是 驱动类型,使用对象存储类型时,参数取值固定为“obs.csi.everest.io”。 csi.storage.k8s.io/fstype 是 实例类型,支持的参数值为“s3fs”和“obsfs”。 obsfs:并行文件系统,配套使用obsfs挂载,推荐使用。 s3fs:对象桶,配套使用s3fs挂载。 everest.io/obs-volume-type 是 对象存储类型。 fsType设置为s3fs时,支持STANDARD(标准桶)、WARM(低频访问桶)。 fsType设置为obsfs时,该字段不起作用。
  • 注意事项 建议其他资源不要使用Ingress自动创建的ELB实例,否则在删除Ingress时,ELB实例会被占用,导致资源残留。 添加Ingress后请在CCE页面对所选ELB实例进行配置升级和维护,不可在ELB页面对配置进行更改,否则可能导致Ingress服务异常。 Ingress转发策略中注册的URL需与后端应用提供访问的URL一致,否则将返回404错误。 独享型ELB规格必须支持应用型(HTTP/HTTPS),且网络类型必须支持私网(有私有IP地址)。 同集群使用多个Ingress对接同一个ELB端口时,监听器的配置项(例如监听器关联的证书、监听器HTTP2属性等)均以第一个Ingress配置为准。
  • 约束与限制 支持多个PV挂载同一个SFS或SFS Turbo,但有如下限制: 多个不同的PVC/PV使用同一个底层SFS或SFS Turbo卷时,如果挂载至同一Pod使用,会因为PV的volumeHandle参数值相同导致无法为Pod挂载所有PVC,出现Pod无法启动的问题,请避免该使用场景。 PV中persistentVolumeReclaimPolicy参数建议设置为Retain,否则可能存在一个PV删除时级联删除底层卷,其他关联这个底层卷的PV会由于底层存储被删除导致使用出现异常。 重复用底层存储时,建议在应用层做好多读多写的隔离保护,防止产生的数据覆盖和丢失。 对SFS Turbo类型的存储来说,删除集群或删除PVC时不会回收包周期的SFS Turbo资源,您需要在SFS Turbo控制台中自行回收。
  • 验证数据持久化及共享性 查看部署的应用及文件。 执行以下命令,查看已创建的Pod。 kubectl get pod | grep web-demo 预期输出如下: web-demo-846b489584-mjhm9 1/1 Running 0 46s web-demo-846b489584-wvv5s 1/1 Running 0 46s 依次执行以下命令,查看Pod的/data路径下的文件。 kubectl exec web-demo-846b489584-mjhm9 -- ls /data kubectl exec web-demo-846b489584-wvv5s -- ls /data 两个Pod均无返回结果,说明/data路径下无文件。 执行以下命令,在/data路径下创建static文件。 kubectl exec web-demo-846b489584-mjhm9 -- touch /data/static 执行以下命令,查看/data路径下的文件。 kubectl exec web-demo-846b489584-mjhm9 -- ls /data 预期输出如下: static 验证数据持久化 执行以下命令,删除名称为web-demo-846b489584-mjhm9的Pod。 kubectl delete pod web-demo-846b489584-mjhm9 预期输出如下: pod "web-demo-846b489584-mjhm9" deleted 删除后,Deployment控制器会自动重新创建一个副本。 执行以下命令,查看已创建的Pod。 kubectl get pod | grep web-demo 预期输出如下,web-demo-846b489584-d4d4j为新建的Pod: web-demo-846b489584-d4d4j 1/1 Running 0 110s web-demo-846b489584-wvv5s 1/1 Running 0 7m50s 执行以下命令,验证新建的Pod中/data路径下的文件是否更改。 kubectl exec web-demo-846b489584-d4d4j -- ls /data 预期输出如下: static static文件仍然存在,则说明数据可持久化保存。 验证数据共享性 执行以下命令,查看已创建的Pod。 kubectl get pod | grep web-demo 预期输出如下: web-demo-846b489584-d4d4j 1/1 Running 0 7m web-demo-846b489584-wvv5s 1/1 Running 0 13m 执行以下命令,在任意一个Pod的/data路径下创建share文件。本例中选择名为web-demo-846b489584-d4d4j的Pod。 kubectl exec web-demo-846b489584-d4d4j -- touch /data/share 并查看该Pod中/data路径下的文件。 kubectl exec web-demo-846b489584-d4d4j -- ls /data 预期输出如下: share static 由于写入share文件的操作未在名为web-demo-846b489584-wvv5s的Pod中执行,在该Pod中查看/data路径下是否存在文件以验证数据共享性。 kubectl exec web-demo-846b489584-wvv5s -- ls /data 预期输出如下: share static 如果在任意一个Pod中的/data路径下创建文件,其他Pod下的/data路径下均存在此文件,则说明两个Pod共享一个存储卷。
共100000条