
作者:十眠
背景
Cloud Native
ECS 故障节点上运行着 Kubernetes 集群的核心基础组件 CoreDNS 的所有 Pod,且低版本 Kubernetes 集群缺少 NodeLocal DNSCache 的特性,导致集群 DNS 解析出现问题。 该客户的服务发现使用了有缺陷的客户端版本(Nacos-client 的 1.4.1 版本),这个版本的缺陷就是跟 DNS 有关——心跳请求在域名解析失败后,会导致进程后续不会再续约心跳,只有重启才能恢复。 这个缺陷版本实际上是已知问题,阿里云在 5 月份推送了 Nacos-client 1.4.1 存在严重 bug 的公告,但客户研发未收到通知,进而在生产环境中使用了这个版本。


Provider 客户端在心跳续约时发生 DNS 异常; 心跳线程未能正确地处理这个 DNS 异常,导致线程意外退出了; 注册中心的正常机制是,心跳不续约,30 秒后自动下线。由于 CoreDNS 影响的是整个 Kubernetes 集群的 DNS 解析,所以 Provider 的所有实例都遇到相同的问题,整个服务所有实例都被下线; 在 Consumer 这一侧,收到推送的空列表后,无法找到下游,那么调用它的上游(比如网关)就会发生异常。
面向失败的设计
Cloud Native
服务发现高可用-推空保护

默认无侵入支持市面上近五年来的 Spring Cloud 与 Dubbo 框架
无关注册中心实现,无需升级 client 版本
服务发现高可用-离群实例摘除
因为仍然存在心跳正常,但服务不可用的情况,例如:
Request 处理的线程池满
依赖的 RDS 连接异常导致出现大量慢 SQL
某几台机器由于磁盘满,或者是宿主机资源争抢导致 load 很高

