华为云用户手册

  • 操作步骤 下文以nginx镜像创建无状态工作负载,并创建一个具有pass-through的Service。 使用nginx镜像创建无状态负载。 apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx:latest name: container-0 resources: limits: cpu: 100m memory: 200Mi requests: cpu: 100m memory: 200Mi imagePullSecrets: - name: default-secret Loadbalance类型的Service,并设置kubernetes.io/elb.pass-through为true。本示例中自动创建了一个名为james的共享型ELB实例。 Loadbalance类型的Service具体创建方法请参见自动创建负载均衡类型Service。 apiVersion: v1 kind: Service metadata: annotations: kubernetes.io/elb.pass-through: "true" kubernetes.io/elb.class: union kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}' labels: app: nginx name: nginx spec: externalTrafficPolicy: Local ports: - name: service0 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer
  • 约束限制 独享型负载均衡配置pass-through后,CCE Standard集群在工作负载同节点和同节点容器内无法通过Service访问。 1.15及以下老版本集群暂不支持该能力。 IPVS网络模式下,对接同一个ELB的Service需保持pass-through设置情况一致。 使用节点级别(Local)的服务亲和的场景下,会自动设置kubernetes.io/elb.pass-through为onlyLocal,开启pass-through能力。
  • 通过控制台配置GRPC协议的后端服务 登录CCE控制台,单击集群名称进入集群。 选择左侧导航栏的“服务”,在右侧选择“路由”页签,单击右上角“创建路由”。 设置Ingress参数。 名称:自定义Ingress名称,例如ingress-demo。 负载均衡器:选择对接的ELB实例或自动创建ELB实例,仅支持使用独享型ELB。 监听器配置:选择“对外协议”为“HTTPS”,“后端协议”可选择“GRPC”。其余配置参数可根据实际需求进行填写,详细说明请参见通过控制台创建ELB Ingress。 仅独享型ELB支持选择GRPC协议,且需开启HTTP/2,系统将自动为您添加kubernetes.io/elb.http2-enable:true注解。当前GRPC功能仅在部分区域开放,请以控制台呈现为准。 转发策略配置:选择一个目标服务,将请求转发到对应的目标Service处理。 (可选)设置健康检查协议为GRPC:单击“更改配置”,启用健康检查,并选择GRPC协议。 配置完成后,单击“确定”。
  • 导入存储池 创建节点时导入 在创建节点时,在存储配置中可以为节点添加数据盘,选择“作为临时存储卷”导入存储池,详情请参见创建节点。 图1 导入临时卷 手动导入 如果创建节点时没有导入临时存储卷,或当前存储卷容量不够,可以进行手动导入。 前往ECS控制台为节点添加SCSI类型的磁盘。操作步骤详情请参见新增磁盘。 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“存储”,并切换至“存储池”页签。 查看已添加磁盘的节点,选择“导入临时卷”,导入时可以选择写入模式。 如存储池列表中未找到手动挂载的磁盘,请耐心等待1分钟后刷新列表。 线性:线性逻辑卷是将一个或多个物理卷整合为一个逻辑卷,实际写入数据时会先往一个基本物理卷上写入,当存储空间占满时再往另一个基本物理卷写入。 条带化:创建逻辑卷时指定条带化,当实际写入数据时会将连续数据分成大小相同的块,然后依次存储在多个物理卷上,实现数据的并发读写从而提高读写性能。多块卷才能选择条带化。
  • 常见问题 Error from server Forbidden 使用kubectl在创建或查询Kubernetes资源时,显示如下内容: # kubectl get deploy Error from server (Forbidden): deployments.apps is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "deployments" in API group "apps" in the namespace "default" 原因是用户没有操作该Kubernetes资源的权限,请参见命名空间权限(Kubernetes RBAC授权)为用户授权。 The connection to the server localhost:8080 was refused 使用kubectl在创建或查询Kubernetes资源时,显示如下内容: The connection to the server localhost:8080 was refused - did you specify the right host or port? 原因是由于该kubectl客户端未配置集群认证,请参见4进行配置。
  • 使用kubectl连接集群 若您需要从客户端计算机连接到Kubernetes集群,可使用Kubernetes命令行客户端kubectl,您可登录CCE控制台,单击待连接集群名称,在集群“总览”页面查看访问地址以及kubectl的连接步骤。 图1 集群连接信息 您需要先下载kubectl以及配置文件,复制到您的客户端机器,完成配置后,即可以访问Kubernetes集群。使用kubectl连接集群的步骤如下: 准备环境 您需要准备一台与集群同VPC的虚拟机,并绑定弹性公网IP用于下载kubectl。 下载kubectl 如果已经安装kubectl,则跳过此步骤,您可执行kubectl version命令判断是否已安装kubectl。 本文以Linux环境为例安装和配置kubectl,详情请参考安装kubectl。 登录到您的客户端机器,下载kubectl。 cd /home curl -LO https://dl.k8s.io/release/{v1.25.0}/bin/linux/amd64/kubectl 其中{v1.25.0}为指定的版本号,请根据集群版本进行替换。 安装kubectl。 chmod +x kubectl mv -f kubectl /usr/local/bin 获取kubectl配置文件 在集群概览页中的“连接信息”版块,单击kubectl后的“配置”按钮,查看kubectl的连接信息,并在弹出页面中下载配置文件。 图2 下载配置文件 kubectl配置文件(kubeconfig.json)用于对接认证集群,请您妥善保存该认证凭据,防止文件泄露后,集群有被攻击的风险。 IAM用户下载的配置文件所拥有的Kubernetes权限与CCE控制台上IAM用户所拥有的权限一致。 如果Linux系统里面配置了KUBECONFIG环境变量,kubectl会优先加载KUBECONFIG环境变量,而不是$home/.kube/config,使用时请注意。 配置kubectl 以Linux环境为例配置kubectl。 登录到您的客户端机器,复制3中下载的配置文件(kubeconfig.json)到您客户端机器的/home目录下。 配置kubectl认证文件。 cd /home mkdir -p $HOME/.kube mv -f kubeconfig.json $HOME/.kube/config 切换kubectl的访问模式。 kubectl config use-context internal
  • 权限说明 kubectl访问CCE集群是通过集群上生成的配置文件(kubeconfig.json)进行认证,kubeconfig.json文件内包含用户信息,CCE根据用户信息的权限判断kubectl有权限访问哪些Kubernetes资源。即哪个用户获取的kubeconfig.json文件,kubeconfig.json就拥有哪个用户的信息,这样使用kubectl访问时就拥有这个用户的权限。 用户拥有的权限请参见集群权限(IAM授权)与命名空间权限(Kubernetes RBAC授权)的关系。
  • 约束与限制 节点:分布式集群当前仅支持普通x86虚拟机。暂不支持节点迁移功能。 节点池:节点池随机调度功能仅限于分区内。 存储:当前仅支持在边缘区域创建云硬盘(EVS),其他种类存储方式不推荐使用。 服务与路由:仅支持独享型ELB;仅支持在智能边缘云类型的分区创建4层ELB,其他类型需要将ELB实例创建在中心分区。 插件:分布式集群支持如下插件,且优先将插件部署在云上节点。 everest coredns node-local-dns autoscaler metrics-server npd dashboard huawei-npu gpu-device-plugin(原gpu-beta)
  • 核心概念 为了区分云上资源和分布在不同边缘区域的资源,也为了方便用户使用和管理处于不同区域的资源,引入了分区概念,定义如下: 计算角度:一个分区是一组“风火水电”相互隔离、但网络位置靠近(通常互访时延小于2ms)的数据中心可用区(available zone)的集合。将应用分散在一个分区内不同可用区可以实现应用高可用性。 网络角度:一个分区内节点和容器需要使用创建在该分区内可用区下的虚拟私有云(VPC)子网。为方便配置和管理,分区创建时需设定默认子网,当创建节点不指定子网时,会填入分区默认子网。 其他属性:分区包含资源类别,即中心云、智能边缘云或智能边缘小站。该属性的配置方便后续负载的调度。
  • 使用kubectl创建第三方镜像仓库的密钥 请参见通过kubectl连接集群,使用kubectl连接集群。 通过kubectl创建认证密钥 ,该密钥类型为kubernetes.io/dockerconfigjson类型。 kubectl create secret docker-registry myregistrykey -n default --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL 其中,myregistrykey为密钥名称,default为密钥所在的命名空间,其余参数如下所示。 DOCKER_REGISTRY_SERVER:第三方镜像仓库的地址,如“www.3rdregistry.com”或“10.10.10.10:443”。 DOCKER_USER:第三方镜像仓库的账号。 DOCKER_PASSWORD:第三方镜像仓库的密码。 DOCKER_EMAIL:第三方镜像仓库的邮箱。 创建工作负载时使用第三方镜像,具体步骤请参见如下。 kubernetes.io/dockerconfigjson类型的密钥作为私有镜像获取的认证方式,以Pod为例,创建的myregistrykey作为镜像的认证方式。 apiVersion: v1 kind: Pod metadata: name: foo namespace: default spec: containers: - name: foo image: www.3rdregistry.com/janedoe/awesomeapp:v1 imagePullSecrets: - name: myregistrykey #使用上面创建的密钥
  • 通过界面操作 创建第三方镜像仓库的密钥。 单击集群名称进入集群,在左侧导航栏选择“配置与密钥”,在右侧选择“密钥”页签,单击右上角“创建密钥”,密钥类型必须选择为kubernetes.io/dockerconfigjson。详细操作请参见创建密钥。 此处的“用户名”和“密码”请填写第三方镜像仓库的账号密码。 图1 添加密钥 创建工作负载时,可以在“镜像名称”中直接填写私有镜像地址,填写的格式为domainname/namespace/imagename:tag,并选择1中创建的密钥。 图2 填写私有镜像地址 填写其他参数后,单击“创建工作负载”。
  • 指标说明 节点池视图暴露的指标如下: 图1 节点池资源指标 表1 视图说明 图表名称 单位 说明 节点池CPU分配率 百分比 节点池里的所有节点的Pod CPU Request总量占所有节点CPU总量的比例 节点池CPU使用率 百分比 节点池里的所有节点CPU使用量占总量的比例 节点池内存分配率 百分比 节点池里的所有节点的Pod 内存Request总量占所有节点内存总量的比例 节点池内存使用率 百分比 节点池里的所有节点内存使用量占总量的比例 节点数量趋势 个 节点池里的节点数量
  • 指标清单 节点池视图使用的指标清单如下: 表2 指标说明 指标名称 单位 说明 kube_node_labels Gauge 节点标签,其中label_cce_cloud_com_cce_nodepool为CCE节点池名称,若无该标签值则为Default Pool。 node_cpu_seconds_total Counter 节点不同模式下花费的CPU秒 node_memory_MemAvailable_bytes Gauge 节点的可用内存量 node_memory_MemTotal_bytes Gauge 节点的内存总量 kube_pod_container_resource_requests Gauge Pod 容器的资源申请量
  • 指标说明 集群视图暴露的指标包括基础资源指标、网络指标和磁盘指标,具体说明如下: 图1 基础资源图表 表1 基础资源图表说明 指标名称 单位 说明 Pod数 个 集群中处在不同运行状态下的Pod个数(状态包含:Failed、Pending、Running、Succeeded、Unknown等) 容器数 个 集群中处在不同运行状态下的容器个数(状态包含:Containers Running、Containers Waiting、Containers Terminated等) CPU使用量 Cores 以命名空间为粒度统计各个命名空间内的所有容器的CPU使用量之和。 内存使用量 字节 以命名空间为粒度统计各个命名空间内的所有容器的内存使用量之和。 图2 网络图表 表2 网络图表说明 指标名称 单位 说明 网络接收速率 字节/秒 以命名空间为粒度统计各个命名空间内的所有容器每秒接收的字节数之和。 网络发送速率 字节/秒 以命名空间为粒度统计各个命名空间内的所有容器每秒传输的字节数之和。 网络平均接收速率 字节/秒 以命名空间为粒度统计各个命名空间内的容器每秒平均接收的字节数。 网络平均发送速率 字节/秒 以命名空间为粒度统计各个命名空间内的容器每秒平均传输的字节数。 接收数据包速率 个/秒 以命名空间为粒度统计各个命名空间内的所有容器每秒接收的数据包数之和。 集群发送数据包速率 个/秒 以命名空间为粒度统计各个命名空间内所有容器每秒发送的数据包数之和。 丢包速率(接收) 个/秒 以命名空间为粒度统计各个命名空间内所有容器每秒接收的数据丢包数之和。 丢包速率(发送) 个/秒 以命名空间为粒度统计各个命名空间内所有容器每秒发送的数据丢包数之和。 图3 磁盘图表 表3 磁盘图表说明 指标说明 单位 说明 磁盘读写IO速率(读+写) 次数/秒 以命名空间为粒度统计各个命名空间内所有容器每秒的磁盘读写IO的次数之和。 磁盘读写吞吐量(读+写) 字节/秒 以命名空间为粒度统计各个命名空间内所有容器每秒的磁盘读写字节量之和。
  • 指标清单 集群视图使用的指标清单如下: 表4 集群视图指标清单 指标 指标类型 说明 kube_pod_container_resource_requests gauge 容器请求的请求资源数 kube_pod_container_resource_limits gauge 容器请求的限制资源数 kube_pod_status_phase gauge Pod当前阶段 kube_pod_container_status_waiting gauge 容器是否处在waiting状态 kube_pod_container_status_terminated gauge 容器是否处在终止状态 container_cpu_usage_seconds_total counter 容器CPU累计使用时间 container_memory_rss gauge RSS内存,即常驻内存集。是分配给进程使用的实际物理内存字节数,不是磁盘上缓存的虚机内存。 container_network_receive_bytes_total counter 容器网络累积接收字节数 container_network_transmit_bytes_total counter 容器网络累积传输字节数 container_network_receive_packets_total counter 容器网络收到的累计数据包数 container_network_transmit_packets_total counter 容器网络传输的累计数据包数 container_network_receive_packets_dropped_total counter 容器网络接收时丢失的数据包数 container_network_transmit_packets_dropped_total counter 容器网络传输时丢失的数据包数 container_fs_reads_total counter 容器磁盘读取次数 container_fs_reads_bytes_total counter 容器磁盘读取的总字节数
  • 公共参数说明 表1 公共参数说明 参数 参数说明 检测周期(periodSeconds) 探针检测周期,单位为秒。 例如,设置为30,表示每30秒检测一次。 延迟时间(initialDelaySeconds) 延迟检查时间,单位为秒,此设置与业务程序正常启动时间相关。 例如,设置为30,表明容器启动后30秒才开始健康检查,该时间是预留给业务程序启动的时间。 超时时间(timeoutSeconds) 超时时间,单位为秒。 例如,设置为10,表明执行健康检查的超时等待时间为10秒,如果超过这个时间,本次健康检查就被视为失败。若设置为0或不设置,默认超时等待时间为1秒。 成功阈值(successThreshold) 探测失败后,将状态转变为成功所需要的最小连续成功次数。例如,设置为1时,表明健康检查失败后,健康检查需要连续成功1次,才认为工作负载状态正常。 默认值是 1,最小值是 1。 存活和启动探测的这个值必须是 1。 最大失败次数(failureThreshold) 当探测失败时重试的次数。 存活探测情况下的放弃就意味着重新启动容器。就绪探测情况下的放弃 Pod 会被打上未就绪的标签。 默认值是 3。最小值是 1。
  • 检查方式 HTTP 请求检查 HTTP 请求方式针对的是提供HTTP/HTTPS服务的容器,集群周期性地对该容器发起HTTP/HTTPS GET请求,如果HTTP/HTTPS response返回码属于200~399范围,则证明探测成功,否则探测失败。使用HTTP请求探测必须指定容器监听的端口和HTTP/HTTPS的请求路径。 例如:提供HTTP服务的容器,HTTP检查路径为:/health-check;端口为:80;主机地址可不填,默认为容器实例IP,此处以172.16.0.186为例。那么集群会周期性地对容器发起如下请求:GET http://172.16.0.186:80/health-check。您也可以为HTTP请求添加一个或多个请求头部,例如设置请求头名称为Custom-Header,对应的值为example。 图1 HTTP请求检查 TCP 端口检查 对于提供TCP通信服务的容器,集群周期性地对该容器建立TCP连接,如果连接成功,则证明探测成功,否则探测失败。选择TCP端口探测方式,必须指定容器监听的端口。 例如:有一个nginx容器,它的服务端口是80,对该容器配置了TCP端口探测,指定探测端口为80,那么集群会周期性地对该容器的80端口发起TCP连接,如果连接成功则证明检查成功,否则检查失败。 图2 TCP 端口检查 执行命令检查 命令检查是一种强大的检查方式,该方式要求用户指定一个容器内的可执行命令,集群会周期性地在容器内执行该命令,如果命令的返回结果是0则检查成功,否则检查失败。 对于上面提到的TCP端口检查和HTTP请求检查,都可以通过执行命令检查的方式来替代: 对于TCP端口探测,可以使用程序对容器的端口尝试connect,如果connect成功,脚本返回0,否则返回-1。 对于HTTP请求探测,可以使用脚本命令来对容器尝试使用wget命令进行探测。 wget http://127.0.0.1:80/health-check 并检查response 的返回码,如果返回码在200~399 的范围,脚本返回0,否则返回-1。如下图: 图3 执行命令检查 必须把要执行的程序放在容器的镜像里面,否则会因找不到程序而执行失败。 如果执行的命令是一个shell脚本,由于集群在执行容器里的程序时,不在终端环境下,因此不能直接指定脚本为执行命令,需要加上脚本解析器。比如脚本是/data/scripts/health_check.sh,那么使用执行命令检查时,指定的程序应该是sh /data/scripts/health_check.sh。究其原因是集群在执行容器里的程序时,不在终端环境下。 GRPC检查 GRPC检查可以为GRPC应用程序配置启动、活动和就绪探针,而无需暴露任何HTTP端点,也不需要可执行文件。Kubernetes可以通过GRPC 连接到工作负载并查询其状态。 使用GRPC检查时,您的应用需支持GRPC健康检查协议。 与HTTP和TCP探针类似,如果配置错误,都会被认作是探测失败,例如错误的端口、应用未实现健康检查协议等。 图4 GRPC检查
  • 操作场景 健康检查是指容器运行过程中,根据用户需要,定时检查容器健康状况。若不配置健康检查,如果容器内应用程序异常,Pod将无法感知,也不会自动重启去恢复。最终导致虽然Pod状态显示正常,但Pod中的应用程序异常的情况。 Kubernetes提供了三种健康检查的探针: 存活探针:livenessProbe,用于检测容器是否正常,类似于执行ps命令检查进程是否存在。如果容器的存活检查失败,集群会对该容器执行重启操作;若容器的存活检查成功则不执行任何操作。 就绪探针:readinessProbe,用于检查用户业务是否就绪,如果未就绪,则不转发流量到当前实例。一些程序的启动时间可能很长,比如要加载磁盘数据或者要依赖外部的某个模块启动完成才能提供服务。这时候程序进程在,但是并不能对外提供服务。这种场景下该检查方式就非常有用。如果容器的就绪检查失败,集群会屏蔽请求访问该容器;若检查成功,则会开放对该容器的访问。 启动探针:startupProbe,用于探测应用程序容器什么时候启动了。 如果配置了这类探测器,就可以控制容器在启动成功后再进行存活性和就绪检查, 确保这些存活、就绪探针不会影响应用程序的启动。 这可以用于对启动慢的容器进行存活性检测,避免它们在启动运行之前就被终止。
  • YAML示例 apiVersion: v1 kind: Pod metadata: labels: test: liveness name: liveness-http spec: containers: - name: liveness image: nginx:alpine args: - /server livenessProbe: httpGet: path: /healthz port: 80 httpHeaders: - name: Custom-Header value: Awesome initialDelaySeconds: 3 periodSeconds: 3 readinessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 5 startupProbe: httpGet: path: /healthz port: 80 failureThreshold: 30 periodSeconds: 10
  • 容器引擎和Kubelet共享磁盘空间说明 容器引擎和Kubelet共享磁盘空间即在节点上不再划分容器引擎 (Docker/Containerd) 和Kubelet组件的空间,二者共用磁盘空间。 容器引擎和Kubelet共享磁盘空间仅v1.21.10-r0、v1.23.8-r0、v1.25.3-r0及以上的集群支持。 容器存储Rootfs为OverlayFS类型时支持共享磁盘空间,Device Mapper类型不支持。 若您在集群中安装了npd插件,请将插件升级至1.18.10版本及以上,否则会产生误报警。 若您在集群中安装了log-agent插件,请将插件升级至1.3.0版本及以上,否则会影响日志采集。 若您在集群中安装了ICAgent,请将ICAgent升级至5.12.140版本及以上,否则会影响日志采集。查看或升级ICAgent版本请参见CCE接入。 图5 共享磁盘空间配置 对于共享磁盘空间的节点,容器存储Rootfs为OverlayFS类型。节点创建完成后,数据盘空间(以100G大小为例)不再划分容器引擎和容器镜像空间和Kubelet组件空间,均在/mnt/paas目录下,并通过两个文件系统区分: dockersys:/mnt/paas/runtime kubernetes:/mnt/paas/kubernetes/kubelet 图6 共享数据盘空间分配
  • 镜像回收策略说明 当容器引擎空间不足时,会触发镜像垃圾回收。 镜像垃圾回收策略只考虑两个因素:HighThresholdPercent 和 LowThresholdPercent。 磁盘使用率超过上限阈值(HighThresholdPercent,默认值为80%)将触发垃圾回收。 垃圾回收将删除最近最少使用的镜像,直到磁盘使用率满足下限阈值(LowThresholdPercent,默认值为70%)。
  • 操作系统与容器存储Rootfs对应关系 表1 CCE集群节点操作系统与容器引擎对应关系 操作系统 容器存储Rootfs 自定义Pod容器空间(basesize) CentOS 7.x v1.19.16以下版本集群使用Device Mapper v1.19.16及以上版本集群使用OverlayFS Rootfs为Device Mapper且容器引擎为Docker时支持,默认值为10G。 Rootfs为OverlayFS时不支持。 EulerOS 2.3 Device Mapper 仅容器引擎为Docker时支持,默认值为10G。 EulerOS 2.5 Device Mapper 仅容器引擎为Docker时支持,默认值为10G。 EulerOS 2.8 v1.19.16-r2以下版本集群使用Device Mapper v1.19.16-r2及以上版本集群使用OverlayFS Rootfs为Device Mapper且容器引擎为Docker时支持,默认值为10G。 Rootfs为OverlayFS且容器引擎为Docker时支持,默认值为不限制。 EulerOS 2.9 OverlayFS 仅v1.19.16、v1.21.3、v1.23.3及以上的集群版本支持,默认值为不限制。 v1.19.16、v1.21.3、v1.23.3以前的集群版本不支持。 EulerOS 2.10 OverlayFS 集群版本为v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0以下时,仅容器引擎为Docker时支持,默认值为不限制。 集群版本为v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上时,Docker和containerd均支持,默认值为不限制。 Ubuntu 18.04 OverlayFS 不支持。 Huawei Cloud EulerOS 1.1 OverlayFS 不支持。 Huawei Cloud EulerOS 2.0 OverlayFS 集群版本为v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0以下时,仅容器引擎为Docker时支持,默认值为不限制。 集群版本为v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上时,Docker和containerd均支持,默认值为不限制。 表2 CCE Turbo集群节点操作系统与容器引擎对应关系 操作系统 容器存储Rootfs 自定义Pod容器空间(basesize) CentOS 7.x OverlayFS 不支持。 Ubuntu 18.04 OverlayFS 不支持。 EulerOS 2.9 弹性云服务器-虚拟机使用OverlayFS 弹性云服务器-物理机使用Device Mapper Rootfs为OverlayFS且仅容器引擎为Docker时支持,默认值为不限制。集群版本为v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上时,Docker和containerd均支持。 Rootfs为Device Mapper且容器引擎为Docker时支持,默认值为10G。 Huawei Cloud EulerOS 1.1 OverlayFS 不支持。 Huawei Cloud EulerOS 2.0 OverlayFS 集群版本为v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0以下时,仅容器引擎为Docker时支持,默认值为不限制。 集群版本为v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上时,Docker和containerd均支持,默认值为不限制。
  • 容器引擎空间分配 对于容器引擎和Kubelet共享磁盘空间的节点,容器存储Rootfs为OverlayFS类型,数据盘空间分配详情请参见容器引擎和Kubelet共享磁盘空间说明。 对于容器引擎和Kubelet不共享磁盘空间的节点,数据盘根据容器存储Rootfs不同具有两种划分方式(以100G大小为例):Device Mapper类型和OverlayFS类型。不同操作系统对应的容器存储Rootfs请参见操作系统与容器存储Rootfs对应关系。 Device Mapper类型存储Rootfs 其中默认占90%的容器引擎和容器镜像空间又可分为以下两个部分: 其中/var/lib/docker用于Docker工作目录,默认占比20%,其空间大小 = 数据盘空间 * 90% * 20% thinpool用于存储容器镜像数据、镜像元数据以及容器使用的磁盘空间,默认占比为80%,其空间大小 = 数据盘空间 * 90% * 80% thinpool是动态挂载,在节点上使用df -h命令无法查看到,使用lsblk命令可以查看到。 图2 Device Mapper类型容器引擎空间分配 OverlayFS类型存储Rootfs 相比Device Mapper存储引擎,没有单独划分thinpool,容器引擎和容器镜像空间(默认占90%)都在/var/lib/docker目录下。 图3 OverlayFS类型容器引擎空间分配
  • 设置数据盘空间分配 在创建节点时,您需要配置节点数据盘,您可单击“展开高级配置”,自定义节点数据盘的空间分配。 图1 设置数据盘空间分配 容器引擎空间分配: 指定磁盘空间:CCE将数据盘空间默认划分为两块,一块用于存放容器引擎 (Docker/Containerd) 工作目录、容器镜像的数据和镜像元数据;另一块用于Kubelet组件和EmptyDir临时存储等。容器引擎空间的剩余容量将会影响镜像下载和容器的启动及运行。 容器引擎和容器镜像空间(默认占90%):用于容器运行时工作目录、存储容器镜像数据以及镜像元数据。 Kubelet组件和EmptyDir临时存储(默认占10%):用于存储Pod配置文件、密钥以及临时存储EmptyDir等挂载数据。 共享磁盘空间:v1.21.10-r0、v1.23.8-r0、v1.25.3-r0及之后版本的集群中,CCE使用的数据盘支持采用容器引擎和Kubelet共享磁盘空间的方式,即不再划分容器引擎 (Docker/Containerd) 和Kubelet组件的空间。 Pod容器空间分配:即容器的basesize设置,每个工作负载下的容器组 Pod 占用的磁盘空间设置上限(包含容器镜像占用的空间)。合理的配置可避免容器组无节制使用磁盘空间导致业务异常。建议此值不超过容器引擎空间的 80%。该参数与节点操作系统和容器存储Rootfs相关,部分场景下不支持设置。详情请参见操作系统与容器存储Rootfs对应关系。 写入模式: 线性:线性逻辑卷是将一个或多个物理卷整合为一个逻辑卷,实际写入数据时会先往一个基本物理卷上写入,当存储空间占满时再往另一个基本物理卷写入。 条带化:有两块以上数据盘时才可支持选择条带化模式。创建逻辑卷时指定条带化,当实际写入数据时会将连续数据分成大小相同的块,然后依次存储在多个物理卷上,实现数据的并发读写从而提高读写性能。条带化模式的存储池不支持扩容。
  • 管理内核参数配置 CCE Autopilot是云容器引擎服务推出的Serverless版集群,同物理机系统内核隔离且互不影响。对于资深业务部署场景,内核参数调优是比较通用的方式。在安全范围内,CCE Autopilot服务允许客户根据Kubernetes社区推荐的方案,通过Pod的安全上下文(Security Context)对内核参数进行配置,极大提升用户业务部署的灵活性。如果你对securityContext概念不够熟悉,更多信息可阅读Security Context。 在 Linux 中,最通用的内核参数修改方式是通过sysctl接口进行配置。在Kubernetes中,也是通过Pod的sysctl安全上下文(Security Context)对内核参数进行配置,如果你对sysctl概念不够熟悉,可阅读在 Kubernetes 集群中使用 sysctl。安全上下文(Security Context)作用于同一个Pod内的所有容器。 CCE Autopilot服务支持修改的非安全的sysctl参数范围如下: kernel.shm*, kernel.msg*, kernel.sem, fs.mqueue.*, net.* 为了避免破坏操作系统的稳定性,请你在了解变更后果之后再修改sysctl参数。 有命名空间的sysctl参数,在未来的Linux内核版本中,可能会发生变化。 由于非安全的sysctl参数其本身具有不稳定性,在使用非安全的 sysctl 参数时可能会导致一些严重问题, 如容器的错误行为,用户需自行承担风险。 以下示例中,使用Pod SecurityContext来对两个sysctl参数kernel.msgmax和net.core.somaxconn进行设置。 apiVersion: v1 kind: Pod metadata: name: sysctls-context-example spec: securityContext: sysctls: - name: kernel.msgmax value: "65536" - name: net.core.somaxconn value: "1024" ... 进入容器确认配置生效: kubectl exec -it podname -c container-1 -- /bin/sh 父主题: 工作负载
  • 指标清单 Pod视图使用的指标清单如下: 表4 Pod视图指标清单 指标 指标类型 说明 kube_pod_container_status_running gauge 容器当前是否在运行中的状态 kube_pod_container_info gauge Pod中的容器信息 kube_pod_status_phase gauge Pod当前的阶段 kube_pod_container_status_restarts_total counter 容器重启次数 container_cpu_usage_seconds_total counter 容器CPU累计使用时间 kube_pod_container_resource_requests gauge 容器请求的请求资源数 container_spec_cpu_quota gauge 容器的CPU配额 container_memory_working_set_bytes gauge 容器内存使用量 container_spec_memory_limit_bytes gauge 容器内存限制量 container_cpu_cfs_throttled_periods_total counter 容器限制周期间隔数 container_cpu_cfs_periods_total counter 容器经过强制限制的周期间隔数 container_network_receive_bytes_total counter 容器接收字节的累计计数 container_network_transmit_bytes_total counter 容器传输字节的累计计数 container_network_receive_packets_total counter 容器接收数据包的累计计数 container_network_transmit_packets_total counter 容器传输数据包的累计计数 container_network_receive_packets_dropped_total counter 容器接收丢失的数据包的累计计数 container_network_transmit_packets_dropped_total counter 容器传输丢失的数据包的累计计数 container_fs_reads_total counter 容器已完成磁盘读取的累计计数 container_fs_writes_total counter 容器已完成磁盘写入的累计计数 container_fs_reads_bytes_total counter 容器读取的累计字节数 container_fs_writes_bytes_total counter 容器写入的累计在节数 container_fs_usage_bytes gauge 文件系统上容器已经使用的字节数 container_fs_limit_bytes gauge 文件系统上容器限制的字节数
  • 指标说明 Pod视图暴露的指标包括Pod资源指标、Pod网络指标和Pod磁盘指标,具体说明如下: 图1 Pod资源指标 表1 Pod资源指标说明 指标名称 单位 说明 容器数 个 Pod中的容器总数 运行中容器数 个 Pod中正在运行的容器个数 Pod状态 个 处在不同状态下的Pod个数 容器重启次数 次 容器被重启的次数 CPU使用量 Cores Pod CPU使用量 CPU 有效率&使用率 百分比 有效率:使用量/请求量;使用率:使用量/总量 内存使用量 字节 内存使用量 内存 有效率&使用率 百分比 有效率:使用量/请求量;使用率:使用量/总量 CPU Throttling 百分比 CPU节流周期限制率 图2 Pod网络指标 表2 Pod网络指标说明 指标名称 单位 说明 网络接收速 字节/秒 容器每秒接收的字节数 网络发送速率 字节/秒 容器每秒发送的字节数 接收数据包速率 个/秒 容器每秒接收数据包数 发送数据包速 个/秒 容器每秒发送数据包数 丢包速率(接收) 字节/秒 容器每秒接收的数据丢包数 丢包速率(发送) 字节/秒 容器每秒发送的数据丢包数 图3 Pod磁盘指标 表3 Pod磁盘指标说明 指标名称 单位 说明 Pod容器磁盘读写IO速率(读+写) 次数/秒 Pod磁盘每秒读写IO次数 Pod磁盘读写吞吐量(读+写) 字节/秒 Pod磁盘每秒读写字节数 容器磁盘读写IO速率(读+写) 次数/秒 容器磁盘每秒读写IO次数 容器磁盘读写吞吐量(读+写) 字节/秒 容器磁盘每秒读写字节数 文件系统使用率 百分比 文件系统的使用率 文件系统使用量 字节 文件系统已经使用的字节数
  • Nginx Ingress Controller优化设置 使用合适的副本数和资源限制 默认情况下,通过插件中心安装的Nginx Ingress Controller的实例数为2,您可以根据业务的实际需要进行调整。 在部署Nginx Ingress Controller时,多实例会默认分配到不同可用区或者是同一可用区的不同节点。 同时建议您不要将Nginx Ingress Controller的资源限制设置太小,避免OOM所带来的流量中断。建议CPU限制值不低于1000m、内存限制值不低于2 GiB。 使用独占节点来提升Nginx Ingress性能与稳定性 提前在创建节点时,设置节点的污点。在安装Nginx Ingress Controller插件时,在容忍策略中添加该节点的污点。详情请参见独占节点部署。 优化Nginx Ingress性能 Nginx Ingress Controller性能调优主要分为系统参数调优和Nginx参数调优: 系统参数调优:华为云上的操作系统已经默认优化了一些常见参数,其他还需要调优的系统参数主要包括连接队列的大小、源端口的范围。系统参数调优后可以保证Nginx处理高并发请求的能力,以及在连接后端时不会因为端口耗尽而失败。 Nginx参数调优: 调高 keepalive 连接最大请求数:高并发环境中,增大 Nginx 与 client 的 keepalive 连接的最大请求数量,避免产生大量的TIME_WAIT 连接。 调高单个 Worker 最大连接数:Nginx参数主要可以调整单个Worker的最大连接数来保证Nginx Ingress Controller处理高并发请求的能力。 调高 keepalive 最大空闲连接数:高并发环境下,建议将 keepalive 值配置为1000。 设置网关超时:请您确保后端的业务长连接的超时时间不低于Nginx Ingress Controller的连接超时时间。 对Nginx Ingress Controller配置HPA进行自动扩容 一般情况下,Nginx Ingress Controller已经有足够的能力应对业务的突发流量。如果在高负载情况下仍不满足您的要求,也可以配置HPA对Nginx Ingress Controller进行扩容。具体操作,请参见HPA策略。 为后端服务配置合理的preStop Hook 后端服务滚动更新时,Nginx Ingress Controller会将正在终止的Pod从后端服务器中移除,但会保持还在处理的请求的连接。如果后端服务Pod在收到结束信号后立即退出,可能会导致正在处理的请求失败或部分流量仍被转发到已经退出的Pod中,导致部分流量损失。为了避免这种情况,建议在后端服务的Pod中配置preStop Hook,在Pod被移除后继续工作一段时间,以解决流量中断的问题。 工作负载配置示例如下: ... spec: template: spec: containers: - name: app lifecycle: # 配置preStop Hook,等待30秒后退出。 # 需要容器中存在sleep命令。 preStop: exec: command: - sleep - 30
  • Nginx Ingress Controller进阶功能 使用多套Nginx Ingress Controller 在应用中,您可能会因为内外网隔离等需要,在集群中部署多套Nginx Ingress Controller。操作详情请参见安装多个NGINX Ingress控制器。 通过Nginx Ingress Controller进行应用的蓝绿或灰度发布 支持通过Nginx Ingress实现对服务的灰度发布,操作详情请参见使用Nginx Ingress实现灰度发布和蓝绿发布。 通过Nginx Ingress Controller配置重定向规则 支持通过Nginx Ingress设置重定向规则,操作详情请参见Nginx Ingress配置重定向规则。 Nginx Ingress对接不同协议的后端服务 Ingress默认使用HTTP协议连接到后端服务,但也可以代理不同协议的后端服务: HTTPS:请参见Nginx Ingress对接HTTPS协议的后端服务。 gRPC:请参见Nginx Ingress对接gRPC协议的后端服务。
  • 安装插件 登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“插件中心”,在右侧找到swr-cosign,单击“安装”。 在安装插件页面,设置“规格配置”。 表1 swr-cosign插件规格配置 参数 参数说明 插件规格 该插件可配置“单实例”、“高可用”或“自定义”规格。 实例数 选择上方插件规格后,显示插件中的实例数。 选择“自定义”规格时,您可根据需求调整插件实例数。 容器 选择“自定义”规格时,您可根据需求调整插件实例的容器规格。 设置插件支持的“参数配置”。 表2 swr-cosign插件参数配置 参数 参数说明 KMS密钥 选择一个密钥,仅支持 EC_P256、EC_P384、SM2 类型的密钥。 您可以前往密钥管理服务新增密钥。 验签镜像 验签镜像地址通过正则表达式进行匹配,例如填写docker.io/**表示对docker.io镜像仓库的镜像进行验签。如需对所有镜像验签,请填写**。 单击“安装”。 待插件安装完成后,选择对应的集群,然后单击左侧导航栏的“插件中心”,可筛选“已安装插件”查看相应的插件。
共100000条