华为云用户手册

  • 操作步骤 安装Sermant Agent,请参考安装Sermant Agent。 启动应用。 在应用的启动参数添加如下参数,添加启动参数后,待应用启动完成。 -javaagent:${HOME}/java-agent/java-agent.jar=appName=default-Ddynamic_config_serverAddress={CSE_CONFIG_CENTER_ENDPOINTS}-Dregister.service.address={CSE_REGISTRY_ENDPOINTS}-Dgrace_rule_enableSpring=false-Dservice_meta_version={VERSION}-Dservice_meta_parameters={PARAMETERS} 相关配置介绍: appName为agent服务名称,该配置无需修改,使用default即可。 ServiceComb引擎服务注册发现地址{CSE_REGISTRY_ENDPOINTS}与ServiceComb引擎配置中心地址{CSE_CONFIG_CENTER_ENDPOINTS}需替换为实际地址,可参考如下方式获取: ServiceComb引擎服务注册发现地址:获取ServiceComb引擎服务注册发现地址。 ServiceComb引擎配置中心地址:获取ServiceComb引擎配置中心地址。 grace_rule_enableSpring为SpringCloud框架优雅上下线功能,所以Dubbo框架需要手动关闭(设置为fasle),否则可能会存在端口冲突的问题。 {VERSION}需替换为服务注册时的版本号(形如a.b.c的格式,其中a、b、c均为数字,默认为1.0.0),标签应用需要修改为不同于正常应用的版本号。 {PARAMETERS}需替换为服务注册时的自定义标签(形如tag1:value1,tag2:value2),即标签名与标签值以英文冒号分隔,多个标签之间以英文逗号分隔。 一般地,如果用版本号进行路由,则只需配置service_meta_version,如果用自定义标签进行路由,则只需配置service_meta_parameters。
  • 操作步骤 安装Sermant Agent,请参考安装Sermant Agent。 启动应用。 在应用的启动参数中添加如下参数,添加启动参数后,待应用启动完成。 -javaagent:${HOME}/java-agent/java-agent.jar=appName=default-Ddynamic_config_serverAddress={CSE_CONFIG_CENTER_ENDPOINTS}-Dregister.service.address={CSE_REGISTRY_ENDPOINTS}-Dservice_meta_version={VERSION}-Dservice_meta_parameters={PARAMETERS} 相关配置介绍: appName为agent服务名称,该配置无需修改,使用default即可。 ServiceComb引擎服务注册发现地址{CSE_REGISTRY_ENDPOINTS}与ServiceComb引擎配置中心地址{CSE_CONFIG_CENTER_ENDPOINTS}需替换为实际地址,可参考如下方式获取: ServiceComb引擎服务注册发现地址:获取ServiceComb引擎服务注册发现地址。 ServiceComb引擎配置中心地址:获取ServiceComb引擎配置中心地址。 {VERSION}需替换为服务注册时的版本号(形如a.b.c的格式,其中a、b、c均为数字,默认为1.0.0),标签应用需要修改为不同于正常应用的版本号。 {PARAMETERS}需替换为服务注册时的自定义标签(形如tag1:value1,tag2:value2),即标签名与标签值以英文冒号分隔,多个标签之间以英文逗号分隔。 一般地,如果用版本号进行路由,则只需配置service_meta_version,如果用自定义标签进行路由,则只需配置service_meta_parameters。
  • Mongo client升级变更 问题描述 MongoDbFactory的接口存在变更,需要调整为新版本的用法。 解决方案 @Beanpublic MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context, BeanFactory beanFactory) { DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory); MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context); mappingConverter.setCustomConversions(beanFactory.getBean(MongoCustomConversions.class)); // other customization return mappingConverter;}@Beanpublic MongoClientOptions mongoOptions() { return MongoClientOptions.builder().maxConnectionIdleTime(60000).socketTimeout(60000).build(); }
  • 开源软件选型 主要的开源社区,例如Spring Boot、Spring Cloud等都会维护多个版本分支。以Spring Cloud为例,存在Hoxton、Greenwich、2020.0.x等分支,其中大部分分支都已经停止维护。开源软件多数维护的分支存在两个:一个为最新版本的开发分支;一个为最近的稳定维护分支。 在开源软件选型上,应该紧跟社区的版本节奏,使用继续提供维护的分支的最新版本。在选择开发分支和维护分支上,没有严格的定论,需要视具体的产品功能确定。例如产品竞争力严重依赖某个三方软件的特性,那么更倾向于选择开发分支的最新版本;一个产品依赖某个三方软件的特性稳定,不使用新功能,那么更倾向于选择维护分支。 不建议选择社区已经停止维护的分支、以及虽然还在维护但发布时间超过半年以上的分支版本。虽然使用这些版本暂时没有发现功能问题,但是会给产品的持续演进带来严重影响:
  • 下发路由规则配置 下发路由规则配置,详情请参考配置管理。 路由规则说明示例: ---- precedence: 2 # 优先级,数字越大,优先级越高。 match: # 请求匹配规则。0..N个,不配置表示匹配。 headers: # http header匹配 id: # 如果配置了多个header,那么所有的header规则都必须和请求匹配 exact: '1' # 配置策略,等于1,详细配置策略见配置策略表。 caseInsensitive: false # false:不区分大小写(默认),true:区分大小写。配置为false时,将统一转为大写进行比较 route: # 路由规则 - weight: 20 # 权重值 tags: version: 1.0.0 # 实例标记。满足标记条件的实例放到这一组。 - weight: 80 # 权重值 tags: version: 1.0.1 # 实例标记。满足标记条件的实例放到这一组。- precedence: 1 route: - weight: 20 tags: group: red - weight: 80 tags: group: green
  • 升级零中断 要实现升级零中断,通常需要解决如下问题: 停止服务的时候,可能引起业务中断。在停止服务的过程中,可能服务正在处理请求,新的请求可能持续的发送到该服务。 在微服务架构下,一般都会通过注册中心进行服务发现,客户端会缓存实例地址。停止服务的时候,使用者可能无法及时感知实例下线,并继续使用错误的实例进行访问,导致失败。 实现升级零中断,需要进行滚动升级,在新版本功能就绪后,才能够停止老版本。 实现升级零中断需要很多的措施进行配合,比如滚动升级,实现零中断,建议保证最小有2个可用的实例。在本章节里面,主要描述从微服务的角度进行设置,更好的配合升级零中断。Java Chassis实现零中断的核心机制包括如下几个: 优雅停机。服务停止的时候,需要等待请求完成,并拒绝新请求。 Java Chassis优雅停机默认提供,在进程退出前,会进行一定的清理动作,包括等待正在处理的请求完成、拒绝未进入处理队列的新请求、调用注册中心接口进行注销等动作。Java Chassis进程退出前,先将实例状态修改为DOWN,然后等待一段时间再进行后续的退出过程: servicecomb: boot: turnDown: # 实例状态修改为DOWN以后等待时间,默认值为0,即不等待。 waitInSeconds: 30 重试:客户端对于网络连接错误,以及被拒绝等请求,需要选择新服务器进行重试。 开启重试策略: servicecomb: loadbalance: retryEnabled: true # 是否开启重试策略 retryOnNext: 1 # 重新寻找一个实例重试的次数(不同于失败实例,依赖于负载均衡策略) retryOnSame: 0 # 在失败的实例上重试的次数 隔离:对于失败超过一定次数的服务实例,进行隔离。 开启实例隔离策略: servicecomb: loadbalance: isolation: enabled: true enableRequestThreshold: 5 # 统计周期内实例至少处理的请求数,包括成功和失败。 singleTestTime: 60000 # 实例隔离后,经过这个时间,会尝试访问。如果访问成功,则取消隔离,否则继续隔离。 continuousFailureThreshold: 2 # 实例隔离的条件,连续两次失败。 父主题: 合理规划服务治理
  • 动态配置的类型选择 微服务引擎2.0的配置中心支持text、yaml等多种格式。 简单的key-value配置项 可以使用text类型,配置中心的key对应于代码中的key。 大量的配置 使用yaml格式,配置中心的key会被忽略,全量的key-value在yaml文件中定义。 ServiceComb引擎1.x不支持yaml格式,可以通过Spring Cloud Huawei适配,来使用yaml,需要在微服务bootstrap中增加如下配置: spring: cloud: servicecomb: config: fileSource: consumer.yaml # 需要按照yaml解析的配置项列表,以逗号分隔 初次使用ServiceComb引擎2.x 建议选择Spring Cloud Huawei的最新版本,最新版本包含更多的特性并针对历史问题进行了较好的优化。
  • 解决方法 启动服务在本地部署 在本地机器上使用curl https://注册中心IP地址:30100/health命令检查注册中心工作状态,查看是否返回类似如下信息: curl: Failed to connect to xxx.xxx.xxx.xxx port 30100: Connection refused 如果是,请检查是否因注册中心IP地址错误、注册中心端口号错误或者网络被隔离,导致网络不通。 启动服务在云上微服务引擎部署 微服务通过ServiceStage部署在微服务引擎,注册中心地址可以通过环境变量自动注入。请检查注入的注册中心地址是否正确。如果注册中心地址错误,请修改为正确地址并重新部署服务。
  • 问题描述 当使用Spring Cloud Huawei时,启动微服务时,当报错示例如下: send request to https://192.168.10.1:30100/v4/default/registry/microservices failed and retry to https://192.168.10.1:30100/v4/default/registry/microservices once.org.apache.http.conn.HttpHostConnectException: Connect to 192.168.10.1:30100 [/127.0.0.2] failed: Connection refused: connectat org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:156) ~[httpclient-4.5.13.jar:4.5.13]at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376) ~[httpclient-4.5.13.jar:4.5.13]
  • 合理配置日志文件 查看错误日志是定位问题的重要手段,需要合理规划日志输出,并且尽可能降低对系统性能的影响。规划日志文件有如下建议: 使用log4j2或者logback输出日志。 将日志输出到文件,不要依赖于容器的stdout。 打开metrics日志,将metrics日志输出到独立的文件,比如“metrics.log”, 而将业务日志输出到另外的文件,比如“servicecomb.log”。metrics参数配置如下: servicecomb: metrics: window_time: 60000 invocation: latencyDistribution: 0,1,10,100,1000 Consumer.invocation.slow: enabled: true msTime: 3000 Provider.invocation.slow: enabled: true msTime: 3000 publisher.defaultLog: enabled: true endpoints.client.detail.enabled: true 打开access log, 将access log输出到独立的日志文件。 格式化打印业务日志,日志里面包含trace id,可以独立开发一个Handler,配置在Provider Handler的最前面,Handler在接收到请求后打印一条日志,处理完成了打印一条日志,对于问题界定,使用AOM快速检索相关日志等非常有帮助。 父主题: 托管Java Chassis应用
  • 概述 Java Chassis是Apache基金会管理的开源微服务开发框架,最早由CSE捐献,目前有上百个开发者为项目做出贡献。相对于Spring Cloud,Java Chassis,它提供了如下独特的功能: 灵活高性能的RPC实现。Java Chassis基于Open API,给出了不同RPC开发方式的统一描述,让微服务接口管理更加规范,同时保留了灵活的开发者使用习惯。Java Chassis基于Reactive,实现了高效的REST、Highway等通信协议,同时保留了传统Servlet等通信协议的兼容。 丰富的服务治理能力和统一的治理职责链。负载均衡、流量控制、故障隔离等常见的微服务治理能力都可以开箱即用,同时提供了统一的治理职责链,让新的治理功能的开发变得简单。 和Spring Cloud一样,Java Chassis也可以使用Spring、Spring Boot作为应用功能开发的基础组件,但是由于Java Chassis提供了独立的RPC实现,因此使用依赖于Spring MVC的功能组件会受到限制,比如使用Spring Securtiy,需要基于Java Chassis做一些适配。 父主题: 托管Java Chassis应用
  • 适用场景 Spring Boot、Spring Cloud广泛应用于构建微服务应用。使用ServiceComb引擎托管Spring Cloud应用,主要目的是使用高可靠的商业中间件替换开源组件,对应用系统进行更好地管理和运维,改造过程应尽可能降低对业务逻辑的影响。适用于如下场景: 基于Spring Boot开发的应用系统,不具备微服务基本能力。应用系统通过集成Spring Cloud Huawei,具备服务注册发现、动态配置管理等能力。 基于Spring Cloud开源技术体系开发的应用系统,例如已经采用Eureka实现注册发现、采用Nacos实现动态配置,应用系统通过集成Spring Cloud Huawei,使用高可靠的商业中间件替换开源中间件,降低维护成本。 基于Spring Cloud其他开发体系,例如Spring Cloud Alibaba、Spring Cloud Azure等构建的云原生应用,使用Spring Cloud Huawei迁移到华为云运行。
  • 升级到Java Chassis的最新版本 持续升级版本,可以更好的使用CSE的新功能和新特性,及时修复已知的质量和安全问题,降低维护成本。持续升级版本也会带来一些兼容性问题。一个比较好的策略是将持续升级纳入版本计划,安排足够的时间进行,而不是以问题驱动。持续升级还需要构建自动化测试能力,以减少版本升级的验证时间和控制版本升级的风险,及早发现问题。持续的构建自动化能力和升级版本,是被证明有效的构建高质量软件的最佳实践。 父主题: 托管Java Chassis应用
  • 合理配置线程池参数 线程池是微服务的主要业务处理单元,合理的规划线程池不仅可以最大限度提升系统性能,还能防止异常情况导致系统无法给正常用户提供服务。线程池优化和业务自身的性能有很大关系,不同的场景参数设置不同,需要具体分析。下面分两种场景介绍。开始之前需要对业务的性能做一些基本的摸底,对常见的接口进行测试,查看时延。 业务性能很好的情况。 即非并发场景,接口的平均时延小于10ms。 业务性能很好的时候,为了让业务系统具备更好的可预测性,防止JVM垃圾回收、网络波动、突发流量等对系统的稳定性造成冲击,需要能够快速丢弃请求,并配合重试等措施,以保障波动情况下系统性能可预测,同时不会出现偶然的业务失败,影响体验。 连接数和超时设置 # 服务端verticle实例数,保持默认值即可。建议配置为8~10。servicecomb.rest.server.verticle-count: 10# 最大连接数限制。默认值为 Integer.MAX_VALUE。可以结合实际情况估算最大值,使系统具备更好的韧性。servicecomb.rest.server.connection-limit: 20000# 连接闲置时间。默认值60秒,一般不需要修改servicecomb.rest.server.connection.idleTimeoutInSeconds: 60# 客户端verticle实例数,保持默认值即可。建议配置为8~10。servicecomb.rest.client.verticle-count: 0# 一个客户端与服务器建立的最大连接数为 verticle-count * maxPoolSize,不要超过线程数。# 这里是 10*50=500. 实例非常多的场景,要减小单个实例的连接数。servicecomb.rest.client.connection.maxPoolSize: 50# 连接闲置时间。默认值30 秒,一般不需要修改,要小于服务端的连接闲置时间。servicecomb.rest.client.connection.idleTimeoutInSeconds 业务线程池配置 # 线程池组数,建议 2~4servicecomb.executor.default.group: 2# 建议 50~200servicecomb.executor.default.thread-per-group: 100# 线程池排队队列大小,默认值为Integer.MAX_VALUE。高性能场景不要使用默认值,以快速丢弃请求servicecomb.executor.default.maxQueueSize-per-group: 10000# 队列最大等待时间,如果超过,理解丢弃请求的处理并返回。默认值为0。# 高性能场景配置小的排队超时时间,快速丢弃请求servicecomb.rest.server.requestWaitInPoolTimeout: 100# 设置比较短的超时时间,快速丢弃请求, 但是不建议这个值小于1秒,可能导致很多问题。servicecomb.request.timeout=5000 业务性能不那么好的情况。 即非并发场景,接口的平均时延大于100ms。时延高通常是由于业务代码存在IO、资源等等待,CPU利用率上不去导致的。如果是由于计算复杂导致的,调优会变得复杂。 当业务性能不太好的时候,下面几个参数值需要调大,否则业务会大量阻塞。业务性能不好,通过调大参数能够保证系统的吞吐量,应对突发流量来临时带来的业务失败。不过这个是以牺牲用户体验为代价的。 # 服务端连接闲置时间。servicecomb.rest.server.connection.idleTimeoutInSeconds: 120000# 客户端连接闲置时间。servicecomb.rest.client.connection.idleTimeoutInSeconds: 90000# 线程池组数。servicecomb.executor.default.group: 4# 线程池大小。servicecomb.executor.default.thread-per-group: 200# 线程池排队队列大小,性能不好的情况下需要排队servicecomb.executor.default.maxQueueSize-per-group: 100000# 配置较大的超时时间servicecomb.rest.server.requestWaitInPoolTimeout: 10000servicecomb.request.timeout=30000 父主题: 托管Java Chassis应用
  • YAML示例 apiVersion: v1kind: Podmetadata: labels: test: liveness name: liveness-httpspec: 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
  • YAML样例 本节以nginx为例,说明kubectl命令设置容器生命周期的方法。 在以下配置文件中,您可以看到postStart命令在容器目录/bin/bash下写了个install.sh命令。 preStop执行uninstall.sh命令。 apiVersion: apps/v1kind: Deploymentmetadata: name: nginxspec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx command: - sleep 3600 #启动命令 imagePullPolicy: Always lifecycle: postStart: exec: command: - /bin/bash - install.sh #启动后命令 preStop: exec: command: - /bin/bash - uninstall.sh #停止前命令 name: nginx imagePullSecrets: - name: default-secret
  • 停止前处理 登录CCE控制台,在创建工作负载时,配置容器信息,选择“生命周期”。 在“停止前处理”页签,设置停止前处理的命令。 表4 停止前处理 参数 说明 命令行方式 在容器中执行指定的命令,配置为需要执行的命令。命令的格式为Command Args[1] Args[2]…(Command为系统命令或者用户自定义可执行程序,如果未指定路径则在默认路径下寻找可执行程序),如果需要执行多条命令,建议采用将命令写入脚本执行的方式。 如需要执行的命令如下: exec: command: - /uninstall.sh - uninstall_agent 请在执行脚本中填写: /uninstall uninstall_agent。这条命令表示容器结束前将执行uninstall.sh。 HTTP请求方式 发起一个HTTP调用请求。配置参数如下: 路径:请求的URL路径,可选项。 端口:请求的端口,必选项。 主机地址:请求的IP地址,可选项,默认是容器所在的节点IP。
  • 启动命令 在默认情况下,镜像启动时会运行默认命令,如果想运行特定命令或重写镜像默认值,需要进行相应设置。 Docker的镜像拥有存储镜像信息的相关元数据,如果不设置生命周期命令和参数,容器运行时将运行镜像制作时提供的默认的命令和参数,Docker将这两个字段定义为ENTRYPOINT和 CMD。 如果在创建工作负载时填写了容器的运行命令和参数,将会覆盖镜像构建时的默认命令ENTRYPOINT、CMD,规则如下: 表1 容器如何执行命令和参数 镜像 ENTRYPOINT 镜像CMD 容器运行命令 容器运行参数 最终执行 [touch] [/root/test] 未设置 未设置 [touch /root/test] [touch] [/root/test] [mkdir] 未设置 [mkdir] [touch] [/root/test] 未设置 [/opt/test] [touch /opt/test] [touch] [/root/test] [mkdir] [/opt/test] [mkdir /opt/test] 登录CCE控制台,在创建工作负载时,配置容器信息,选择“生命周期”。 在“启动命令”页签,输入运行命令和运行参数。 表2 容器启动命令 命令方式 操作步骤 运行命令 输入可执行的命令,例如“/run/server”。 若运行命令有多个,多个命令之间用空格进行分隔。若命令本身带空格,则需要加引号("")。 说明: 多命令时,运行命令建议用/bin/sh或其他的shell,其他全部命令作为参数来传入。 运行参数 输入控制容器运行命令参数,例如--port=8080。 若参数有多个,多个参数以换行分隔。
  • 启动后处理 登录CCE控制台,在创建工作负载时,配置容器信息,选择“生命周期”。 在“启动后处理”页签,设置启动后处理的参数。 表3 启动后处理-参数说明 参数 说明 命令行方式 在容器中执行指定的命令,配置为需要执行的命令。命令的格式为Command Args[1] Args[2]…(Command为系统命令或者用户自定义可执行程序,如果未指定路径则在默认路径下寻找可执行程序),如果需要执行多条命令,建议采用将命令写入脚本执行的方式。不支持后台执行和异步执行的命令。 如需要执行的命令如下: exec: command: - /install.sh - install_agent 请在执行脚本中填写: /install install_agent。这条命令表示容器创建成功后将执行install.sh。 HTTP请求方式 发起一个HTTP调用请求。配置参数如下: 路径:请求的URL路径,可选项。 端口:请求的端口,必选项。 主机地址:请求的IP地址,可选项,默认是容器所在的节点IP。
  • Ingress支持的Service类型 ELB Ingress支持的Service类型如表2所示。 表2 ELB Ingress支持的Service类型 集群类型 ELB类型 集群内访问(ClusterIP) 节点访问(NodePort) CCE集群 共享型负载均衡 不支持 支持 独享型负载均衡 不支持(集群内访问服务关联实例未绑定eni网卡,独享型负载均衡无法对接) 支持 CCE Turbo集群 共享型负载均衡 不支持 支持 独享型负载均衡 支持 不支持(节点访问服务关联实例已绑定eni网卡,独享型负载均衡无法对接) Nginx Ingress支持的Service类型如表3所示。 表3 Nginx Ingress支持的Service类型 集群类型 ELB类型 集群内访问(ClusterIP) 节点访问(NodePort) CCE集群 共享型负载均衡 支持 支持 独享型负载均衡 支持 支持 CCE Turbo集群 共享型负载均衡 支持 支持 独享型负载均衡 支持 支持
  • 查看节点伸缩策略 您可以查看节点伸缩策略的关联节点池、执行规则和伸缩历史,参照界面中的提示有针对性的解决异常问题。 在CCE控制台,单击集群名称进入集群。 单击左侧导航栏的“节点伸缩”,单击要查看的策略前方的。 在展开的区域中,可以看到该策略的关联节点池、执行规则和伸缩历史页签,若策略异常,请参照界面中的报错提示进行定位处理。 您还可以在节点池管理中关闭或开启弹性扩缩容: 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中单击“节点管理”并切换至“节点池”页签。 单击要操作的节点池的“编辑”按钮,在弹出的“编辑节点池”窗口中可设置节点数上下限和弹性缩容冷却时间。
  • 扩展网段规划说明 在添加扩展网段前,需做好网段规划,避免造成网段冲突。注意以下几点: 集群所在VPC下所有子网(包括扩展网段子网)不能和容器网段、服务网段冲突。 扩展网段选择10.0.0.0/8、172.16.0.0/12、192.168.0.0/16可能与集群Master分配的IP冲突,尽量避免选择这三个网段作为扩展网段。 同VPC的非集群内ECS,如果需要和集群互访,访问会做SNAT, Pod源地址是节点IP而非Pod IP。 如果扩展网段没添加过集群节点,那扩展网段的ECS不能访问集群内Pod;扩展网段添加集群节点后,扩展网段的ECS可以访问集群内Pod。
  • 版本记录 表3 CCE插件版本记录 插件版本 支持的集群版本 更新特性 社区版本 1.25.11 /v1.(19|21|23|25).*/ 支持插件实例AZ反亲和配置 升级至社区版本 1.10.1 1.10.1 1.25.1 /v1.(19|21|23|25).*/ 适配CCE v1.25集群 1.8.4 1.23.3 /v1.(15|17|19|21|23).*/ 插件依赖例行升级 1.8.4 1.23.2 /v1.(15|17|19|21|23).*/ 插件依赖例行升级 1.8.4 1.23.1 /v1.(15|17|19|21|23).*/ 适配CCE v1.23集群 1.8.4 1.17.15 /v1.(15|17|19|21).*/ 适配CCE v1.21集群 1.8.4 1.17.9 /v1.(15|17|19).*/ 插件依赖例行升级 1.8.4 1.17.7 /v1.(15|17|19).*/ 同步至社区v1.8.4版本 1.8.4 1.17.4 /v1.(17|19).*/ 适配CCE 1.19集群 1.6.5 1.17.3 /v1.17.*/ 支持v1.17集群,修复存根域配置问题 1.6.5 1.17.1 /v1.17.*/ 支持v1.17集群 1.6.5
  • 检查项内容 在升级CCE集群版本至v1.19及以上版本时,将对您的节点上的Kubenertes组件的配置进行检查,检查您是否后台修改过配置文件。 /opt/cloud/cce/kubernetes/kubelet/kubelet /opt/cloud/cce/kubernetes/kubelet/kubelet_config.yaml /opt/cloud/cce/kubernetes/kube-proxy/kube-proxy /etc/containerd/default_runtime_spec.json /etc/sysconfig/docker /etc/default/docker /etc/docker/daemon.json 如您对这些文件的某些参数进行修改,有可能会导致集群升级失败或升级之后业务出现异常。如您确认该修改对业务无影响,可单击确认后继续进行升级操作。 CCE采用标准镜像的脚本进行节点配置一致性检查,如您使用其它自定义镜像有可能导致检查失败。 当前可预期的修改将不会进行拦截,可预期修改的参数列表如下: 表1 可预期修改的参数列表 组件 配置文件 参数 升级版本 kubelet /opt/cloud/cce/kubernetes/kubelet/kubelet_config.yaml cpuManagerPolicy v1.19以上 kubelet /opt/cloud/cce/kubernetes/kubelet/kubelet_config.yaml maxPods v1.19以上 kubelet /opt/cloud/cce/kubernetes/kubelet/kubelet_config.yaml kubeAPIQPS v1.19以上 kubelet /opt/cloud/cce/kubernetes/kubelet/kubelet_config.yaml kubeAPIBurst v1.19以上 kubelet /opt/cloud/cce/kubernetes/kubelet/kubelet_config.yaml podPidsLimit v1.19以上 kubelet /opt/cloud/cce/kubernetes/kubelet/kubelet_config.yaml topologyManagerPolicy v1.19以上 kubelet /opt/cloud/cce/kubernetes/kubelet/kubelet_config.yaml resolvConf v1.19以上 kubelet /opt/cloud/cce/kubernetes/kubelet/kubelet_config.yaml eventRecordQPS v1.21以上 kubelet /opt/cloud/cce/kubernetes/kubelet/kubelet_config.yaml topologyManagerScope v1.21以上 kubelet /opt/cloud/cce/kubernetes/kubelet/kubelet_config.yaml allowedUnsafeSysctls v1.19以上 docker /etc/docker/daemon.json dm.basesize v1.19以上
  • 解决方案 若节点状态异常,请联系技术支持人员。 若容器网络异常,并影响了您的业务,请联系技术支持人员,并同步确认当前异常的网络访问路径。 源端 目的端 目的端类型 可能故障 集群内Pod 集群内节点 集群外同VPC下节点 华为云外 Service ELB 公网IP 集群流量负载均衡入口 未有记录 Service ELB 私网IP 集群流量负载均衡入口 未有记录 Ingress ELB 公网IP 集群流量负载均衡入口 未有记录 Ingress ELB 私网IP 集群流量负载均衡入口 未有记录 Service Node Port 公网IP 集群流量入口 kube proxy配置覆盖,该故障已在升级流程适配 Service Node Port 私网IP 集群流量入口 未有记录 Service Cluster IP Service网络平面 未有记录 非Service NodePort 节点端口 节点容器网络 未有记录 跨节点Pod 容器网络平面 未有记录 同节点Pod 容器网络平面 未有记录 Service域名、Pod域名等,基于CoreDNS解析 域名解析 未有记录 外部网站域名,基于CoreDNS hosts配置解析 域名解析 coredns插件升级后配置被覆盖,该故障已在插件升级流程适配 外部网站域名,基于CoreDNS 上游服务器解析 域名解析 coredns插件升级后配置被覆盖,该故障已在插件升级流程适配 外部网站域名,不通过CoreDNS解析 域名解析 未有记录
  • 节点排水规则 节点排水功能会安全驱逐节点上的Pod,但对于满足以下过滤规则的Pod,系统会进行例外处理: Pod筛选条件 使用强制排水 不使用强制排水 Pod的status.phase字段为Succeeded或Failed 删除 删除 Pod不受工作负载controller管理 删除 放弃排水 Pod由DaemonSet管理 忽略 放弃排水 Pod中挂载了emptyDir类型的volume 驱逐 放弃排水 由kubelet直接管理的静态Pod 忽略 忽略 节点排水过程中可能会对Pod执行的操作如下: 删除:Pod会从当前节点上删除,不会再重新调度至其他节点。 驱逐:Pod会从当前节点上删除,且会重新调度至其他节点。 忽略:Pod不会被驱逐或删除。 放弃排水:若节点上存在放弃排水的Pod,节点排水过程会中止,不会驱逐或删除任何Pod。
  • 约束与限制 仅以下指定版本的集群支持节点排水功能: v1.21集群:v1.21.10-r0及以上版本 v1.23集群:v1.23.8-r0及以上版本 v1.25集群:v1.25.3-r0及以上版本 v1.25以上版本集群 IAM用户在使用节点排水功能时,至少需要具有以下一项权限,详情请参见命名空间权限(Kubernetes RBAC授权)。 cluster-admin(管理员权限):对全部命名空间下所有资源的读写权限。 drainage-editor:节点排水操作权限,可执行节点排水。 drainage-viewer:节点排水只读权限,仅可查看节点排水状态,无法执行节点排水。 如负载未设置干扰预算(Disruption Budget),Pod重新调度期间负载功能可能无法正常使用。
  • 约束与限制 文件存储必须与集群在同一个VPC内。 支持多个PV挂载同一个SFS或SFS Turbo,但有如下限制: 多个不同的PVC/PV使用同一个底层SFS或SFS Turbo卷时,且被同一Pod使用会出现问题,需要避免这么使用。 PV中persistentVolumeReclaimPolicy参数需设置为Retain,否则可能存在一个PV删除时,级联删除底层卷,其他关联这个底层卷的PV会由于底层存储被删除导致使用出现异常。 重复用底层存储时,建议在应用层做好多读多写的隔离保护,防止产生的数据覆盖和丢失。 使用SFS 3.0容量型时,集群中需要安装2.0.9及以上版本的everest插件。 使用SFS 3.0存储卷时,挂载点不支持修改属组和权限。 使用SFS 3.0存储卷时,创建、删除PVC和PV过程中可能存在时延,实际计费时长请以SFS侧创建、删除时刻为准。 SFS 3.0存储卷暂不支持Delete回收策略,需要挂载文件系统手动删除所有文件后才可以正常删除PV和PVC。
  • 约束与限制 云硬盘不支持跨可用区挂载,且不支持被多个工作负载、同一个工作负载的多个实例或多个任务使用。 由于CCE集群各节点之间暂不支持共享盘的数据共享功能,多个节点挂载使用同一个云硬盘可能会出现读写冲突、数据缓存冲突等问题,所以创建无状态工作负载时,若使用了EVS云硬盘,建议工作负载只选择一个实例。 1.19.10以下版本的集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,当新Pod被调度到另一个节点时,会导致之前Pod不能正常读写。 1.19.10及以上版本集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,新Pod会因为无法挂载云硬盘导致无法成功启动。 不支持使用已进行分区或者非ext4文件系统的云硬盘。 CCE集群中的容器存储目前已支持加密(Kubernetes 1.13版本及以上),使用前请确认云硬盘所在区域(Region)是否支持硬盘加密能力。
  • 使用场景 根据使用场景不同,文件存储支持以下挂载方式: 通过静态PV使用已有文件存储:即静态创建的方式,需要先使用已有的文件存储创建PV,然后通过PVC在工作负载中挂载存储。适用于已有可用的底层存储或底层存储需要包周期的场景。 通过动态PV使用文件存储:即动态创建的方式,无需预先创建文件存储,在创建PVC时通过指定存储类(StorageClass),即可自动创建文件存储和对应的PV对象。适用于无可用的底层存储,需要新创建的场景。
共100000条