华为云用户手册

  • 约束限制 仅以下指定版本的CCE Turbo集群支持用户配置Pod固定IP: v1.19集群:v1.19.16-r6及以上版本 v1.21集群:v1.21.9-r0及以上版本 v1.23集群:v1.23.7-r0及以上版本 v1.25集群:v1.25.3-r0及以上版本 v1.25以上版本集群 目前只支持StatefulSet类型的Pod或无ownerReferences的Pod固定IP,暂不支持Deployment、DaemonSet等其他类型的工作负载配置Pod固定IP,且不支持已设置HostNetwork的Pod配置固定IP。 对Pod的IP地址无明确要求的业务不建议配置固定IP,因为配置了固定IP的Pod,Pod重建的耗时会略微变长同时IP地址的利用率会下降。 暂不支持CCE Turbo集群中BMS节点上的Pod配置固定IP。在BMS节点(使用弹性网卡)跟ECS节点(使用辅助弹性网卡)混合使用的CCE Turbo集群中,需要为Pod设置节点亲和性调度,以保证Pod不会调度到BMS节点,否则将导致固定IP无法保留。 暂不支持CCE Turbo集群的边缘节点上的Pod配置固定IP。在边缘节点跟中心侧节点混合使用的CCE Turbo集群中,需要为Pod设置节点亲和性调度,以保证Pod不会调度到边缘节点,否则将导致固定IP无法保留。 不支持直接修改Pod对象的固定IP的annotations的值,如果直接修改的话,后台不会生效;如有修改诉求,请直接修改对应的StatefulSet工作负载spec.template字段下的annotations配置。 当固定IP的Pod重建调度时,如果待调度的节点上没有剩余的网卡配额(预绑定的网卡会占用节点的网卡配额),固定IP的网卡会尝试抢占预绑定的网卡,此时固定IP的Pod启动会略微变慢。使用固定IP的节点,请合理配置节点网卡动态预热以确保不会全预热网卡。
  • 通过kubectl命令行设置 您可以通过对StatefulSet添加annotations来设置是否开启Pod固定IP功能,如下所示。 apiVersion: apps/v1 kind: StatefulSet metadata: name: nginx spec: serviceName: nginx replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx annotations: pod.alpha.kubernetes.io/initialized: 'true' yangtse.io/static-ip: 'true' yangtse.io/static-ip-expire-no-cascading: 'false' yangtse.io/static-ip-expire-duration: 5m spec: containers: - name: container-0 image: nginx:alpine resources: limits: cpu: 100m memory: 200Mi requests: cpu: 100m memory: 200Mi imagePullSecrets: - name: default-secret 表1 Pod固定IP的annotation配置 annotation 默认值 参数说明 取值范围 yangtse.io/static-ip false 是否开启Pod固定IP,只有StatefulSet类型的Pod或无ownerReferences的Pod支持,默认不开启。 "false"或"true" yangtse.io/static-ip-expire-duration 5m 删除固定IP的Pod后,对应的固定IP网卡过期回收的时间间隔。 支持时间格式为Go time type,例如1h30m、5m。关于Go time type,请参见Go time type。 yangtse.io/static-ip-expire-no-cascading false 是否关闭StatefulSet工作负载的级联回收。 默认为false,表示StatefulSet删除后,会级联删除对应的固定IP网卡。如果您需要在删除StatefulSet对象后,在网卡过期回收时间内保留对应的固定IP,用于下一次重建同名的StatefulSet再次使用对应的固定IP,请将该参数设为true。 "false"或"true"
  • 指标清单 Prometheus Server视图使用的指标清单如下: 表2 Prometheus Server指标说明 指标 类型 描述 prometheus_target_sync_length_seconds_sum Summary 不同的target的采集时延 prometheus_sd_discovered_targets Gauge 不同的target采集的指标数 prometheus_target_interval_length_seconds_sum Summary 指标采集间隔 prometheus_target_scrapes_exceeded_body_size_limit_total Counter 采集失败的次数 prometheus_tsdb_head_samples_appended_total Counter head中添加的samples的总数 prometheus_tsdb_head_series Gauge head中保存的series数量 prometheus_tsdb_head_chunks Gauge head中存放的chunk数量 prometheus_engine_query_duration_seconds_count Counter 查询普罗query的次数 prometheus_engine_query_duration_seconds Counter 不同分片的响应时间耗时 prometheus_remote_storage_highest_timestamp_in_seconds Gauge 远程存储里最新的时间戳 prometheus_remote_storage_queue_highest_sent_timestamp_seconds Gauge 普罗分片里最新的时间戳 prometheus_remote_storage_bytes_total Counter 压缩后队列发送的数据(非元数据)的总字节数 prometheus_remote_storage_shards Gauge 当前用于并行发送到远程存储的分片数 prometheus_remote_storage_shards_max Gauge 可用于并行发送到远程存储的分片数的最大值 prometheus_remote_storage_shards_min Gauge 可用于并行发送到远程存储的分片数的最小值 prometheus_remote_storage_shards_desired Gauge 分片队列期望基于输入样本和输出样本的比率运行的分片数 prometheus_remote_storage_shard_capacity Gauge 用于并行发送到远程存储的队列中每个分片的容量 prometheus_remote_storage_pending_samples Gauge 要发送到远程存储的队列分片中挂起的样本数 prometheus_tsdb_wal_segment_current Gauge TSDB当前正在写入的WAL段索引 prometheus_wal_watcher_current_segment Gauge WAL正在从中读取记录的当前段 prometheus_remote_storage_dropped_samples_total Gauge 在通过远程写入发送之前,从WAL读取后丢弃的样本速率。 prometheus_remote_storage_failed_samples_total Gauge 发送到远程存储时失败的样本失败速率,不可恢复的错误的次数。 prometheus_remote_storage_retried_samples_total Gauge 在发送到远程存储时失败但由于发送错误可恢复而重试的次数 prometheus_remote_storage_enqueue_retries_total Gauge 由于分片队列已满而入队失败重试的次数
  • 插件卸载 登录CCE控制台。 选择CCE集群,单击进入CCE集群总览页面。 在导航栏左侧单击“插件中心”,进入插件中心首页。 选择“CCE 突发弹性引擎 (对接 CCI)”插件,单击“卸载”。 表2 特殊场景说明 特殊场景描述 场景现象 场景说明 CCE集群无节点,卸载插件。 插件卸载失败。 bursting插件卸载时会在集群中启动Job用于清理资源,卸载插件时请保证集群中至少有一个可以调度的节点。 用户直接删除集群,未卸载插件。 用户在CCI侧的命名空间中有资源残留,如果命名空间有计费资源,会造成额外计费。 由于直接删除集群,没有执行插件的资源清理Job,造成资源残留。用户可以手动清除残留命名空间及其下的计费资源来避免额外计费。 关于CCE突发弹性引擎(对接CCI)更多内容详情请参见:CCE突发弹性引擎(对接CCI)。
  • 工作负载下发 登录CCE控制台。 选择CCE集群,单击进入CCE集群总览页面。 在导航栏左侧单击“工作负载”,进入工作负载首页。 单击“创建工作负载”,具体操作步骤详情请参见创建工作负载。 填写基本信息。“CCI弹性承载”选择“强制调度策略”。关于调度策略更多信息,请参考调度负载到CCI。 进行容器配置。 配置完成后,单击“创建工作负载”。 在工作负载页面,选择工作负载名称,单击进入工作负载管理界面。 工作负载所在节点为CCI集群,说明负载成功已调度到CCI。
  • 版本记录 表3 CCE突发弹性引擎(对接CCI)插件版本记录 插件版本 支持的集群版本 更新特性 1.5.2 v1.21 v1.23 v1.25 v1.27 v1.28 支持弹性至CCI 2.0。 1.3.57 v1.21 v1.23 v1.25 v1.27 v1.28 适配CCE v1.28集群。 1.3.54 v1.21 v1.23 v1.25 v1.27 修复部分问题。 1.3.48 v1.21 v1.23 v1.25 v1.27 支持v1.25、v1.27版本集群 支持JuiceFS类型的存储 1.3.44 v1.17 v1.19 v1.21 v1.23 支持Pod配置全域弹性公网IP 1.3.35 v1.17 v1.19 v1.21 v1.23 支持原地升级镜像 支持ReadinessGates 1.3.25 v1.17 v1.19 v1.21 v1.23 支持DownwardAPI Volume 支持Projected Volume 支持自定义StorageClass 1.3.19 v1.17 v1.19 v1.21 v1.23 支持schedule profile 1.3.7 v1.17 v1.19 v1.21 v1.23 支持v1.21、v1.23版本集群 1.2.12 v1.13 v1.15 v1.17 v1.19 新增了部分metrics指标 支持HPA与CustomedHPA 支持将弹性到CCI的Pod中的hostPath转换为其它类型存储 修复Kubernetes Dashboard无法使用终端问题 1.2.5 v1.13 v1.15 v1.17 v1.19 支持CCE Turbo集群 自动清理CCI中不再被Pod依赖的资源 支持配置Requests与Limits不相等,弹性到CCI时的资源申请量以Limits为准 修复CCI命名空间不存在时插件卸载失败问题 增加对Pod规格超过CCI限制的创建请求的拦截 1.2.0 v1.13 v1.15 v1.17 v1.19 支持v1.19版本集群 支持SFS、SFS Turbo类型存储 支持CronJob 支持配置envFrom 日志文件自动转储 屏蔽TCPSocket类型健康检查 支持配置资源标签(pod-tag) 提升了性能和可靠性 修复了一些已知问题 1.0.5 v1.13 v1.15 v1.17 支持v1.17版本集群
  • 安装插件 登录CCE控制台。 选择CCE集群,单击进入CCE集群总览页面。 在导航栏左侧单击“插件中心”,进入插件中心首页。 选择“CCE 突发弹性引擎 (对接 CCI)”插件,单击“安装”。 配置插件参数。 表1 插件参数说明 插件参数 说明 选择版本 插件的版本。插件版本和CCE集群存在配套关系,更条信息可以参考CCE突发弹性引擎(对接CCI)插件版本记录。 规格配置 用于配置插件负载的实例数。 网络互通 勾选后将开启CCE集群和CCI两侧pod互访的功能,用户可以根据自身业务选择是否打开。详细功能介绍请参考网络。
  • 容器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 网络模型选择(创建集群时配置)
  • 容器隧道网络模型 容器隧道网络在节点网络基础上通过隧道封装构建的独立于节点网络平面的容器网络平面,CCE集群容器隧道网络使用的封装协议为VXLAN,后端虚拟交换机采用的是Open vSwitch,VXLAN是将以太网报文封装成UDP报文进行隧道传输。容器隧道网络具有付出少量隧道封装性能损耗,即可获得通用性强、互通性强、高级特性支持全面(例如NetworkPolicy网络隔离)的优势,可以满足大多数性能要求不高的场景。 图1 容器隧道网络 说明如下: 节点内Pod间通信:同节点的Pod间通信直接通过本节点的OVS网桥直接转发。 跨节点Pod间通信:所有跨节点Pod间的通信通过OVS隧道网桥进行封装后,转发到对端节点上。
  • 应用场景 对性能要求不高:由于需要额外的VXLAN隧道封装,相对于另外两种容器网络模式,性能存在一定的损耗。大概有5%-15%的性能损失。所以容器隧道网络适用于对性能要求不是特别高的业务场景,比如:Web应用、访问量不大的数据中台、后台服务等。 大规模组网:相比VPC路由网络受限于VPC路由条目配额的限制,容器隧道网络没有网络基础设施的任何限制;同时容器隧道网络把广播域控制到了节点级别,容器隧道网络最大可支持2000节点规模。
  • 网段规划建议 在集群网络构成中介绍集群中网络地址可分为节点网络、容器网络、服务网络三块,在规划网络地址时需要从如下方面考虑: 三个网段不能重叠,否则会导致冲突。且集群所在VPC下所有子网(包括扩展网段子网)不能和容器网段、服务网段冲突。 保证每个网段有足够的IP地址可用。 节点网段的IP地址要与集群规模相匹配,否则会因为IP地址不足导致无法创建节点。 容器网段的IP地址要与业务规模相匹配,否则会因为IP地址不足导致无法创建Pod。每个节点上可以创建多少Pod还与其他参数设置相关,具体请参见节点可创建的最大Pod数量说明。
  • 组件介绍 工作负载弹性组件介绍 表1 工作负载弹性组件 类型 组件名称 组件介绍 参考文档 HPA Kubernetes Metrics Server Kubernetes内置组件,实现Pod水平自动伸缩的功能,即Horizontal Pod Autoscaling。在kubernetes社区HPA功能的基础上,增加了应用级别的冷却时间窗和扩缩容阈值等功能。 HPA策略 CustomedHPA CCE容器弹性引擎 自研的弹性伸缩增强能力,主要面向无状态工作负载进行弹性扩缩容。能够基于指标(CPU利用率、内存利用率)或周期(每天、每周、每月或每年的具体时间点)。 CustomedHPA策略 Prometheus(停止维护) 云原生监控插件 一套开源的系统监控报警框架,负责采集kubernetes集群中kubelet的公开指标项(CPU利用率、内存利用率)。 CronHPA CCE容器弹性引擎 CronHPA可以实现在固定时间段对集群进行扩缩容,并且可以和HPA策略共同作用,定时调整HPA伸缩范围,实现复杂场景下的工作负载伸缩。 CronHPA定时策略 节点弹性伸缩组件介绍 表2 节点弹性组件 组件名称 组件介绍 适用场景 参考文档 CCE集群弹性引擎 Kubernetes社区开源组件,用于节点水平伸缩,CCE在其基础上提供了独有的调度、弹性优化、成本优化的功能。 全场景支持,适合在线业务、深度学习、大规模成本算力交付等。 节点自动伸缩 CCE突发弹性引擎(对接CCI) 将Kubernetes API扩展到无服务器的容器平台(如CCI),无需关心节点资源。 适合在线突增流量、CI/CD、大数据作业等场景。 CCE容器实例弹性伸缩到CCI服务
  • 背景介绍 随着Kubernetes已经成为云原生应用编排、管理的事实标准,越来越多的应用选择向Kubernetes迁移,用户也越来越关心在Kubernetes上应用如何快速扩容面对业务高峰,以及如何在业务低谷时快速缩容节约资源与成本。 在Kubernetes的集群中,“弹性伸缩”一般涉及到扩缩容Pod个数以及Node个数。Pod代表应用的实例数(每个Pod包含一个或多个容器),当业务高峰的时候需要扩容应用的实例个数。所有的Pod都是运行在某一个节点(虚机或裸机)上,当集群中没有足够多的节点来调度新扩容的Pod,那么就需要为集群增加节点,从而保证业务能够正常提供服务。 弹性伸缩在CCE上的使用场景非常广泛,典型的场景包含在线业务弹性、大规模计算训练、深度学习GPU或共享GPU的训练与推理、定时周期性负载变化等。
  • CCE弹性伸缩 CCE的弹性伸缩能力分为如下两个维度: 工作负载弹性伸缩:即调度层弹性,主要是负责修改负载的调度容量变化。例如,HPA是典型的调度层弹性组件,通过HPA可以调整应用的副本数,调整的副本数会改变当前负载占用的调度容量,从而实现调度层的伸缩。 节点弹性伸缩:即资源层弹性,主要是集群的容量规划不能满足集群调度容量时,会通过弹出ECS或CCI等资源的方式进行调度容量的补充。CCE容器实例弹性到CCI服务的方法请参见CCE容器实例弹性伸缩到CCI服务。 两个维度的弹性组件与能力可以分开使用,也可以结合在一起使用,并且两者之间可以通过调度层面的容量状态进行解耦,详情请参见使用HPA+CA实现工作负载和节点联动弹性伸缩。
  • 安装插件 登录CCE控制台,单击CCE Turbo集群名称进入集群,单击左侧导航栏的“插件中心”。 在“插件中心”页面右侧找到云原生监控插件,单击“安装”。 在监控CCE Turbo集群容器网络扩展指标的场景下,建议您关注以下配置。该插件的其他配置可按需进行设置,详情请参见云原生监控插件。 部署模式:此处选择“Server模式”,使用本地存储监控数据,监控数据可选择是否对接AOM或三方监控平台。如果使用“Agent模式”,则指标必须对接AOM或第三方监控平台,您可根据需求进行选择。 自定义指标采集:该配置在本实践中必须选择开启,否则将无法采集容器网络扩展指标。 (可选)安装Grafana:选择安装Grafana后,可以使用图表查看指标。 该配置在3.9.0以下版本的插件中支持。对于3.9.0及以上版本的插件,如果存在使用Grafana的需求,请单独安装Grafana。 在“插件中心”页面右侧找到CCE容器网络扩展指标插件,单击“安装”。 当前该插件无可配置参数。 (可选)对于3.9.0及以上版本的云原生监控插件,不再默认提供Grafana组件。您可以在“插件中心”页面右侧找到独立的Grafana插件,单击“安装”。 选择“开启节点访问”,将会在monitoring命名空间创建一条名为grafana-oss的Nodeport类型的Service。在Node绑定EIP的情况下,可直接使用浏览器输入“eip:port”地址进行访问。 开启节点访问将会把开源Grafana服务暴露至公网访问,建议评估安全风险并做好访问策略的管控。
  • 监控容器网络扩展指标 编辑容器网络扩展指标插件的DaemonSet配置,添加Ports信息。 1.3.10以下版本的容器网络扩展指标插件需手动操作,1.3.10及以上版本自动添加该配置,可跳过此步骤。 kubectl edit ds -nkube-system dolphin 添加如下配置: ... spec: containers: - name: dolphin ports: - containerPort: 10001 name: dolphin protocol: TCP ... 配置PodMonitor后,Prometheus就会自动采集CCE容器网络扩展指标。 pod-monitor.yaml文件配置参考如下: apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: dolphin namespace: monitoring spec: namespaceSelector: matchNames: - kube-system jobLabel: podmonitor-dolphin podMetricsEndpoints: - interval: 15s path: /metrics port: dolphin tlsConfig: insecureSkipVerify: true selector: matchLabels: app: dolphin 创建PodMonitor资源: kubectl apply -f pod-monitor.yaml
  • 通过Prometheus查看指标 创建一个示例监控任务,详情请参见下发监控任务。 apiVersion: crd.dolphin.io/v1 kind: MonitorPolicy metadata: name: example-task #监控任务名 namespace: kube-system #必填,namespace必须为kube-system spec: selector: #选填,配置dolphin插件监控的后端,形如labelSelector格式,默认将监控本节点所有容器 matchLabels: app: nginx matchExpressions: - key: app operator: In values: - nginx podLabel: [] #选填,用户标签 ip4Tx: #选填,ipv4发送报文数和发送字节数这两个指标的开关,默认不开 enable: true ip4Rx: #选填,ipv4接收报文数和接收字节数这两个指标的开关,默认不开 enable: true ip4TxInternet: #选填,ipv4发送公网报文数和发送公网字节数这两个指标的开关,默认不开 enable: true healthCheck: #选填,本地节点 Pod 健康检查任务中最近一次健康检查是否健康、健康检查总健康&不健康次数这三个指标开关,默认不开 enable: true # true false failureThreshold: 3 #选填,健康检查不健康判定失败次数,默认1次健康检查失败即判定不健康 periodSeconds: 5 #选填,健康检查任务检查间隔时间,单位秒,默认60 command: "" #选填,健康检查任务检查命令,支持:ping、arping、curl,默认 ping ipFamilies: [""] #选填,健康检查IP地址族,支持:ipv4,默认ipv4 port: 80 #选填,使用curl时必选,端口号 path: "" #选填,使用curl时必选,http api 路径 monitor: ip: ipReceive: aggregateType: flow #选填,支持填写"pod"或"flow",分别表示pod粒度监控或流粒度监控 ipSend: aggregateType: flow #选填,支持填写"pod"或"flow",分别表示pod粒度监控或流粒度监控 tcp: tcpReceive: aggregateType: flow #选填,支持填写"pod"或"flow",分别表示pod粒度监控或流粒度监控 tcpSend: aggregateType: flow #选填,支持填写"pod"或"flow",分别表示pod粒度监控或流粒度监控 tcpRetrans: aggregateType: flow #选填,支持填写"pod"或"flow",分别表示pod粒度监控或流粒度监控 tcpRtt: aggregateType: flow #选填,支持填写"flow",表示流粒度监控,单位:微秒 tcpNewConnection: aggregateType: pod #选填,支持填写"pod",表示pod粒度监控 为Prometheus创建一个公网LoadBalancer类型的Service,提供公网访问。 apiVersion: v1 kind: Service metadata: name: prom-lb #服务名称,可自定义 namespace: monitoring labels: app: prometheus component: server annotations: kubernetes.io/elb.id: 038ff*** #请替换为集群所在VPC下的ELB实例ID,且ELB实例为公网访问类型 spec: ports: - name: cce-service-0 protocol: TCP port: 88 #服务端口号,可自定义 targetPort: 9090 #Prometheus的默认端口号,无需更改 selector: #标签选择器可根据Prometheus Server实例的标签进行调整 app.kubernetes.io/name: prometheus prometheus: server type: LoadBalancer 创建完成后在浏览器访问“负载均衡公网IP地址:服务端口”,访问Prometheus。您可以在Prometheus页面中搜索支持的监控项,验证指标是否采集成功。 图1 访问Prometheus
  • (可选)通过Grafana查看图表 在集群中安装Grafana后,在“插件中心”页面右侧找到Grafana插件,单击“访问”。 输入您的Grafana登录账号及密码。 单击Grafana页面左侧导航栏中的“Explore”,然后在页面上方选择“Prometheus”,输入PromQL查询指令,例如“rate(dolphin_ip4_send_pkt_internet[5m])”,然后单击右上角“Run query”即可获取指标图表。 图2 Grafana图表 您也可以将常用图表固定为Grafana Dashboard,详情请参见Create a dashboard。
  • 约束与限制 建议其他资源不要使用Ingress自动创建的ELB实例,否则在删除Ingress时,ELB实例会被占用,导致资源残留。 添加Ingress后请在CCE页面对所选ELB实例进行配置升级和维护,不可在ELB页面对配置进行更改,否则可能导致Ingress服务异常。 Ingress转发策略中注册的URL需与后端应用提供访问的URL一致,否则将返回404错误。 IPVS模式集群下,Ingress和Service使用相同ELB实例时,无法在集群内的节点和容器中访问Ingress,因为kube-proxy会在ipvs-0的网桥上挂载LB类型的Service地址,Ingress对接的ELB的流量会被ipvs-0网桥劫持。建议Ingress和Service使用不同ELB实例。 请勿将Ingress与使用HTTP的Service对接同一个ELB下的同一个监听器,否则将产生端口冲突。 独享型ELB规格必须支持应用型(HTTP/HTTPS),且网络类型必须支持私网(有私有IP地址)。 同集群使用多个Ingress对接同一个ELB端口时,监听器的配置项(例如监听器关联的证书、监听器HTTP2属性等)均以首次创建监听器的Ingress配置为准。
  • Cluster Autoscaler工作原理 Cluster Autoscaler主要流程包括两部分: ScaleUp流程: Autoscaler会每隔10s检查一次所有未调度的Pod,根据用户设置的策略,选择出一个符合要求的节点池进行扩容。 Autoscaler检测未调度Pod进行扩容时,使用的是与Kubernetes社区版本一致的调度算法进行模拟调度计算,若应用调度采用非内置kube-scheduler调度器或其他非Kubernetes社区调度策略,此类应用使用Autoscaler扩容时可能因调度算法不一致出现无法扩容或多扩风险。 ScaleDown流程:Autoscaler每隔10s会扫描一次所有的Node,如果该Node上所有的Pod Requests少于用户定义的缩容百分比时,Autoscaler会模拟将该节点上的Pod是否能迁移到其他节点,如果可以的话,当满足不被需要的时间窗以后,该节点就会被移除。 当集群节点处于一段时间空闲状态时(默认10min),会触发集群缩容操作(即节点会被自动删除)。当节点存在以下几种状态的Pod时,不可缩容: Pod有设置Pod Disruption Budget(即干扰预算),当移除Pod不满足对应条件时,节点不会缩容。 Pod由于一些限制,如亲和、反亲和等,无法调度到其他节点,节点不会缩容。 Pod拥有cluster-autoscaler.kubernetes.io/safe-to-evict: 'false'这个annotations时,节点不缩容。 节点上存在kube-system命名空间下的Pod(除kube-system命名空间下由DaemonSet创建的Pod),节点不缩容。 节点上如果有非controller(Deployment/ReplicaSet/Job/StatefulSet)创建的Pod,节点不缩容。 当节点符合缩容条件时,Autoscaler将预先给节点打上DeletionCandidateOfClusterAutoscaler污点,限制Pod调度到该节点上。当autoscaler插件被卸载后,如果节点上依然存在该污点请您手动进行删除。
  • 使用kubectl自动创建本地持久卷 使用kubectl连接集群。 使用StorageClass动态创建PVC及PV。 创建pvc-local.yaml文件。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-local namespace: default annotations: everest.io/csi.volume-name-prefix: test # 可选字段,定义自动创建的底层存储名称前缀 spec: accessModes: - ReadWriteOnce # 本地持久卷必须为ReadWriteOnce resources: requests: storage: 10Gi # 本地持久卷大小 storageClassName: csi-local-topology # StorageClass类型为本地持久卷 表2 关键参数说明 参数 是否必选 描述 everest.io/csi.volume-name-prefix 否 可选字段,集群版本为v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上时支持,且集群中需安装2.4.15及以上版本的Everest插件。 定义自动创建的底层存储名称,实际创建的底层存储名称为“存储卷名称前缀”与“PVC UID”的拼接组合,如果不填写该参数,默认前缀为“pvc”。 取值范围:参数值长度为1~26,且必须是小写字母、数字、中划线,不能以中划线开头或结尾。 例如,存储卷名称前缀设置为“test”,则实际创建的底层存储名称test-{uid}。 storage 是 PVC申请容量,单位为Gi。 storageClassName 是 存储类名称,本地持久卷对应的存储类名称为csi-local-topology。 执行以下命令,创建PVC。 kubectl apply -f pvc-local.yaml 创建应用。 创建web-local.yaml文件,本示例中将本地持久卷挂载至/data路径。 apiVersion: apps/v1 kind: StatefulSet metadata: name: web-local namespace: default spec: replicas: 1 selector: matchLabels: app: web-local serviceName: web-local # Headless Service名称 template: metadata: labels: app: web-local spec: containers: - name: container-1 image: nginx:latest volumeMounts: - name: pvc-disk #卷名称,需与volumes字段中的卷名称对应 mountPath: /data #存储卷挂载的位置 imagePullSecrets: - name: default-secret volumes: - name: pvc-disk #卷名称,可自定义 persistentVolumeClaim: claimName: pvc-local #已创建的PVC名称 --- apiVersion: v1 kind: Service metadata: name: web-local # Headless Service名称 namespace: default labels: app: web-local spec: selector: app: web-local clusterIP: None ports: - name: web-local targetPort: 80 nodePort: 0 port: 80 protocol: TCP type: ClusterIP 执行以下命令,创建一个挂载本地持久存储的应用。 kubectl apply -f web-local.yaml 工作负载创建成功后,容器挂载目录下的数据将会持久化保持,您可以参考验证数据持久化中的步骤进行验证。
  • 相关操作 您还可以执行表3中的操作。 表3 其他操作 操作 说明 操作步骤 事件 查看PVC或PV的事件名称、事件类型、发生次数、Kubernetes事件、首次和最近发生的时间,便于定位问题。 在左侧导航栏选择“存储”,在右侧选择“存储卷声明”或“存储卷”页签。 单击目标实例操作列的“事件”,即可查看1小时内的事件(事件保存时间为1小时)。 查看YAML 可对PVC或PV的YAML文件进行查看、复制和下载。 在左侧导航栏选择“存储”,在右侧选择“存储卷声明”或“存储卷”页签。 单击目标实例操作列的“查看YAML”,即可查看或下载YAML。
  • 验证数据持久化 查看部署的应用及本地文件。 执行以下命令,查看已创建的Pod。 kubectl get pod | grep web-local 预期输出如下: web-local-0 1/1 Running 0 38s 执行以下命令,查看本地持久卷是否挂载至/data路径。 kubectl exec web-local-0 -- df | grep data 预期输出如下: /dev/mapper/vg--everest--localvolume--persistent-pvc-local 10255636 36888 10202364 0% /data 执行以下命令,查看/data路径下的文件。 kubectl exec web-local-0 -- ls /data 预期输出如下: lost+found 执行以下命令,在/data路径下创建static文件。 kubectl exec web-local-0 -- touch /data/static 执行以下命令,查看/data路径下的文件。 kubectl exec web-local-0 -- ls /data 预期输出如下: lost+found static 执行以下命令,删除名称为web-local-0的Pod。 kubectl delete pod web-local-0 预期输出如下: pod "web-local-0" deleted 删除后,StatefulSet控制器会自动重新创建一个同名副本。执行以下命令,验证/data路径下的文件是否更改。 kubectl exec web-local-0 -- ls /data 预期输出如下: lost+found static static文件仍然存在,则说明本地持久存储中的数据可持久化保存。
  • 云原生监控插件Server模式下为什么不能正常上报指标? 出现该问题的原因可能为Server模式下插件实例挂载的PV存储空间已满,导致指标无法写入。 请到插件中心,选中prometheus-server-x实例,查看日志。如果日志中存在:“no space left on device”类似的日志打印,则说明Prometheus挂载的磁盘空间不足。 图5 查看Prometheus实例日志 解决方案 方案一:推荐使用Agent模式,对接AOM实例。使用AOM托管指标数据,无需管理存储。 方案二:在左侧导航栏中选择“存储”,并切换至monitoring命名空间,选中pvc-prometheus-server-0的磁盘,扩容对应的存储资源。扩容完成后前往有状态负载页面,将prometheus-server的实例重启。 图6 扩容PVC 在磁盘空间不足后已无法写入Prometheus指标,将导致数据无法采集,因此扩容完成重启后,该时段的监控数据将会丢失。
  • Prometheus插件切换云原生监控插件 Prometheus插件不再维护,能力已完整收编至云原生监控插件,新插件提供了更全面、更强大的监控功能。从Prometheus插件切换至云原生监控插件时,只能继承原有的数据,无法继承旧Prometheus插件的配置。建议您参考以下步骤备份旧Prometheus插件配置: 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“配置与密钥”,切换至“monitoring”命名空间,查看以下三个配置项的YAML文件并保存。 adapter-config prometheus prometheus-server-record-rules 卸载Prometheus插件,安装新的云原生监控插件,并选择“Server”模式。 新插件安装完成后,您可参考原配置项内容重新添加配置。 对比插件升级后的配置项内容差异,根据需求进行更新。 由于插件升级,相同功能的配置项名称存在部分差异,云原生监控插件和Prometheus插件的配置对应关系如下: Prometheus插件配置 云原生监控插件配置 adapter-config user-adapter-config prometheus 插件更新后,该配置功能通过PodMonitor和ServiceMonitor实现,请重新选择对应的监控指标,详情请参见使用云原生监控插件监控自定义指标。 prometheus-server-record-rules 插件更新后,该配置功能通过PrometheusRule实现,请重新创建对应的告警规则,详情请参见使用PrometheusRules配置普罗监控与告警规则。
  • 索引 为什么监控中心没有数据了? 如何关闭监控中心? 监控中心为什么没有展示自定义指标? 为什么云原生监控插件在Server模式下,重启prometheus-server实例可能会导致节点列表的资源信息短时间(1-2分钟)无法正常显示? 为什么云原生监控插件在Server模式下,重启kube-state-metrics实例可能会导致页面部分数据翻倍? 云原生监控插件Server模式下为什么不能正常上报指标? Prometheus插件切换云原生监控插件
  • 为什么监控中心没有数据了? 可能原因一:云原生监控插件异常 请前往集群详情的“插件中心”页面,先检查插件云原生监控插件是否为“运行中”。 图1 检查插件运行状态 如果插件运行异常,可以根据云原生监控插件的实例的事件进行排查。 图2 查看插件事件 可能原因二:云原生监控插件对接的AOM实例被删除 请在集群详情的“插件中心”页面,检查插件云原生监控插件的配置。 图3 编辑插件配置 确认AOM实例非空。 图4 查看AOM实例
  • 为什么云原生监控插件在Server模式下,重启prometheus-server实例可能会导致节点列表的资源信息短时间(1-2分钟)无法正常显示? 因为当prometheus-server实例重启后,实例指标的uid标签值发生了变化。而由于Server模式本地存储了数据的机制,导致prometheus-server实例滚动重启的这段时间里指标重叠,即云原生监控插件上报到AOM的指标同时存在新老prometheus-server实例的指标,因而导致节点列表的资源信息不准确。故在指标重叠的这段时间内,不展示节点列表的资源信息。若无特殊场景,对接AOM推荐使用Agent模式的云原生监控插件。
  • 升级参数说明 参数 说明 限制 最大浪涌(maxSurge) 与spec.replicas相比,可以有多少个Pod存在,默认值是25%。 比如spec.replicas为 4,那升级过程中就不能超过5个Pod存在,即按1个的步长升级,实际升级过程中会换算成数字,且换算会向上取整。这个值也可以直接设置成数字。 仅Deployment、DaemonSet支持配置。 最大无效实例数(maxUnavailable) 与spec.replicas相比,可以有多少个Pod失效,也就是删除的比例,默认值是25%。 比如spec.replicas为4,那升级过程中就至少有3个Pod存在,即删除Pod的步长是1。同样这个值也可以设置成数字。 仅Deployment、DaemonSet支持配置。 实例可用最短时间(minReadySeconds) 指定新创建的 Pod 在没有任意容器崩溃情况下的最小就绪时间, 只有超出这个时间 Pod 才被视为可用。默认值为 0(Pod 在准备就绪后立即将被视为可用)。 - 最大保留版本数(revisionHistoryLimit) 用来设定出于回滚目的所要保留的旧 ReplicaSet 数量。 这些旧 ReplicaSet 会消耗 etcd 中的资源,并占用 kubectl get rs 的输出。 每个 Deployment 修订版本的配置都存储在其 ReplicaSets 中;因此,一旦删除了旧的 ReplicaSet, 将失去回滚到 Deployment 的对应修订版本的能力。 默认情况下,系统保留 10 个旧 ReplicaSet,但其理想值取决于新 Deployment 的频率和稳定性。 - 升级最大时长(progressDeadlineSeconds) 指定系统在报告 Deployment 进展失败 之前等待 Deployment 取得进展的秒数。 这类报告会在资源状态中体现为 Type=Progressing、Status=False、 Reason=ProgressDeadlineExceeded。Deployment 控制器将持续重试 Deployment。 将来,一旦实现了自动回滚,Deployment 控制器将在探测到这样的条件时立即回滚 Deployment。 如果指定,则此字段值需要大于 .spec.minReadySeconds 取值。 - 缩容时间窗(terminationGracePeriodSeconds) 优雅删除时间,默认为30秒,删除Pod时发送SIGTERM终止信号,然后等待容器中的应用程序终止执行,如果在terminationGracePeriodSeconds时间内未能终止,则发送SIGKILL的系统信号强行终止。 -
  • 升级示例 Deployment的升级可以是声明式的,也就是说只需要修改Deployment的YAML定义即可,比如使用kubectl edit命令将上面Deployment中的镜像修改为nginx:alpine。修改完成后再查询ReplicaSet和Pod,发现创建了一个新的ReplicaSet,Pod也重新创建了。 $ kubectl edit deploy nginx $ kubectl get rs NAME DESIRED CURRENT READY AGE nginx-6f9f58dffd 2 2 2 1m nginx-7f98958cdf 0 0 0 48m $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-6f9f58dffd-tdmqk 1/1 Running 0 1m nginx-6f9f58dffd-tesqr 1/1 Running 0 1m Deployment可以通过maxSurge和maxUnavailable两个参数控制升级过程中同时重新创建Pod的比例,这在很多时候是非常有用,配置如下所示。 spec: strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0 type: RollingUpdate 在前面的例子中,由于spec.replicas是2,如果maxSurge和maxUnavailable都为默认值25%,那实际升级过程中,maxSurge允许最多3个Pod存在(向上取整,2*1.25=2.5,取整为3),而maxUnavailable则不允许有Pod Unavailable(向上取整,2*0.75=1.5,取整为2),也就是说在升级过程中,一直会有2个Pod处于运行状态,每次新建一个Pod,等这个Pod创建成功后再删掉一个旧Pod,直至Pod全部为新Pod。
共100000条