默认无侵入,支持市面上近五年来的 Spring Cloud 与 Dubbo 框架
无关注册中心实现,无需升级 client 版本
基于异常检测的摘除策略:包含网络异常和网络异常 + 业务异常(HTTP 5xx)
设置异常阈值、QPS 下限、摘除比例下限
摘除事件通知、钉钉群告警
动手实践
Cloud Native
已创建 Kubernetes 集群,请参见创建 Kubernetes 托管版集群[1]。
已开通 MSE 微服务治理专业版,请参见开通 MSE 微服务治理[2]。
开启 MSE 微服务治理
1、开通微服务治理专业版:
单击开通 MSE 微服务治理[3]。 微服务治理版本选择专业版,选中服务协议,然后单击立即开通。关于微服务治理的计费详情,请参见价格说明[4]。
2、安装 MSE 微服务治理组件:
在容器服务控制台[5]左侧导航栏中,选择市场 > 应用目录。 在应用目录页面搜索框中输入 ack-mse-pilot,单击搜索图标,然后单击组件。 在详情页面选择开通该组件的集群,然后单击创建。安装完成后,在命名空间 mse-pilotmse-pilot-ack-mse-pilot 应用,表示安装成功。
登录 MSE 治理中心控制台[6]。 在左侧导航栏选择微服务治理中心 > Kubernetes 集群列表。 在 Kubernetes 集群列表页面搜索目标集群,单击搜索图标,然后单击目标集群操作列下方的管理。 在集群详情页面命名空间列表区域,单击目标命名空间操作列下方的开启微服务治理。 在开启微服务治理对话框中单击确认。
部署 Demo 应用程序
在容器服务控制台[5]左侧导航栏中,单击集群。 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。 在集群管理页左侧导航栏中,选择工作负载 > 无状态。 在无状态页面选择命名空间,然后单击使用 YAML 创建资源。 对模板进行相关配置,完成配置后单击创建。本文示例中部署 sc-consumer、sc-consumer-empty、sc-provider,使用的是开源的 Nacos。
部署示例应用(springcloud)
# 开启推空保护的 sc-consumerapiVersion: apps/v1kind: Deploymentmetadata:name: sc-consumerspec:replicas: 1selector:matchLabels:app: sc-consumertemplate:metadata:annotations:msePilotCreateAppName: sc-consumerlabels:app: sc-consumerspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jre- name: spring.cloud.nacos.discovery.server-addrvalue: nacos-server:8848- name: profiler.micro.service.registry.empty.push.reject.enablevalue: "true"image: registry.cn-hangzhou.aliyuncs.com/mse-demo-hz/demo:sc-consumer-0.1imagePullPolicy: Alwaysname: sc-consumerports:- containerPort: 18091livenessProbe:tcpSocket:port: 18091initialDelaySeconds: 10periodSeconds: 30# 无推空保护的sc-consumer-empty---apiVersion: apps/v1kind: Deploymentmetadata:name: sc-consumer-emptyspec:replicas: 1selector:matchLabels:app: sc-consumer-emptytemplate:metadata:annotations:msePilotCreateAppName: sc-consumer-emptylabels:app: sc-consumer-emptyspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jre- name: spring.cloud.nacos.discovery.server-addrvalue: nacos-server:8848image: registry.cn-hangzhou.aliyuncs.com/mse-demo-hz/demo:sc-consumer-0.1imagePullPolicy: Alwaysname: sc-consumer-emptyports:- containerPort: 18091livenessProbe:tcpSocket:port: 18091initialDelaySeconds: 10periodSeconds: 30# sc-provider---apiVersion: apps/v1kind: Deploymentmetadata:name: sc-providerspec:replicas: 1selector:matchLabels:app: sc-providerstrategy:template:metadata:annotations:msePilotCreateAppName: sc-providerlabels:app: sc-providerspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jre- name: spring.cloud.nacos.discovery.server-addrvalue: nacos-server:8848image: registry.cn-hangzhou.aliyuncs.com/mse-demo-hz/demo:sc-provider-0.3imagePullPolicy: Alwaysname: sc-providerports:- containerPort: 18084livenessProbe:tcpSocket:port: 18084initialDelaySeconds: 10periodSeconds: 30# Nacos Server---apiVersion: apps/v1kind: Deploymentmetadata:name: nacos-serverspec:replicas: 1selector:matchLabels:app: nacos-servertemplate:metadata:labels:app: nacos-serverspec:containers:- env:- name: MODEvalue: standaloneimage: nacos/nacos-server:latestimagePullPolicy: Alwaysname: nacos-serverdnsPolicy: ClusterFirstrestartPolicy: Always# Nacos Server Service 配置---apiVersion: v1kind: Servicemetadata:name: nacos-serverspec:ports:- port: 8848protocol: TCPtargetPort: 8848selector:app: nacos-servertype: ClusterIP
分别给 Consumer 应用增加 SLB 用于公网访问



编写测试脚本
while :doresult=`curl $1 -s`if [[ "$result" == *"500"* ]]; thenecho `date +%F-%T` $resultelseecho `date +%F-%T` $resultfisleep 0.1done
测试,分别开两个命令行,执行如下脚本,显示如下


将 coredns 组件缩容至数量 0,模拟 DNS 网络解析异常场景。


模拟 DNS 服务恢复,将其扩容回数量 2。

结果验证


只有重启了 Provider,sc-consumer-empty 才恢复正常


后续
尾
Cloud Native
相关链接
Cloud Native
[1] 创建 Kubernetes 托管版集群
https://help.aliyun.com/document_detail/95108.htm#task-skz-qwk-qfb
[2] 开通 MSE 微服务治理
https://help.aliyun.com/document_detail/347625.htm#task-2140253
[3] 开通 MSE 微服务治理
点击阅读原文,前往 MSE 官网查看更多!
了解更多相关信息,请扫描下方二维码或搜索微信号(AlibabaCloud888)添加云原生小助手!获取更多相关资讯!

文章转载自阿里巴巴云原生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




