服务治理之 平台与应用服务解耦

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 业务完成`微服务改造(计算存储分离、控制数据分离)`,以`Kubernetes做运行时生命周期管理`, 并可以在`水平扩缩容`、`驱逐操作对业务无损`的云原生化改造

服务治理之 平台与应用服务解耦

原则

业务完成微服务改造(计算存储分离、控制数据分离),以Kubernetes做运行时生命周期管理, 并可以在水平扩缩容驱逐操作对业务无损的云原生化改造

1 首要原则:遏制应用无止境的使用operator来控制应用

遏制应用无止境的使用operator来控制应用,
建议使用hpavpa自带ingress-controller crds来控制 南北、东西 流量变化或者依赖服务可用性做调整

2 平台资源调用

2.1 禁止configmapmetaserver 服务使用

configmap只作为静态数据使用,不作为源数据服务使用。
举个例子:

  • configmap中配置服务其中基础配置: 日志等级启动模式功能开关等;
  • 不能将服务直接的 分布式锁Pod实例之间业务数据同步使用

2.2 禁止configmap配置中心 使用

configmap只作为静态数据使用,不作为config center使用。

举个例子:

  • configmap中只配置需要访问远程配置中心:URL地址、认证方式、请求策略等;
  • 不能直接用作pod的flag 配置开关;

2.3 禁止secret证书中心 使用

secret只作为静态的少量敏感信息例如密码、令牌或密钥的对象,不作为证书中心使用。

举个例子:

  • secret中配置 TLS 证书
  • 不能将secret作为证书ca 管理中心,频繁变更和下发证书;

2.4 禁止etcd服务 直接当 服务注册中心 使用

K8s 源数据etcd服务只作为Kubernetes底层数据使用,不能直接自定义CRD、自定义的configmapsecret来做服务注册发现

可以使用方式:通过KubeDNS+Kubernetes Service做服务发现;

2.5 禁止将 对象的label 当做容器运行时的metaserver使用

Label 只能做 key-value tag标签使用. 不能在pod 容器运行时,动态管理业务自用数据;

Label 的变更,只能是运维态做变更

2.6 禁止将 对象的annotation 当做容器运行时的metaserver使用

2.7 遏制将 对象的annotation 当做容器运行时的metaserver使用

annotation 只能做 key-value tag标签使用. 遏制在 pod 容器运行时,动态管理业务自用数据;
annotation 的变更,只能是运维态做变更 和 控制面组件 patch 使用;

3 安全性

3.1 遏制申请 特权容器

遏制 特权容器 申请; 引伸 业务服务化,减少 os 工具封装到Container中执行;

3.2 遏制避免挂在 host os 配置,在Pod中进行更改

遏制 host OS资源 挂载到Pod,扩大异常影响半径;
举例:
case:将iptable-storge相关资源挂载pod中,做xtable锁操作;

3.3 遏制rabc最小授权原则,遏制 全局/资源全部类型申请

  1. 减少ClusterRoleClusterRoleBinding全局资源类型申请;
  2. 禁止资源权限全局申请
    rules:
    - apiGroups:
     - '*'
     resources:
     - '*'
     verbs:
     - '*'
    

4 业务依赖client-go应用

纯微服务、纯业务应用不应该会用到 client-go/java SDK

4.1 要求业务依赖client-go应用版本不小于 Kubernetes apiserver version 2个大版本

版本问题:

  • 如果apiserver版本为v1.18.x, 那么依赖的client-go版本不能小于v0.16.x版本.
  • 如果apiserver版本为v1.18.x, client-go 使用版本大于v0.18.x原则上是可以的(需要测试验证功能)

4.2 要求对于依赖client-go应用,部署态显示配置QPSBurst

4.3 限制轮训 list all pod/node/configmap/secret等

限制全局轮训list all接口。 可以跟换为以下两种方式:

  1. 通过watch 方式添加add、delete、update 3这种event回调;
  2. 其中中添加opt.metav1(xxx) 设置条件:比如namespace选择、单次请求大小(500个)、filter tag不符合规范的object等

4.4 限制direct etcd请求,通过apiserver cache informer方式请求

