华为云用户手册

  • 容器隧道网络模型 容器隧道网络在节点网络基础上通过隧道封装另构建的独立于节点网络平面的容器网络平面,CCE集群容器隧道网络使用的封装协议为VXLAN,后端虚拟交换机采用的是openvswitch,VXLAN是将以太网报文封装成UDP报文进行隧道传输。容器隧道网络具有付出少量隧道封装性能损耗,即可获得通用性强、互通性强、高级特性支持全面(例如NetworkPolicy网络隔离)的优势,可以满足大多数性能要求不高的场景。 图1 容器隧道网络 说明如下: 节点内Pod间通信:同节点的Pod间通信直接通过本节点的ovs网桥直接转发。 跨节点Pod间通信:所有跨节点Pod间的通信通过ovs隧道网桥进行封装后,转发到对端节点上。
  • networking.k8s.io/v1版本Ingress说明 CCE在1.23版本集群开始Ingress切换到networking.k8s.io/v1版本。 v1版本参数相较v1beta1参数有如下区别。 ingress类型由annotations中kubernetes.io/ingress.class变为使用spec.ingressClassName字段。 backend的写法变化。 每个路径下必须指定路径类型pathType,支持如下类型。 ImplementationSpecific: 对于这种路径类型,匹配方法取决于具体Ingress Controller的实现。在CCE中会使用ingress.beta.kubernetes.io/url-match-mode指定的匹配方式,这与v1beta1方式相同。 Exact:精确匹配 URL 路径,且区分大小写。 Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个匹配。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。
  • 网段规划建议 在集群网络构成中介绍集群中网络地址可分为节点网络、容器网络、服务网络三块,在规划网络地址时需要从如下方面考虑: 三个网段不能重叠,否则会导致冲突。且集群所在VPC下所有子网(包括扩展网段子网)不能和容器网段、服务网段冲突。 保证每个网段有足够的IP地址可用。 节点网段的IP地址要与集群规模相匹配,否则会因为IP地址不足导致无法创建节点。 容器网段的IP地址要与业务规模相匹配,否则会因为IP地址不足导致无法创建Pod。每个节点上可以创建多少Pod还与其他参数设置相关,具体请参见节点最多可以创建多少个Pod。 例如集群规模为200节点,容器网络模型为VPC网络。 则此时选择节点子网的可用IP数量需要超过200,否则会因为IP地址不足导致无法创建节点。 容器网段为10.0.0.0/16,可用IP数量为65536,如容器IP地址管理中所述,VPC网络IP分配是分配固定大小的网段(使用掩码实现,确定每个节点最多分配多少容器IP),例如上限为128,则此时集群最多支撑65536/128=512个节点,然后去掉Master节点数量,最终结果就是509个。
  • VPC网络模型 VPC网络采用VPC路由方式与底层网络深度整合,适用于高性能场景,节点数量受限于虚拟私有云VPC的路由配额。每个节点将会被分配固定大小的IP地址段。VPC网络由于没有隧道封装的消耗,容器网络性能相对于容器隧道网络有一定优势。VPC网络集群由于VPC路由中配置有容器网段与节点IP的路由,可以支持集群外直接访问容器实例等特殊场景。 图1 VPC网络 说明如下: 节点内Pod间通信:ipvlan子接口分配给节点上的Pod,同节点的Pod间通信直接通过ipvlan直接转发。 跨节点Pod间通信:所有跨节点Pod间的通信通过默认路由到默认网关,借助VPC的路由转发能力,转发到对端节点上。
  • 容器IP地址管理 VPC网络按如下规则分配容器IP: 容器网段需单独分配 节点维度划分地址段,集群的所有节点从容器网段中分配一个固定大小(用户自己配置)的IP网段 容器网段依次循环分配IP网段给新增节点 调度到节点上的Pod依次循环从分配给节点的IP网段内分配IP地址 图2 VPC网络IP地址管理 按如上IP分配,VPC网络的集群最多能创建节点数量 = 容器网段IP数量 ÷ 节点从容器网段中分配IP网段的IP数量 比如容器网段为172.16.0.0/16,则IP数量为65536,节点分配容器网段掩码为25,也就是每个节点容器IP数量为128,则最多可创建节点数量为65536/128=512。另外,集群能创建多少节点,还受节点网络和集群规模的影响。 图3 容器网段配置
  • CCE弹性伸缩 CCE的弹性伸缩能力分为如下两个维度: 工作负载弹性伸缩:即调度层弹性,主要是负责修改负载的调度容量变化。例如,HPA是典型的调度层弹性组件,通过HPA可以调整应用的副本数,调整的副本数会改变当前负载占用的调度容量,从而实现调度层的伸缩。 节点弹性伸缩:即资源层弹性,主要是集群的容量规划不能满足集群调度容量时,会通过弹出ECS或CCI等资源的方式进行调度容量的补充。CCE容器实例弹性到CCI服务的方法请参见CCE容器实例弹性伸缩到CCI服务。 两个维度的弹性组件与能力可以分开使用,也可以结合在一起使用,并且两者之间可以通过调度层面的容量状态进行解耦,详情请参见使用HPA+CA实现工作负载和节点联动弹性伸缩。
  • 背景介绍 随着Kubernetes已经成为云原生应用编排、管理的事实标准,越来越多的应用选择向Kubernetes迁移,用户也越来越关心在Kubernetes上应用如何快速扩容面对业务高峰,以及如何在业务低谷时快速缩容节约资源与成本。 在Kubernetes的集群中,“弹性伸缩”一般涉及到扩缩容Pod个数以及Node个数。Pod代表应用的实例数(每个Pod包含一个或多个容器),当业务高峰的时候需要扩容应用的实例个数。所有的Pod都是运行在某一个节点(虚机或裸机)上,当集群中没有足够多的节点来调度新扩容的Pod,那么就需要为集群增加节点,从而保证业务能够正常提供服务。 弹性伸缩在CCE上的使用场景非常广泛,典型的场景包含在线业务弹性、大规模计算训练、深度学习GPU或共享GPU的训练与推理、定时周期性负载变化等。
  • 命名空间使用实践 按照不同环境划分命名空间 一般情况下,工作负载发布会经历开发环境、联调环境、测试环境,最后到生产环境的过程。这个过程中不同环境部署的工作负载相同,只是在逻辑上进行了定义。分为两种做法: 分别创建不同集群。 不同集群之间,资源不能共享。同时,不同环境中的服务互访需要通过负载均衡才能实现。 不同环境创建对应命名空间。 同个命名空间下,通过服务名称(Service name)可直接访问。跨命名空间的可以通过服务名称、命名空间名称访问。 例如下图,开发环境/联调环境/测试环境分别创建了命名空间。 图1 不同环境创建对应命名空间 按照应用划分命名空间 对于同个环境中,应用数量较多的情况,建议进一步按照工作负载类型划分命名空间。例如下图中,按照APP1和APP2划分不同命名空间,将不同工作负载在逻辑上当做一个工作负载组进行管理。且同一个命名空间内的工作负载可以通过服务名称访问,不同命名空间下的通过服务名称、命名空间名称访问。 图2 按照工作负载划分命名空间
  • 组件介绍 工作负载弹性组件介绍 表1 工作负载弹性组件 类型 组件名称 组件介绍 参考文档 HPA metrics-server Kubernetes内置组件,实现Pod水平自动伸缩的功能,即Horizontal Pod Autoscaling。在kubernetes社区HPA功能的基础上,增加了应用级别的冷却时间窗和扩缩容阈值等功能。 创建工作负载弹性伸缩(HPA) CustomedHPA cce-hpa-controller 华为云自研的弹性伸缩增强能力,主要面向无状态工作负载进行弹性扩缩容。能够基于指标(CPU利用率、内存利用率)或周期(每天、每周、每月或每年的具体时间点)。 创建工作负载弹性伸缩(CustomedHPA) prometheus 一套开源的系统监控报警框架,负责采集kubernetes集群中kubelet的公开指标项(CPU利用率、内存利用率)。 节点弹性伸缩组件介绍 表2 节点弹性组件 组件名称 组件介绍 适用场景 参考文档 autoscaler Kubernetes社区开源组件,节点水平伸缩组件,华为云提供了独有的调度、弹性优化、成本优化的功能。 全场景支持,适合在线业务、深度学习、大规模成本算力交付等。 节点自动伸缩
  • Pod安全策略开放非安全系统配置示例 节点池管理中可以为相应的节点池配置allowed-unsafe-sysctls,CCE从1.17.17集群版本开始,需要在Pod安全策略的allowedUnsafeSysctls字段中增加相应的配置才能生效,配置详情请参考表1。 除修改全局Pod安全策略外,也可增加新的Pod安全策略,如开放net.core.somaxconn非安全系统配置,新增Pod安全策略示例参考如下: apiVersion: policy/v1beta1kind: PodSecurityPolicymetadata: annotations: seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' name: sysctl-pspspec: allowedUnsafeSysctls: - net.core.somaxconn allowPrivilegeEscalation: true allowedCapabilities: - '*' fsGroup: rule: RunAsAny hostIPC: true hostNetwork: true hostPID: true hostPorts: - max: 65535 min: 0 privileged: true runAsGroup: rule: RunAsAny runAsUser: rule: RunAsAny seLinux: rule: RunAsAny supplementalGroups: rule: RunAsAny volumes: - '*'---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: sysctl-psprules: - apiGroups: - "*" resources: - podsecuritypolicies resourceNames: - sysctl-psp verbs: - use---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: sysctl-psproleRef: kind: ClusterRole name: sysctl-psp apiGroup: rbac.authorization.k8s.iosubjects:- kind: Group name: system:authenticated apiGroup: rbac.authorization.k8s.io
  • 恢复原始Pod安全策略 如果您已经修改默认Pod安全策略后,想恢复原始Pod安全策略,请执行以下操作。 创建一个名为policy.yaml的描述文件。其中,policy.yaml为自定义名称,您可以随意命名。 vi policy.yaml 描述文件内容如下。 apiVersion: policy/v1beta1kind: PodSecurityPolicymetadata: name: psp-global annotations: seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'spec: privileged: true allowPrivilegeEscalation: true allowedCapabilities: - '*' volumes: - '*' hostNetwork: true hostPorts: - min: 0 max: 65535 hostIPC: true hostPID: true runAsUser: rule: 'RunAsAny' seLinux: rule: 'RunAsAny' supplementalGroups: rule: 'RunAsAny' fsGroup: rule: 'RunAsAny' ---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: psp-globalrules: - apiGroups: - "*" resources: - podsecuritypolicies resourceNames: - psp-global verbs: - use ---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: psp-globalroleRef: kind: ClusterRole name: psp-global apiGroup: rbac.authorization.k8s.iosubjects:- kind: Group name: system:authenticated apiGroup: rbac.authorization.k8s.io 执行如下命令: kubectl apply -f policy.yaml
  • 修改全局默认Pod安全策略 修改全局默认Pod安全策略前,请确保已创建CCE集群,并且通过kubectl连接集群成功。 执行如下命令: kubectl edit psp psp-global 修改所需的参数,如表1。 表1 Pod安全策略配置 配置项 描述 privileged 启动特权容器。 hostPID hostIPC 使用主机命名空间。 hostNetwork hostPorts 使用主机网络和端口。 volumes 允许使用的挂载卷类型。 allowedHostPaths 允许hostPath类型挂载卷在主机上挂载的路径,通过pathPrefix字段声明允许挂载的主机路径前缀组。 allowedFlexVolumes 允许使用的指定FlexVolume驱动。 fsGroup 配置Pod中挂载卷使用的辅组ID。 readOnlyRootFilesystem 约束启动Pod使用只读的root文件系统。 runAsUser runAsGroup supplementalGroups 指定Pod中容器启动的用户ID以及主组和辅组ID。 allowPrivilegeEscalation defaultAllowPrivilegeEscalation 约束Pod中是否允许配置allowPrivilegeEscalation=true,该配置会控制Setuid的使用,同时控制程序是否可以使用额外的特权系统调用。 defaultAddCapabilities requiredDropCapabilities allowedCapabilities 控制Pod中使用的Linux Capabilities。 seLinux 控制Pod使用seLinux配置。 allowedProcMountTypes 控制Pod允许使用的ProcMountTypes。 annotations 配置Pod中容器使用的AppArmor或Seccomp。 forbiddenSysctls allowedUnsafeSysctls 控制Pod中容器使用的Sysctl配置。
  • 添加对象存储卷 参照创建无状态负载(Deployment)、创建有状态负载(StatefulSet)、创建守护进程集(DaemonSet)或创建普通任务(Job)创建工作负载或普通任务,在添加容器后,展开“数据存储”,选择“云存储”页签下,单击“添加云存储”。 选择存储类型为“对象存储”。 表2 对象存储参数设置 参数 参数说明 云存储类型 选择“对象存储”。 对象存储有标准存储和低频访问存储两个存储类型,主要适用于大数据分析、原生云应用程序数据、静态网站托管、备份/活跃归档等场景。 分配方式 使用已有存储 云存储名称:选择已创建的存储,您需要提前创建对象存储。 子类型:选择的云存储的存储类别,仅为显示用,如标准存储、低频访问存储。 自动分配存储 在对象存储服务OBS侧对应创建的存储实例类别,可选择如下两种类型: 并行文件系统:集群版本在v1.15及以上且Everest插件版本在1.0.2以上时,支持创建可供obsfs挂载的并行文件系统。详情请参见什么是并行文件系统和OBS并行文件系统使用指导。 存储格式:默认为CSI。 对象桶:桶(Bucket)是对象存储服务OBS中存储对象的容器。详情请参见什么是桶。 子类型:可选择“标准存储”或“低频访问存储”。 存储格式:默认为CSI。 说明: 并行文件系统是OBS(对象存储)经过优化的高性能文件系统,在通过容器挂载方式使用OBS的场景中,推荐您使用并行文件系统,不推荐使用对象桶。 添加容器挂载 配置如下参数: 挂载路径:输入挂载路径,如:/tmp。 数据存储挂载到容器上的路径,请不要挂载在系统目录下,如“/”、“/var/run”等,会导致容器异常。建议挂载在空目录下,若目录不为空,请确保目录下无影响容器启动的文件,否则文件会被替换,导致容器启动异常,工作负载创建失败。 须知: 挂载高危目录的情况下 ,建议使用低权限帐号启动,否则可能会造成宿主机高危文件被破坏。 设置权限。 只读:只能读容器路径中的数据卷。 读写:可修改容器路径中的数据卷,容器迁移时新写入的数据不会随之迁移,会造成数据丢失。 单击“添加容器挂载”可增加多条设置,单击“确定”完成配置。 单击“确定”。
  • 插件概述 CCE提供了多种类型的插件,用于管理集群的扩展功能,以支持选择性扩展满足特性需求的功能。 表1 插件列表 插件名称 插件简介 CoreDNS(系统资源插件,必装) CoreDNS插件是一款通过链式插件的方式为Kubernetes提供域名解析服务的DNS服务器。 storage-driver(系统资源插件,必装) storage-driver插件是用于对接块存储、文件存储、对象存储、极速文件存储等Iaas存储服务的FlexVolume驱动。 Everest(系统资源插件,必装) Everest是一个云原生容器存储系统,基于CSI为Kubernetes v1.15.6及以上版本集群对接云硬盘服务 EVS、对象存储服务 OBS、弹性文件服务 SFS、极速文件存储 SFS Turbo等存储服务的能力。 npd(系统资源插件,必装) node-problem-detector(简称:npd)是一款监控集群节点异常事件的插件,以及对接第三方监控平台功能的组件。它是一个在每个节点上运行的守护程序,可从不同的守护进程中搜集节点问题并将其报告给apiserver。node-problem-detector可以作为DaemonSet运行, 也可以独立运行。 Dashboard Kubernetes Dashboard是Kubernetes集群基于Web的通用UI,集合了命令行可以操作的所有命令。它允许用户管理在集群中运行应用程序并对其进行故障排除,以及管理集群本身。 autoscaler 集群自动扩缩容插件autoscaler,是根据pod调度状态及资源使用情况对集群的工作节点进行自动扩容缩容的插件。 metrics-server Metrics-Server是集群核心资源监控数据的聚合器。 cce-hpa-controller cce-hpa-controller插件是一款CCE自研的插件,能够基于CPU利用率、内存利用率等指标,对无状态工作负载进行弹性扩缩容。 prometheus Prometheus是一套开源的系统监控报警框架。在云容器引擎CCE中,支持以插件的方式快捷安装Prometheus。 web-terminal web-terminal是一款支持在Web界面上使用Kubectl的插件。它支持使用WebSocket通过浏览器连接Linux,提供灵活的接口便于集成到独立系统中,可直接作为一个服务连接,通过cmdb获取信息并登录服务器。 virtual kubelet Virtual Kubelet是基于社区Virtual Kubelet开源项目开发的插件,该插件支持用户在短时高负载场景下,将部署在CCE上的无状态负载(Deployment)、有状态负载(StatefulSet)、普通任务(Job)三种资源类型的容器实例(Pod),弹性创建到华为云云容器实例CCI服务上,以减少集群扩容带来的消耗。 gpu-beta gpu-beta插件是支持在容器中使用GPU显卡的设备管理插件,仅支持Nvidia驱动。 huawei-npu huawei-npu是支持容器里使用huawei NPU设备的管理插件。 volcano Volcano源自于华为云高性能批量计算解决方案,在支撑华为云一站式AI开发平台ModelArts、云容器实例CCI等服务稳定运行中发挥重要作用。Volcano提供了高性能任务调度引擎、高性能异构芯片管理、高性能任务运行管理等通用计算能力,通过接入AI、大数据、基因、渲染等诸多行业计算框架服务终端用户。 nginx-ingress nginx-ingress为Service提供了可直接被集群外部访问的虚拟主机、负载均衡、SSL代理、HTTP路由等应用层转发功能。 父主题: 插件管理
  • 命名空间类别 命名空间按创建类型分为两大类:集群默认创建的、用户创建的。 集群默认创建的:集群在启动时会默认创建default、kube-public、kube-system、kube-node-lease命名空间。 default:所有未指定Namespace的对象都会被分配在default命名空间。 kube-public:此命名空间下的资源可以被所有人访问(包括未认证用户),用来部署公共插件、容器模板等。 kube-system:所有由Kubernetes系统创建的资源都处于这个命名空间。 kube-node-lease:每个节点在该命名空间中都有一个关联的“Lease”对象,该对象由节点定期更新。NodeStatus和NodeLease都被视为来自节点的心跳,在v1.13之前的版本中,节点的心跳只有NodeStatus,NodeLease特性从v1.13开始引入。NodeLease比NodeStatus更轻量级,该特性在集群规模扩展性和性能上有明显提升。 用户创建的:用户可以按照需要创建命名空间,例如开发环境、联调环境和测试环境分别创建对应的命名空间。或者按照不同的业务创建对应的命名空间,例如系统若分为登录和游戏服务,可以分别创建对应命名空间。
  • 验证极速文件系统的持久化存储 查询部署的工作负载(以sfsturbo-statefulset-example为例)的实例和极速文件存储文件。 执行以下命令,查看工作负载对应的实例名称。 kubectl get po | grep sfsturbo-statefulset-example 期望输出: sfsturbo-statefulset-example-0 1/1 Running 0 2m5s 执行以下命令,查看/tmp目录下是否挂载了极速文件存储。 kubectl exec sfsturbo-statefulset-example-0 -- mount|grep /tmp 期望输出: 192.168.0.108:/ on /tmp type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.0.108,mountvers=3,mountport=20048,mountproto=tcp,local_lock=all,addr=192.168.0.108) 执行以下命令,在/tmp路径下创建问题test。 kubectl exec sfsturbo-statefulset-example-0 -- touch /tmp/test 执行以下命令,查看/tmp路径下的文件。 kubectl exec sfsturbo-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test 执行以下命令,删除名称为sfsturbo-statefulset-example-0的实例。 kubectl delete po sfsturbo-statefulset-example-0 验证重建后的实例,文件是否仍然存在。 执行以下命令,查看重建的实例名称。 kubectl get po 预期输出: sfsturbo-statefulset-example-0 1/1 Running 0 2m 执行以下命令,查看/tmp路径下的文件。 kubectl exec sfsturbo-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test test文件在实例重建之后仍然存在,说明极速文件系统数据可持久化保存。
  • 操作步骤 参照创建文件存储卷中操作创建极速文件存储卷,记录极速文件存储卷名称。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建一个文件,用于创建工作负载。假设文件名为sfsturbo-statefulset-example.yaml。 touch sfsturbo-statefulset-example.yaml vi sfsturbo-statefulset-example.yaml 配置示例: apiVersion: apps/v1kind: StatefulSetmetadata: name: sfsturbo-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: sfsturbo-statefulset-example template: metadata: labels: app: sfsturbo-statefulset-example spec: volumes: - name: pvc-sfsturbo-example persistentVolumeClaim: claimName: pvc-sfsturbo-example containers: - name: container-0 image: 'nginx:latest' volumeMounts: - name: pvc-sfsturbo-example mountPath: /tmp restartPolicy: Always imagePullSecrets: - name: default-secret serviceName: sfsturbo-statefulset-example-headless updateStrategy: type: RollingUpdate 表1 关键参数说明 参数 描述 replicas 实例数。 name 新建工作负载的名称。 image 新建工作负载使用的镜像。 mountPath 容器内挂载路径。 serviceName 工作负载对应的服务,服务创建过程请参见创建有状态负载(StatefulSet)。 claimName 已有PVC名称。 spec.template.spec.containers.volumeMounts.name和spec.template.spec.volumes.name有映射关系,必须保持一致。 创建有状态工作负载。 kubectl create -f sfsturbo-statefulset-example.yaml
  • 添加文件存储卷 参照创建无状态负载(Deployment)、创建有状态负载(StatefulSet)、创建守护进程集(DaemonSet)或创建普通任务(Job)创建工作负载或普通任务,在添加容器后,展开“数据存储”。在“云存储”页签,单击“添加云存储”。 选择存储类型为“文件存储”。 表2 挂载文件存储参数配置 参数 参数说明 云存储类型 文件存储:文件存储适用于多种使用场景,包括媒体处理、内容管理、大数据和分析应用程序等。 分配方式 使用已有存储 云存储名称:选择已创建的存储,您需要提前创建存储,创建存储步骤请参见创建文件存储卷。 子类型:已创建的文件存储子类型。 存储容量:该容量值为PVC的属性值,若在IaaS侧实施过存储扩容后,容量值不一致是正常的。CCE1.13集群开始支持端到端容器存储扩容功能后,PVC容量才会和存储实体容量一致 自动分配存储 自动创建存储,需要输入存储的容量。 子类型:文件存储子类型为NFS。 存储容量:单位为GB。请不要超过存储容量配额,否则会创建失败。 存储格式:默认选择CSI。 CSI,即Container Storage Interface,容器存储接口机制,用于在Kubernetes和外部存储系统之间建立一套标准的存储管理接口,通过该接口为容器提供存储服务。 加密:勾选“KMS加密”后,将为文件存储提供易用、高安全性的密钥管理服务(Key Management Service,KMS),该功能仅在部分Region的1.13.10及以上版本的集群中支持。若未创建委托请单击“创建委托”,并配置如下参数: 委托名称:委托表示委托方通过创建信任关系,给被委托方授予访问其资源的权限。当“委托名称”为“SFSAccessKMS”时,表示已经成功授权SFS访问KMS,授权成功后,SFS可以获取KMS密钥用来加解密文件系统。 密钥名称:密钥资源创建完成后,可在容器应用中加载使用。如何创建密钥请参见创建密钥。 密钥ID:默认生成。 添加容器挂载 配置如下参数: 子路径:输入文件存储的子路径,如:tmp。 Kubernetes中数据卷挂载的subpath,指引用卷内的子路径而不是其根,不填写时默认为根。现只支持文件存储,必须是相对路径,且不能以“/”或“../”开头。 挂载路径:输入挂载路径,如:/tmp。 数据存储挂载到容器上的路径,请不要挂载在系统目录下,如“/”、“/var/run”等,会导致容器异常。建议挂载在空目录下,若目录不为空,请确保目录下无影响容器启动的文件,否则文件会被替换,导致容器启动异常,工作负载创建失败。 须知: 挂载高危目录的情况下 ,建议使用低权限帐号启动,否则可能会造成宿主机高危文件被破坏。 设置权限。 只读:只能读容器路径中的数据卷。 读写:可修改容器路径中的数据卷,容器迁移时新写入的数据不会随之迁移,会造成数据丢失。 单击“添加容器挂载”可增加多条设置,单击“确定”完成配置。 单击“确定”。
  • 操作步骤 参照存储卷声明PVC中操作创建对象存储卷,并获取PVC名称。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建一个YAML文件,用于创建工作负载。假设文件名为obs-statefulset-example.yaml。 touch obs-statefulset-example.yaml vi obs-statefulset-example.yaml 配置示例: apiVersion: apps/v1kind: StatefulSetmetadata: name: obs-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: obs-statefulset-example template: metadata: labels: app: obs-statefulset-example spec: volumes: - name: pvc-obs-example persistentVolumeClaim: claimName: pvc-obs-example containers: - name: container-0 image: 'nginx:latest' volumeMounts: - name: pvc-obs-example mountPath: /tmp restartPolicy: Always imagePullSecrets: - name: default-secret serviceName: obs-statefulset-example-headless # Headless Service的名称 表1 关键参数说明 参数 描述 replicas 实例数。 name 新建工作负载的名称。 image 新建工作负载使用的镜像。 mountPath 容器内挂载路径。 serviceName 工作负载对应的服务,服务创建过程请参见创建有状态负载(StatefulSet)。 claimName 已有PVC名称。 在有状态工作负载中基于PVCTemplate独占式使用对象存储。 yaml示例如下: apiVersion: apps/v1kind: StatefulSetmetadata: name: obs-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: obs-statefulset-example template: metadata: labels: app: obs-statefulset-example spec: containers: - name: container-0 image: 'nginx:latest' volumeMounts: - name: pvc-obs-auto-example mountPath: /tmp restartPolicy: Always imagePullSecrets: - name: default-secret volumeClaimTemplates: - metadata: name: pvc-obs-auto-example namespace: default annotations: everest.io/obs-volume-type: STANDARD spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: csi-obs serviceName: obs-statefulset-example-headless 创建有状态工作负载。 kubectl create -f obs-statefulset-example.yaml
  • 验证对象存储的持久化存储 查询部署的工作负载(以obs-statefulset-example为例)的实例和对象存储。 执行以下命令,查看工作负载对应的实例名称。 kubectl get po | grep obs-statefulset-example 期望输出: obs-statefulset-example-0 1/1 Running 0 2m5s 执行以下命令,查看/tmp目录下是否挂载了对象存储。 kubectl exec obs-statefulset-example-0 -- mount|grep /tmp 期望输出: s3fs on /tmp type fuse.s3fs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other) 执行以下命令,在/tmp路径下创建文件test。 kubectl exec obs-statefulset-example-0 -- touch /tmp/test 执行以下命令,查看/tmp路径下的文件。 kubectl exec obs-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test 执行以下命令,删除名称为obs-statefulset-example-0的实例 kubectl delete po obs-statefulset-example-0 验证重建后的实例,文件是否仍然存在。 执行以下命令,查看重建的实例名称 kubectl get po 预期输出: obs-statefulset-example-0 1/1 Running 0 2m 执行以下命令,查看/tmp路径下的文件 kubectl exec obs-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test test文件在实例重建之后仍然存在,说明对象存储数据可持久化保存。
  • 操作步骤 请参见通过kubectl连接集群,使用kubectl连接集群。 执行如下命令,配置名为“sfsturbo-deployment-example.yaml”的创建deployment的yaml文件。 touch sfsturbo-deployment-example.yaml vi sfsturbo-deployment-example.yaml 在无状态工作负载中基于pvc共享式使用极速文件存储示例: apiVersion: apps/v1 kind: Deployment metadata: name: sfsturbo-deployment-example # 工作负载名称 namespace: default spec: replicas: 1 selector: matchLabels: app: sfsturbo-deployment-example template: metadata: labels: app: sfsturbo-deployment-example spec: containers: - image: nginx name: container-0 volumeMounts: - mountPath: /tmp # 挂载路径 name: pvc-sfsturbo-example restartPolicy: Always imagePullSecrets: - name: default-secret volumes: - name: pvc-sfsturbo-example persistentVolumeClaim: claimName: pvc-sfsturbo-example # 挂载PVC 表1 关键参数说明 参数 描述 name 为创建的无状态工作负载名称。 app 为无状态工作负载名称。 mountPath 为容器内挂载路径,此处示例中为“/tmp”。 “spec.template.spec.containers.volumeMounts.name” 和 “spec.template.spec.volumes.name”有映射关系,必须保持一致。 执行如下命令创建工作负载。 kubectl create -f sfsturbo-deployment-example.yaml
  • 添加极速文件存储卷 参照创建无状态负载(Deployment)、创建有状态负载(StatefulSet)、创建守护进程集(DaemonSet)或创建普通任务(Job)创建工作负载或普通任务,在添加容器后,展开“数据存储”,在“云存储”页签,单击“添加云存储”。 选择存储类型为“极速文件存储”。 表1 极速文件存储参数说明 参数 参数说明 云存储类型 极速文件存储:适用于多种使用场景,主要面向DevOps、容器微服务、企业办公等场景。 分配方式 使用已有存储 云存储名称:选择已创建的存储,您需要提前导入存储,导入存储步骤请参见导入极速文件存储卷。 添加容器挂载 配置如下参数: 子路径:输入文件存储的子路径,如:tmp。 Kubernetes中数据卷挂载的subpath,指引用卷内的子路径而不是其根,不填写时默认为根。现只支持文件存储,必须是相对路径,且不能以“/”或“../”开头。 挂载路径:输入挂载路径,如:/tmp。 数据存储挂载到容器上的路径,请不要挂载在系统目录下,如“/”、“/var/run”等,会导致容器异常。建议挂载在空目录下,若目录不为空,请确保目录下无影响容器启动的文件,否则文件会被替换,导致容器启动异常,工作负载创建失败。 须知: 挂载高危目录的情况下 ,建议使用低权限帐号启动,否则可能会造成宿主机高危文件被破坏。 设置权限。 只读:只能读容器路径中的数据卷。 读写:可修改容器路径中的数据卷,容器迁移时新写入的数据不会随之迁移,会造成数据丢失。 单击“添加容器挂载”可增加多条设置,单击“确定”完成配置。 单击“确定”。
  • 有状态负载使用云硬盘 请参见通过kubectl连接集群,使用kubectl连接集群。 执行如下命令,配置名为“evs-statefulset-example.yaml”的创建有状态工作负载的yaml文件。 touch evs-statefulset-example.yaml vi evs-statefulset-example.yaml 在有状态工作负载中基于PVCTemplate独占式使用云硬盘存储。 yaml示例如下: apiVersion: apps/v1kind: StatefulSetmetadata: name: evs-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: evs-statefulset-example template: metadata: labels: app: evs-statefulset-example spec: containers: - name: container-0 image: 'nginx:latest' volumeMounts: - name: pvc-evs-auto-example mountPath: /tmp restartPolicy: Always imagePullSecrets: - name: default-secret volumeClaimTemplates: - metadata: name: pvc-evs-auto-example namespace: default labels: failure-domain.beta.kubernetes.io/region: cn-north-4 failure-domain.beta.kubernetes.io/zone: cn-north-4b annotations: everest.io/disk-volume-type: SAS spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: csi-disk serviceName: evs-statefulset-example-headless updateStrategy: type: RollingUpdate 表2 关键参数说明 前置路径 参数 描述 metadata name 创建的工作负载名称。 spec.template.spec.containers image 工作负载的镜像。 spec.template.spec.containers.volumeMount mountPath 容器内挂载路径,示例中挂载到“/tmp”路径。 spec serviceName 工作负载对应的服务,服务创建过程请参见创建有状态负载(StatefulSet)。 “spec.template.spec.containers.volumeMounts.name ”和 “spec.volumeClaimTemplates.metadata.name”有映射关系,必须保持一致。 执行如下命令创建工作负载。 kubectl create -f evs-statefulset-example.yaml
  • 验证云硬盘的持久化存储 查询部署的工作负载(以evs-statefulset-example为例)的实例和云硬盘文件。 执行以下命令,查看工作负载对应的实例名称。 kubectl get po | grep evs-statefulset-example 期望输出: evs-statefulset-example-0 1/1 Running 0 22h 执行以下命令,查看/tmp目录下是否挂载了云硬盘。 kubectl exec evs-statefulset-example-0 -- df tmp 期望输出: /dev/sda 10255636 36888 10202364 1% /tmp 执行以下命令,在/tmp路径下创建问题test。 kubectl exec evs-statefulset-example-0 -- touch /tmp/test 执行以下命令,查看/tmp路径下的文件。 kubectl exec evs-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test 执行以下命令,删除名称为evs-statefulset-example-0的实例 kubectl delete po evs-statefulset-example-0 验证重建后的实例,文件是否仍然存在 执行以下命令,查看重建的实例名称 kubectl get po 预期输出: evs-statefulset-example-0 1/1 Running 0 2m 执行以下命令,查看/tmp路径下的文件 kubectl exec evs-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test test文件在实例重建之后仍然存在,说明云硬盘数据可持久化保存
  • 无状态负载使用云硬盘 请参见通过kubectl连接集群,使用kubectl连接集群。 执行如下命令,配置名为“evs-deployment-example.yaml”的创建无状态工作负载的yaml文件。 touch evs-deployment-example.yaml vi evs-deployment-example.yaml 在无状态工作负载中基于pvc共享式使用云硬盘存储示例: apiVersion: apps/v1 kind: Deployment metadata: name: evs-deployment-example namespace: default spec: replicas: 1 selector: matchLabels: app: evs-deployment-example template: metadata: labels: app: evs-deployment-example spec: containers: - image: nginx name: container-0 volumeMounts: - mountPath: /tmp name: pvc-evs-example imagePullSecrets: - name: default-secret restartPolicy: Always volumes: - name: pvc-evs-example persistentVolumeClaim: claimName: pvc-evs-auto-example 表1 关键参数说明 前置路径 参数 描述 spec.template.spec.containers.volumeMounts name 容器内挂载卷的名称。 spec.template.spec.containers.volumeMounts mountPath 容器内挂载路径,示例中挂载到“/tmp”路径。 spec.template.spec.volumes name 卷的名称。 spec.template.spec.volumes.persistentVolumeClaim claimName 已有PVC名称。 “spec.template.spec.containers.volumeMounts.name ”和 “spec.template.spec.volumes.name”有映射关系,必须保持一致。 执行如下命令创建工作负载。 kubectl create -f evs-deployment-example.yaml
  • 操作步骤 请参见通过kubectl连接集群,使用kubectl连接集群。 执行如下命令,配置名为“obs-deployment-example.yaml”的创建Pod的yaml文件。 touch obs-deployment-example.yaml vi obs-deployment-example.yaml 在无状态工作负载中基于pvc共享式使用对象存储示例: apiVersion: apps/v1 kind: Deployment metadata: name: obs-deployment-example # 工作负载名称 namespace: default spec: replicas: 1 selector: matchLabels: app: obs-deployment-example template: metadata: labels: app: obs-deployment-example spec: containers: - image: nginx name: container-0 volumeMounts: - mountPath: /tmp # 挂载路径 name: pvc-obs-example restartPolicy: Always imagePullSecrets: - name: default-secret volumes: - name: pvc-obs-example persistentVolumeClaim: claimName: pvc-obs-auto-example # PVC名称 “spec.template.spec.containers.volumeMounts.name”和 “spec.template.spec.volumes.name”有映射关系,必须保持一致。 执行如下命令创建工作负载。 kubectl create -f obs-deployment-example.yaml
  • 验证文件系统的持久化存储 查询部署的工作负载(以sfs-statefulset-example为例)的实例和文件存储。 执行以下命令,查看工作负载对应的实例名称。 kubectl get po | grep sfs-statefulset-example 期望输出: sfs-statefulset-example-0 1/1 Running 0 2m5s 执行以下命令,查看/tmp目录下是否挂载了文件存储。 kubectl exec sfs-statefulset-example-0 -- mount|grep /tmp 期望输出: sfs-nas01.cn-north-4.myhuaweicloud.com:/share-c56b9aa4 on /tmp type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.79.96.32,mountvers=3,mountport=2050,mountproto=tcp,local_lock=all,addr=10.79.96.32) 执行以下命令,在/tmp路径下创建问题test。 kubectl exec sfs-statefulset-example-0 -- touch /tmp/test 执行以下命令,查看/tmp路径下的文件。 kubectl exec sfs-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test 执行以下命令,删除名称为sfs-statefulset-example-0的实例 kubectl delete po sfs-statefulset-example-0 验证重建后的实例,文件存储卷内的数据文件会否仍然存在 执行以下命令,查看重建的实例名称 kubectl get po 预期输出: sfs-statefulset-example-0 1/1 Running 0 2m 执行以下命令,查看/tmp路径下的文件 kubectl exec sfs-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test test文件在实例重建之后仍然存在,说明文件系统数据可持久化保存
  • 操作步骤 参照存储卷声明PVC中操作创建文件存储卷,记录文件存储卷名称。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建一个YAML文件,用于创建工作负载。假设文件名为sfs-statefulset-example.yaml。 touch sfs-statefulset-example.yaml vi sfs-statefulset-example.yaml 配置示例: apiVersion: apps/v1kind: StatefulSetmetadata: name: sfs-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: sfs-statefulset-example template: metadata: labels: app: sfs-statefulset-example spec: volumes: - name: pvc-sfs-example persistentVolumeClaim: claimName: pvc-sfs-example containers: - name: container-0 image: 'nginx:latest' volumeMounts: - name: pvc-sfs-example mountPath: /tmp restartPolicy: Always imagePullSecrets: - name: default-secret serviceName: sfs-statefulset-example-headless updateStrategy: type: RollingUpdate 表1 关键参数说明 前置路径 参数 描述 spec replicas 实例数。 metadata name 新建工作负载的名称。 spec.template.spec.containers image 新建工作负载使用的镜像。 spec.template.spec.containers.volumeMounts mountPath 容器内挂载路径。 spec serviceName 工作负载对应的服务,服务创建过程请参见创建有状态负载(StatefulSet)。 spec.template.spec.volumes.persistentVolumeClaim claimName 已有PVC名称。 在有状态工作负载中基于PVCTemplate独占式使用文件存储: yaml配置示例如下: apiVersion: apps/v1kind: StatefulSetmetadata: name: sfs-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: sfs-statefulset-example template: metadata: labels: app: sfs-statefulset-example spec: containers: - name: container-0 image: 'nginx:latest' volumeMounts: - name: pvc-sfs-auto-example mountPath: /tmp restartPolicy: Always imagePullSecrets: - name: default-secret volumeClaimTemplates: - metadata: name: pvc-sfs-auto-example namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: csi-nas serviceName: sfs-statefulset-example-headless updateStrategy: type: RollingUpdate spec.template.spec.containers.volumeMounts.name和spec.template.spec.volumes.name有映射关系,必须保持一致。 创建有状态工作负载。 kubectl create -f sfs-statefulset-example.yaml
  • 约束与限制 CCE默认创建计费模式为“按需计费”的云硬盘。如需使用包周期的云硬盘,请参考云硬盘包周期。 云硬盘不支持跨可用区挂载,且暂时不支持被多个工作负载、同一个工作负载的多个实例或多个任务使用。 由于CCE集群各节点之间暂不支持共享盘的数据共享功能,多个节点挂载使用同一个云硬盘可能会出现读写冲突、数据缓存冲突等问题,所以创建无状态工作负载时,若使用了EVS云硬盘,建议工作负载只选择一个实例。 1.19.10以下版本的集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,当新Pod被调度到另一个节点时,会导致之前Pod不能正常读写。 1.19.10及以上版本集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,新Pod会因为无法挂载云硬盘导致无法成功启动。 创建有状态工作负载并添加云存储时,云硬盘暂不支持使用已有存储。 不支持导入分区过或者具有非ext4文件系统的云硬盘。 CCE集群中的容器存储目前已支持加密(Kubernetes 1.13版本及以上),当前仅在部分区域(Region)提供端到端支持。 存储不支持选择企业项目,新创建的存储卷默认创建到default企业项目下。
  • 添加云硬盘存储卷 参照创建无状态负载(Deployment)、创建有状态负载(StatefulSet)或创建普通任务(Job)创建工作负载或普通任务,在添加容器后,展开“数据存储”。在“云存储”页签,单击“添加云存储”。 选择存储类型为“云硬盘”。 表2 挂载云硬盘参数配置 参数 参数说明 云存储类型 云硬盘:云硬盘的使用方式与传统服务器硬盘完全一致。同时,云硬盘具有更高的数据可靠性,更高的I/O吞吐能力和更加简单易用等特点,适用于文件系统、数据库或者其他需要块存储设备的系统软件或工作负载。 注意: 如需挂载云硬盘,创建工作负载时的实例数量必须选择为1个实例,即单实例,选择多实例后挂载云硬盘的选项将置灰,无法挂载。 创建有状态工作负载并添加云存储时,云硬盘暂不支持使用已有存储。 云硬盘不支持跨可用区挂载,且暂时不支持被多个工作负载、同一个工作负载的多个实例或多个任务使用。 分配方式 使用已有存储 选择已创建的存储,您需要提前创建好存储。 针对同一集群和命名空间,创建无状态工作负载时可以选择“使用已有存储”。 创建有状态工作负载时暂不支持选择“使用已有存储”,只能使用“自动分配存储”。 自动分配存储 选择自动分配存储后,需要配置如下选项: 访问模式:是用来对PV进行访问模式的设置,用于描述用户应用对存储资源的访问权限。 ReadWriteOnce (RWO):基于EVS非共享卷提供容器负载单Pod单读单写块存储的功能,但是该卷只能被单个节点挂载。v1.13.10-r1开始支持RWO模式的EVS卷。 可用区:存储所在的可用区,自动分配存储仅支持Node节点所在可用区。 子类型:选择存储的子类型。 高I/O:是指由SAS存储提供资源的磁盘类型。 超高I/O:是指由SSD存储提供资源的磁盘类型。 存储容量:输入存储容量,单位为GB。请不要超过存储容量配额,否则会创建失败。 存储格式:默认选择CSI。 CSI,即Container Storage Interface,容器存储接口机制,用于在Kubernetes和外部存储系统之间建立一套标准的存储管理接口,通过该接口为容器提供存储服务。 加密:勾选“KMS加密”后,将为云硬盘提供易用、高安全性的密钥管理服务(Key Management Service,KMS),该功能仅在部分Region的1.13.10及以上版本的集群中支持。若未创建委托请单击“创建委托”,并配置如下参数: 委托名称:委托表示委托方通过创建信任关系,给被委托方授予访问其资源的权限。当“委托名称”为“EVSAccessKMS”时,表示已经成功授权EVS访问KMS,授权成功后,EVS可以获取KMS密钥用来加解密云硬盘系统。 密钥名称:密钥资源创建完成后,可在容器应用中加载使用。如何创建密钥请参见创建密钥。 密钥ID:默认生成。 添加容器挂载 单击“添加容器挂载”。 挂载路径:输入数据卷挂载到容器上的路径。 须知: 请不要挂载在系统目录下,如“/”、“/var/run”等,会导致容器异常。建议挂载在空目录下,若目录不为空,请确保目录下无影响容器启动的文件,否则文件会被替换,导致容器启动异常,工作负载创建失败。 挂载高危目录的情况下 ,建议使用低权限帐号启动,否则可能会造成宿主机高危文件被破坏。 设置权限。 只读:只能读容器路径中的数据卷。 读写:可修改容器路径中的数据卷,容器迁移时新写入的数据不会随之迁移,会造成数据丢失。 图1 添加云存储 单击“确定”。
共100000条