华为云用户手册

  • 使用说明 使用便捷:您可以像使用传统服务器硬盘一样,对挂载到服务器上的块存储(硬盘)做格式化、创建文件系统等操作。 数据不共享:每台服务器使用独立的块存储(硬盘),多服务器之间数据隔离。 私有网络:数据访问必须在数据中心内部网络中。 容量性能:单卷容量有限(TB级),但性能极佳(IO读写时延ms级)。 使用限制:不支持导入分区或者具有非ext4文件系统的云硬盘。 应用场景:主要面向HPC高性能计算、企业核心集群应用、企业应用系统和开发测试等。适用于供单实例部署的无状态负载(Deployment)和普通任务(Job),以及有状态工作负载(StatefulSet)的每个实例独占式使用。因为云硬盘属于非共享存储,不能同时被多个节点挂载,若两个Pod配置了使用同一个云硬盘,当这两个Pod被调度到不同的节点时,必然有一个Pod会因为无法挂载云硬盘导致无法成功启动。
  • 卸载插件 登录CCE控制台,进入集群,在左侧导航栏选择“插件管理”,在右侧“已安装插件”页签下,单击virtual kubelet下的“卸载”。 在弹出的窗口中,单击“是”,可卸载该插件。(卸载插件会自动删除CCI侧的所有资源,以确保不会有资源残留造成额外计费) 由于virtual-kubelet插件卸载时会在集群中启动Job用于清理资源,卸载插件时请保证集群中至少有一个可以调度的节点,否则卸载插件会失败。若已经因无可调度节点造成插件卸载失败,需要在有可调度节点后重新单击插件卸载。 如果在未卸载virtual-kubelet插件的情况下直接删除集群,CCI侧的资源不会被自动清理,会导致CCI侧资源残留,可能会造成额外计费。因此请确保完成以下任意一操作。 在删除集群前先卸载virtual-kubelet插件。 在直接删除集群后登录CCI控制台删除名为cce-burst-${CLUSTER_ID}的命名空间。 集群休眠时CCI侧正在运行的实例不会自动停止,会持续运行并计费。因此如不需要实例继续运行,请确保在集群休眠前将弹性到CCI的负载实例数缩至0。
  • 注意事项 退订/释放集群会删除集群下的节点(纳管节点不会被删除)、节点挂载的数据盘、工作负载与服务,相关业务将无法恢复。在执行操作前,请确保数据已完成备份或者迁移,退订/释放完成后数据无法找回,请谨慎操作。 部分不是在CCE中创建的资源不会删除: 纳管的节点(仅删除在CCE中创建的节点) Service和Ingress关联的ELB实例(仅删除自动创建的ELB实例) 手动创建PV关联的 云存储 /导入的云存储(仅删除PVC自动创建的云存储) 退订/释放集群仅退订订单关联的资源,非关联资源不会处理,相关资源会继续计费,请妥善处理。 对于包周期集群,如果过保留期会自动释放,集群下的节点如果同时到期会一并释放,节点如果未到期会重装节点操作系统。请关注您帐号下到期未续费集群,及时续费,防止节点被重装导致数据丢失。 集群资源包含控制节点资源和工作节点所使用的的基础设施,详情请参见计费说明。 订单中存在主从关系的资源,需分别退订。 资源退订,相关注意事项请参见退订规则说明。 如果您正在退订使用中的资源,请仔细确认资源信息和退款信息,资源退订后将无法恢复。若您要保留资源,仅退订未使用的续费周期,请退订续费周期。 如果您退订的资源与其他包年/包月资源关联,退订操作可能会影响关联资源的正常使用,请谨慎操作。 如果已与其他按需资源关联,退订操作完成后,关联的按需资源可以正常使用并计费。 如果您本次退订属于非五天无理由退订,需收取手续费和已消费金额,已使用的代金券和折扣券不退还。
  • 注意事项 集群升级过程中会自动升级插件到目标集群兼容的版本,升级过程中请不要卸载或者重装插件。 升级之前请确认所有的插件都处于运行状态,如果插件升级失败可以在插件问题修复后,重试升级。 升级时会检查插件运行状态,部分插件(如CoreDNS)需要至少两个节点才能维持正常状态,那此时升级就至少需要两个节点。 若在集群升级过程中出现升级失败的提示,请参照提示信息修复问题后单击重试,若重试后仍未成功升级,请提交工单协助您进行修复。 更多注意事项请参见升级前须知。
  • 资源自动规整 对弹性到CCI的Pod,若其配置的资源规格不满足CCI容器规范,virtual-kubelet会自动尝试将Pod资源向上规整到满足CCI容器规范的范围,以规整后的资源规格创建Pod到CCI。 自动规整规则如下: 将Pod中除了BestEffort类型容器外的每个容器CPU向上调整至0.25核的整数倍, Memory向上调整至大于等于0.2Gi。 将整个Pod的Memory向上调整至1Gi的整数倍。 若Pod Memory/CPU的比值小于2,则将Pod Memory向上调整至大于等于CPU的2倍,且满足是1Gi的整数倍;若Pod Memory/CPU的比值大于8,则将Pod CPU向上调整至大于等于Memory的1/8,且满足是0.25核的整数倍。 若向上调整之后,CPU超过32核或Memory超过256Gi,则矫正失败,拒绝创建请求。 以上对Pod级别资源向上调整造成的增量CPU和Memory,全部添加到Pod中第一个不为BestEffort的容器上。
  • 通过YAMl文件配置 无状态工作负载示例模板: apiVersion: apps/v1kind: Deploymentmetadata: name: test-vk labels: virtual-kubelet.io/burst-to-cci: 'auto'spec: replicas: 20 selector: matchLabels: app: test-vk template: metadata: labels: app: test-vk spec: containers: - name: container-0 image: centos:latest resources: limits: cpu: 500m memory: 1024Mi requests: cpu: 500m memory: 1024Mi command: - /bin/bash - '-c' - sleep 10000 dnsPolicy: Default Pod示例模板: apiVersion: v1kind: Podmetadata: name: nginx labels: virtual-kubelet.io/burst-to-cci: 'auto'spec: containers: - image: nginx:alpine name: container-0 resources: limits: cpu: 500m memory: 1024Mi requests: cpu: 500m memory: 1024Mi imagePullSecrets: - name: default-secret 创建弹性至CCI的负载时需要在工作负载或Pod的labels中添加如下字段: virtual-kubelet.io/burst-to-cci: "auto" 其中,value值支持以下选项: auto:根据用户集群内调度器实际打分结果自动决定是否弹性至CCI,其中在TaintToleration算法上会优先选择调度到CCE节点。 localPrefer:集群资源不足时,将Pod部署到CCI。 enforce:强制调度至CCI。 off:不调度至CCI。
  • 约束及限制 仅支持VPC网络模式的CCE集群和 CCE Turbo 集群(virtual-kubelet 1.2.5版本及以上支持),暂不支持ARM集群。如果集群中包含ARM节点,插件实例将不会部署至ARM节点。 调度到CCI的实例的存储类型只支持ConfigMap、Secret、emptyDir、SFS、SFS Turbo几种Volume类型,其中emptyDir不支持子路径,且SFS、SFS Turbo类型存储对应的PVC只支持使用 CS I类型的StorageClass。 暂不支持守护进程集(DaemonSet)以及HostNetwork网络模式的容器实例(Pod)弹性到CCI。 跨CCE和CCI实例Service网络互通只支持集群内访问(ClusterIP)类型。 跨CCE和CCI实例,在对接LoadBalancer类型的Service或Ingress时,禁止指定健康检查端口: 1. 在CCE集群下,由于CCI的容器与CCE的容器在ELB注册的后端使用端口不一致,指定健康检查端口会导致部分后端健康检查异常。 2. 跨集群使用Service对接同一个ELB的监听器时,需确认健康检查方式,避免服务访问异常。 3. 跨CCE和CCI实例,在对接共享型LoadBalancer类型的Service时,需要放通node安全组下100.125.0.0/16网段的容器端口。 集群所在子网不能与10.247.0.0/16重叠,否则会与CCI命名空间下的Service网段冲突,导致无法使用。 使用插件前需要用户在CCI界面对CCI服务进行授权。 安装virtual-kubelet插件后会在CCI服务新建一个名为"cce-burst-"+集群ID的命名空间,该命名空间完全由virtual-kubelet管理,不建议直接在CCI服务使用该命名空间,如需使用CCI服务,请另外新建命名空间。 实例的规格必须满足云容器实例CCI的容器规范。 使用1.2.5以下版本插件时,各容器的Requests须等于Limits(1.2.5及以上版本插件两者可不相等,弹性到CCI时自动将两者设置为一样,若配置了Limits,则以Limits为准,没有配Limits,则以Requests为准)。 Pod中至少有1个容器配置CPU大于0。 经过资源自动规整后,Pod总CPU不得超过32核,内存不得超过256Gi。 弹性到CCI的业务量不同时,插件的资源占用也不相同。业务申请的POD、Secret、Congfigmap、PV、PVC会占用虚机资源。建议用户评估自己的业务使用量,按以下规格申请对应的虚机大小:1000pod+1000CM(300KB)推荐2U4G规格节点,2000pod+2000CM推荐4U8G规格节点,4000pod+4000CM推荐8U16G规格节点。 当弹性到CCI的资源调度失败时,virtual-kubelet节点会被锁定半小时,期间无法调度至CCI。用户可通过CCE集群控制台,使用kubectl工具查看virtual-kubelet节点状态,若节点被锁定,可手动解锁virtual-kubelet。
  • 安装插件 在CCE控制台,单击集群名称进入集群,单击左侧导航栏的“插件管理”,在右侧找到virtual-kubelet,单击“安装”。 在“规格配置”步骤中,勾选“网络互通”后的选择框,可实现CCE集群中的Pod与CCI集群中的Pod通过Kubernetes Service互通。 图1 勾选“网络互通” 单击“安装”。 勾选了网络互通后,会在CCI运行的Pod中注入一个sidecar用于支持service访问的能力,查询到的运行容器数量会比定义的多一个,属于正常情况。
  • 通过kubectl命令行创建 请参见通过kubectl连接集群,使用kubectl连接集群。 创建一个名为securitygroup-demo.yaml的描述文件。 vi securitygroup-demo.yaml 例如,用户创建如下的SecurityGroup资源对象,给所有的app:nginx工作负载绑定上提前已经创建的64566556-bd6f-48fb-b2c6-df8f44617953,5451f1b0-bd6f-48fb-b2c6-df8f44617953的两个安全组。示例如下: apiVersion: crd.yangtse.cni/v1kind: SecurityGroupmetadata: name: demo namespace: defaultspec: podSelector: matchLabels: app: nginx securityGroups: - id: 64566556-bd6f-48fb-b2c6-df8f44617953 - id: 5451f1b0-bd6f-48fb-b2c6-df8f44617953 以上yaml参数说明如表2。 表2 参数说明 字段名称 字段说明 必选/可选 apiVersion 表示API的版本号,版本号为crd.yangtse.cni/v1。 必选 kind 创建的对象类别。 必选 metadata 资源对象的元数据定义。 必选 name SecurityGroup的名称。 必选 namespace 工作空间名称。 必选 Spec 用户对SecurityGroup的详细描述的主体部分都在spec中给出。 必选 podselector 定义SecurityGroup中需要关联安全组的工作负载。 必选 SecurityGroups id为安全组的ID。 必选 执行以下命令,创建SecurityGroup。 kubectl create -f securitygroup-demo.yaml 回显如下表示已开始创建SecurityGroup securitygroup.crd.yangtse.cni/demo created 执行以下命令,查看SecurityGroup。 kubectl get sg 回显信息中有创建的SecurityGroup名称为demo,表示SecurityGroup已创建成功。 NAME POD-SELECTOR AGEall-no map[matchLabels:map[app:nginx]] 4h1ms001test map[matchLabels:map[app:nginx]] 19mdemo map[matchLabels:map[app:nginx]] 2m9s
  • 约束与限制 CustomedHPA策略:仅支持1.15及以上版本的集群创建。 每个工作负载只能创建一个策略,即如果您创建了一个HPA策略,则不能再对其创建CustomedHPA策略或其他HPA策略,您可以删除该HPA策略后再创建。 1.19.10以下版本的集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,当新Pod被调度到另一个节点时,会导致之前Pod不能正常读写。 1.19.10及以上版本集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,新Pod会因为无法挂载云硬盘导致无法成功启动。
  • 背景信息 默认情况下,运行中的Pod可以无限制的使用Node节点上的CPU和内存,这意味着任意一个Pod都可以无节制地使用集群的计算资源,某个命名空间的Pod可能会耗尽集群的所有资源。 kubernetes在一个物理集群上提供了多个虚拟集群,这些虚拟集群被称为命名空间。命名空间可用于多种工作用途,满足多用户的使用需求,通过为每个命名空间配置资源额度可以有效限制资源滥用,从而保证集群的可靠性。 您可为命名空间配置包括CPU、内存、Pod数量等资源的额度,更多信息请参见Resource Quotas。 其中,不同的集群规模对应的Pod数量推荐值如下: 集群规模 Pod数量推荐值 50节点 2500 Pod实例 200节点 1W Pod实例 1000节点 3W Pod实例 2000节点 5W Pod实例 从1.21版本集群开始,创建命名空间将会同时创建默认的资源配额Resource Quotas,根据集群规格不同,各个资源的配额如表1所示。您可以根据实际需求修改。 表1 默认资源配额 集群规模 Pod Deployment Secret ConfigMap Service 50节点 2000 1000 1000 1000 1000 200节点 2000 1000 1000 1000 1000 1000节点 5000 2000 2000 2000 2000 2000节点 5000 2000 2000 2000 2000
  • HPA工作原理 HPA(Horizontal Pod Autoscaler)是用来控制Pod水平伸缩的控制器,HPA周期性检查Pod的度量数据,计算满足HPA资源所配置的目标数值所需的副本数量,进而调整目标资源(如Deployment)的replicas字段。 想要做到自动弹性伸缩,先决条件就是能感知到各种运行数据,例如集群节点、Pod、容器的CPU、内存使用率等等。而这些数据的监控能力Kubernetes也没有自己实现,而是通过其他项目来扩展Kubernetes的能力,CCE提供Prometheus和Metrics Server插件来实现该能力: Prometheus是一套开源的系统监控报警框架,能够采集丰富的Metrics(度量数据),目前已经基本是Kubernetes的标准监控方案。 Metrics Server是Kubernetes集群范围资源使用数据的聚合器。Metrics Server从kubelet公开的Summary API中采集度量数据,能够收集包括了Pod、Node、容器、Service等主要Kubernetes核心资源的度量数据,且对外提供一套标准的API。 使用HPA(Horizontal Pod Autoscaler)配合Metrics Server可以实现基于CPU和内存的自动弹性伸缩,再配合Prometheus还可以实现自定义监控指标的自动弹性伸缩。 HPA主要流程如图1所示。 图1 HPA流程图
  • AutoScaler架构 AutoScaler架构如图1所示,主要由以下几个核心模块组成: 图1 AutoScaler架构图 说明如下: Estimator: 负责扩容场景下,评估满足当前不可调度Pod时,每个节点池需要扩容的节点数量。 Simulator: 负责缩容场景下,找到满足缩容条件的节点。 Expander: 负责在扩容场景下,根据用户设置的不同的策略来,从Estimator选出的节点池中,选出一个最佳的选择。当前Expander有多种策略: Random: 随机选择一个节点池,如果用户没有设置的话,默认是Random。 most-Pods: 选择此次扩容后能满足调度最多Pod的节点池,如果有相同的,再随机选择一个。 least-waste: 选择此次扩容完成后,具有最小浪费的CPU或者Mem资源的节点池。 price: 选择此次扩容所需节点金额最小的节点池。 priority: 根据用户自定义的权重,选择权重最高的节点池。 当前CCE提供除Price以外的所有的策略,当前CCE插件默认使用least-waste策略。
  • Autoscaler工作原理 Autoscaler(简称CA)的主要流程包括两部分: ScaleUp流程: CA会每隔10s检查一次所有不可调度的Pod,根据用户设置的策略,选择出一个符合要求的节点组进行扩容。 ScaleDown流程:CA每隔10s会扫描一次所有的Node,如果该Node上所有的Pod Requests少于用户定义的缩容百分比时,CA会模拟将该节点上的Pod是否能迁移到其他节点,如果可以的话,当满足不被需要的时间窗以后,该节点就会被移除。 如上所述,当集群节点处于一段时间空闲状态时(默认10min),会触发集群缩容操作。 当节点存在以下几种状态的pod时,不可缩容: 节点上的pod有设置PodDisruptionBudget,当移除pod不满足对应条件时,节点不会缩容。 节点上的pod由于一些限制,如亲和、反亲和或者taints等,无法调度到其他节点,节点不会缩容。 节点上的pod拥有"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"这个annotations时,节点不缩容。 节点上存在kube-system namespace下的Pod(除kube-system daemonset创建的Pod),节点不缩容。 节点上有非controller(deployment/replica set/job/stateful set)创建的Pod,节点不缩容。
  • 云原生网络2.0网络模型 云原生网络2.0是自研的新一代容器网络模型,深度整合了 虚拟私有云VPC 的弹性网卡(Elastic Network Interface,简称ENI)和辅助弹性网卡(Sub Network Interface,简称Sub-ENI)的能力,直接从VPC网段内分配容器IP地址,支持ELB直通容器,绑定安全组,绑定弹性公网IP,享有高性能。 图1 云原生网络2.0 说明如下: 节点内Pod间通信:直接通过VPC的弹性网卡/弹性辅助网卡进行流量转发。 跨节点Pod间通信:直接通过VPC的弹性网卡/弹性辅助网卡进行流量转发。
  • 网段规划建议 在集群网络构成中介绍集群中网络地址可分为节点网络、容器网络、服务网络三块,在规划网络地址时需要从如下方面考虑: 三个网段不能重叠,否则会导致冲突。且集群所在VPC下所有子网(包括扩展网段子网)不能和容器网段、服务网段冲突。 保证每个网段有足够的IP地址可用。 节点网段的IP地址要与集群规模相匹配,否则会因为IP地址不足导致无法创建节点。 容器网段的IP地址要与业务规模相匹配,否则会因为IP地址不足导致无法创建Pod。 云原生网络2.0模型下,由于容器网段与节点网段共同使用VPC下的网络地址,建议容器子网与节点子网不要使用同一个子网,否则容易出现IP资源不足导致容器或节点创建失败的情况。 另外云原生网络2.0模型下容器网段支持在创建集群后增加子网,扩展可用IP数量,此时需要注意增加的子网不要与容器网段其他子网存在网络冲突。 图3 网段配置
  • 网络隔离说明 打开网络隔离其实是在这个命名空间下创建一个NetworkPolicy,这个NetworkPolicy选择命名空间下所有的Pod,然后不让其他命名空间的Pod访问。 kind: NetworkPolicyapiVersion: networking.k8s.io/v1metadata: name: deny-default namespace: defaultspec: ingress: - from: - podSelector: {} podSelector: {} # {}表示选择所有Pod NetworkPolicy还可以自定义,具体请参见网络策略(NetworkPolicy)。
  • 容器IP地址管理 容器隧道网络按如下规则分配容器IP: 容器网段需单独分配,与节点网段无关 节点维度划分地址段,集群的所有节点从容器网段中分配一个或多个固定大小(默认16)的IP网段 当节点上的IP地址使用完后,可再次申请分配一个新的IP网段 容器网段依次循环分配IP网段给新增节点或存量节点 调度到节点上的Pod依次循环从分配给节点的一个或多个IP网段内分配IP地址 图2 容器隧道网络IP地址分配 按如上IP分配,容器隧道网络的集群最多能创建节点数量 = 容器网段IP数量 ÷ 节点从容器网段中一次分配的IP网段大小(默认为16) 比如容器网段为172.16.0.0/16,则IP数量为65536,一次分配16,则最多可创建节点数量为65536/16=4096。这是一种极端情况,如果创建4096个节点,则每个节点最多只能创建16个Pod,因为给每个节点只分配了16个IP的网段。另外集群能创建多少节点,还受节点网络和集群规模的影响。 图3 网络模型选择
  • 网段规划建议 在集群网络构成中介绍集群中网络地址可分为节点网络、容器网络、服务网络三块,在规划网络地址时需要从如下方面考虑: 三个网段不能重叠,否则会导致冲突。且集群所在VPC下所有子网(包括扩展网段子网)不能和容器网段、服务网段冲突。 保证每个网段有足够的IP地址可用。 节点网段的IP地址要与集群规模相匹配,否则会因为IP地址不足导致无法创建节点。 容器网段的IP地址要与业务规模相匹配,否则会因为IP地址不足导致无法创建Pod。每个节点上可以创建多少Pod还与其他参数设置相关,具体请参见节点最多可以创建多少个Pod。 如下所示的配置中,集群规模为200节点,容器网络模型为容器隧道网络。 则此时选择节点子网的可用IP数量需要超过200,否则会因为IP地址不足导致无法创建节点。 容器网段为10.0.0.0/16,可用IP数量为65533,这些IP最多能分配到4096个节点上(每个节点单次分配16个IP,具体分配方法请参见容器IP地址管理)。
  • 容器隧道网络模型 容器隧道网络在节点网络基础上通过隧道封装另构建的独立于节点网络平面的容器网络平面,CCE集群容器隧道网络使用的封装协议为VXLAN,后端虚拟交换机采用的是openvswitch,VXLAN是将以太网报文封装成UDP报文进行隧道传输。容器隧道网络具有付出少量隧道封装性能损耗,即可获得通用性强、互通性强、高级特性支持全面(例如NetworkPolicy网络隔离)的优势,可以满足大多数性能要求不高的场景。 图1 容器隧道网络 说明如下: 节点内Pod间通信:同节点的Pod间通信直接通过本节点的ovs网桥直接转发。 跨节点Pod间通信:所有跨节点Pod间的通信通过ovs隧道网桥进行封装后,转发到对端节点上。
  • 应用场景 对性能要求不高:由于需要额外的VXLAN隧道封装,相对于另外两种容器网络模式,性能存在一定的损耗。大概有5%-15%的性能损失。所以容器隧道网络适用于对性能要求不是特别高的业务场景,比如:web应用、访问量不大的数据中台、后台服务等。 大规模组网:相比VPC路由网络受限于VPC路由条目配额的限制,容器隧道网络没有网络基础设施的任何限制;同时容器隧道网络把广播域控制到了节点级别,容器隧道网络最大可支持2000节点规模。
  • 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网络模型 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 容器网段配置
  • 网段规划建议 在集群网络构成中介绍集群中网络地址可分为节点网络、容器网络、服务网络三块,在规划网络地址时需要从如下方面考虑: 三个网段不能重叠,否则会导致冲突。且集群所在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个。
  • 命名空间使用实践 按照不同环境划分命名空间 一般情况下,工作负载发布会经历开发环境、联调环境、测试环境,最后到生产环境的过程。这个过程中不同环境部署的工作负载相同,只是在逻辑上进行了定义。分为两种做法: 分别创建不同集群。 不同集群之间,资源不能共享。同时,不同环境中的服务互访需要通过负载均衡才能实现。 不同环境创建对应命名空间。 同个命名空间下,通过服务名称(Service name)可直接访问。跨命名空间的可以通过服务名称、命名空间名称访问。 例如下图,开发环境/联调环境/测试环境分别创建了命名空间。 图1 不同环境创建对应命名空间 按照应用划分命名空间 对于同个环境中,应用数量较多的情况,建议进一步按照工作负载类型划分命名空间。例如下图中,按照APP1和APP2划分不同命名空间,将不同工作负载在逻辑上当做一个工作负载组进行管理。且同一个命名空间内的工作负载可以通过服务名称访问,不同命名空间下的通过服务名称、命名空间名称访问。 图2 按照工作负载划分命名空间
  • 背景介绍 随着Kubernetes已经成为云原生应用编排、管理的事实标准,越来越多的应用选择向Kubernetes迁移,用户也越来越关心在Kubernetes上应用如何快速扩容面对业务高峰,以及如何在业务低谷时快速缩容节约资源与成本。 在Kubernetes的集群中,“弹性伸缩”一般涉及到扩缩容Pod个数以及Node个数。Pod代表应用的实例数(每个Pod包含一个或多个容器),当业务高峰的时候需要扩容应用的实例个数。所有的Pod都是运行在某一个节点(虚机或裸机)上,当集群中没有足够多的节点来调度新扩容的Pod,那么就需要为集群增加节点,从而保证业务能够正常提供服务。 弹性伸缩在CCE上的使用场景非常广泛,典型的场景包含在线业务弹性、大规模计算训练、深度学习GPU或共享GPU的训练与推理、定时周期性负载变化等。
  • 组件介绍 工作负载弹性组件介绍 表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社区开源组件,节点水平伸缩组件,华为云提供了独有的调度、弹性优化、成本优化的功能。 全场景支持,适合在线业务、深度学习、大规模成本算力交付等。 节点自动伸缩
  • CCE弹性伸缩 CCE的弹性伸缩能力分为如下两个维度: 工作负载弹性伸缩:即调度层弹性,主要是负责修改负载的调度容量变化。例如,HPA是典型的调度层弹性组件,通过HPA可以调整应用的副本数,调整的副本数会改变当前负载占用的调度容量,从而实现调度层的伸缩。 节点弹性伸缩:即资源层弹性,主要是集群的容量规划不能满足集群调度容量时,会通过弹出ECS或CCI等资源的方式进行调度容量的补充。CCE容器实例弹性到CCI服务的方法请参见CCE容器实例弹性伸缩到CCI服务。 两个维度的弹性组件与能力可以分开使用,也可以结合在一起使用,并且两者之间可以通过调度层面的容量状态进行解耦,详情请参见使用HPA+CA实现工作负载和节点联动弹性伸缩。
  • 修改全局默认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配置。
共100000条