4.5 要求对于watch资源,通过InformerFactory方式watch

4.6 遏制对apiserver 聚合aggregation api调用

5. 高可用

5.1 要求服务驱逐时,长/短链接、流量(东西、南北)无损

长/短链接:

  • 长链接:长链接主动connect close. 通过client 链接重新选实例建立,将链接全部驱逐掉;
  • 短链接:确保本次处理结束。优雅关闭链接;

流量:
通过设置 perStop + 实例分Step变更,实现流量无损;

5.1 建议无状态多实例部署;有状态实例支持sharding;

  • 有状态实例实例sharding比较考验业务架构,可选择"多活+数据同步"

6. 健康检查

6.1 健康检查中,首选 HTTP 探测,备选脚本探测,尽量避免 TCP 探测

6.2 要求所有容器添加 ReadinessProbe,谨慎使用 LivenessProbe

如果业务应用实例重启、驱逐敏感, 谨用 LivenessProbe

6.3 要求对于服务支持优雅重启,避免异常导致僵尸进程

支持容器runtime发出信号量,接受并处理。

7. 其他

7.1 建议部署态,亲和/反亲和设置

7.2 建议通过service、内部DNS 或 南北项LB方式服务直接调用

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
8月前
|
负载均衡 网络协议 微服务
服务注册:构建可伸缩性微服务架构的关键一环
在现代分布式应用程序中,微服务架构已经成为一种主流的开发方式。服务注册是构建可伸缩性微服务架构的关键组成部分之一。在本博客中,我们将深入探讨服务注册的概念、作用以及如何在微服务环境中有效地使用它。
|
8月前
|
消息中间件 Kafka Apache
微服务消息驱动:构建弹性、可扩展的分布式应用
在当今的软件开发世界中,微服务架构已经成为了构建大型应用的流行方式。随着应用规模的不断扩大,微服务架构引入了一些挑战,其中之一是确保各个微服务之间的通信高效、可靠和可扩展。微服务消息驱动架构应运而生,它为解决这些挑战提供了强大的工具和方法。
|
8月前
|
消息中间件 测试技术 数据库
消息队列和应用工具产品体系-微服务架构引发的问题
消息队列和应用工具产品体系-微服务架构引发的问题
65 0
消息队列和应用工具产品体系-微服务架构引发的问题
|
4天前
|
消息中间件 监控 中间件
探索微服务架构下的系统弹性设计
【4月更文挑战第26天】 在当今快速迭代和持续部署的软件发展环境中,系统的弹性设计成为维护高可用性和稳定性的关键因素。本文将深入探讨在微服务架构下如何实现系统弹性,包括识别潜在的故障点、设计容错机制、以及通过实践案例分析提升系统整体的韧性。我们将讨论一系列策略,如服务降级、超时管理、重试策略、断路器模式等,旨在为开发者提供一套实用的系统弹性设计方案。
|
4月前
|
SQL 监控 安全
微服务网关的那些核心本领
微服务网关的那些核心本领
|
5月前
|
存储 缓存 负载均衡
服务治理和分布式 基础
服务治理和分布式 基础
|
8月前
|
负载均衡 算法 微服务
服务发现:构建弹性微服务体系的关键组件
在微服务架构中,服务发现是实现弹性、高可用性和负载均衡的关键组件之一。本博客将深入探讨服务发现的概念、重要性以及如何有效地在微服务环境中使用它。
|
9月前
|
运维 负载均衡 监控
微服务系列 2:微服务化框架的模型和治理能力设计
微服务系列 2:微服务化框架的模型和治理能力设计
|
8天前
|
负载均衡 中间件 Nacos
微服务洞察,让微服务更透明
微服务作为云原生时代下一种开发软件的架构和组织方法,通过将明确定义的功能分成更小的服务,并让每个服务独立迭代,增加了应用程序的灵活性,允许开发者根据需要更轻松地更改部分应用程序。同时每个微服务可以由单独的团队进行管理,使用适当的语言编写,并根据需要进行独立扩缩容。但微服务同样也并非“银弹”,在带来如...
19 0
微服务洞察,让微服务更透明