Kubernetesと春のクラウドベースのマイクロサービスの練習の039. [回転数]

http://dockone.io/article/2967

マイクロプロセッサベースのサービスと春クラウドの実践Kubernetes

 

EDITORIAL

サービスチームのマイクロアーキテクチャの実装は2016年の初めから、この目的のために、完全なソリューションと閉ループユーザーエクスペリエンスを提供することを期待与えるために網易のクラウドプラットフォームコンテナ、当社コンテナサービスの社内チームは、容器がプラットフォームを曇らせることができないかどうかを確認するために練習をドッグフーディングすることが初めてでした手頃な価格のコンテナサービス自体マイクロサービスアーキテクチャをサポートし、これは非常に興味深い試みです。

マイクロサービスアーキテクチャを行うことを決定したら、多くの本物がある問題な技術選択など、私たちの前には、ビジネス上の問題、高可用性、通信サービス、サービスの発見と管理、フォールトトレラントクラスタ、構成管理、分割、データの整合性の問題、コンウェイの法則、解決することができるコール・トレース、CI / CD、マイクロサービスのテスト、および展開のスケジュールを配布し、そうで......これは、いくつかの簡単なトリックではありません。マイクロサービスアーキテクチャは、種の数百万人がある方法を実践し、私たちはあなたの参照を与えることを期待して、それらの可能性を探求し、実践しています。これは、記事の最初の「マイクロサービング練習網易のクラウドプラットフォームのコンテナを」シリーズです。

ドッカーコンテナ技術は徐々に大手企業と技術チームに適用される、最も古い時代の喧騒となっています。ビューの今日のポイントが、我々は徐々に視点を「ミラーは、標準アプリケーション配信と定義され、容器が実行されている標準のアプリケーション環境として使用された」の概念から認識されているが、まだそこにある人々のかなりの数は、標準としてコンテナ技術を混同し、どのようにすべき床、どのように大規模なオンラインアプリケーションは、どのように本当に、生産力を解放効率と品質のソフトウェア配信を促進するために再生することができますか?答えは、アプリケーション間のアーキテクチャです。

マイクロサービスアーキテクチャが生まれた技術ドッカーコンテナによるものではないが、それは技術的、コンテナ火災によるものです。コンテナ技術は、その価値を最大化コンテナでのご注文のアフターサービスのみのマイクロアーキテクチャを利用して、配布・実行環境の一貫性のある手段を提供します。マイクロサービスアーキテクチャは、複雑さの多くは、唯一の容器の適用及び運用・保守効率を避けるためにコンテナの配置およびスケジューリングの大きさを導入します。技術とマイクロアーキテクチャ間のコンテナサービスは、これは補完補完関係です。

網易のクラウドプラットフォーム以前は知られているコンテナは、網易アプリケーションの自動配置プラットフォーム(OMAD)で、それは統合を含むアプリケーション全体のライフサイクル管理を構築し、展開の実現、を含む、提供するIaaSのクラウドインフラストラクチャを使用することができます。2014年に、公共のビューにドッカーコンテナ技術の代表として、私たちは、コンテナが自動的にパズルの最も重要な部分のツール・プラットフォーム・アプリケーションからアプリケーションの進化のための技術プラットフォームを展開していることを見つけるために驚きました。ユーザーがアプリケーションを構築、配備するための自動配置プラットフォームで完了し、その後、元のホストを初期化する必要があります。コンテナ技術の導入後、ユーザはキー配置にラインをテストするために、機能の開発、ホストの初期化送達を気にすることなく、アプリケーション全体のプロセスがホスト、スケジューリングの例との間の通信よりも適用範囲を発行します。これは単にDevOpsチームの福音の信仰です。

2015年の初めから、我々は我々は、クラスター、後の状態の定義と非国家のサービスだけでなく、今日の新しいコンピューティングおよびハイパフォーマンスコンピューティングとオリジナルの「ファット・コンテナ」コンテナからのコンテナ技術、製品形態のベストプラクティスを探ります私は思考とアプリケーションシナリオコンテナ技術を豊かにされています。どんなに製品形態を調整する方法、クラウドコンテナプラットフォームの中核概念は抽象的、弾性伸縮サポート、垂直拡大、灰色のアップグレード、サービスの発見、サービスのオーケストレーション、マイクロサービスを通じて、高性能コンテナのクラスタ管理プログラムを提供するために、「マイクロ・サービス」されていません、エラー回復、パフォーマンスの監視と他の機能、アプリケーション配信の効率化と変化するビジネスニーズへの迅速な対応を強化するために、ユーザーを満たすために。チームを与えることが期待網易クラウドコンテナプラットフォームは、社内のチームは、試験容器に片手のクラウドプラットフォーム上で、練習をドッグフーディングされた最初の、2016年の初めから、この目的のために、完全なソリューションと閉ループユーザー体験を提供するために、私たちのコンテナサービスをマイクロサービスアーキテクチャを実装しましたマイクロサービスのクラウドプラットフォームコンテナ送り、製品設計の経験を通じて、他の一方で、自分のマイクロコンテナサービスサービスアーキテクチャをサポートする余裕がない、これは非常に興味深い試みですが、また、マイクロサービスアーキテクチャの練習コンテナを共有するために我々の意図は、プラットフォームを曇らせます。

マイクロサービスアーキテクチャの練習コンテナサービスに回す前に、網易のクラウドサービスは、一般的に導入されるために必要な最初のコンテナです。網易クラウドコンテナサービスチームは、400 +の展開を構築するために週マイクロサービスの30+ DevOpsチーム、回数を管理します。:論理的に底部から頂部に、4つのレベルからなる網易クラウドコンテナ・サービス・アーキテクチャは、インフラストラクチャ層、ドッカーコンテナエンジン層、Kubernetes(以下K8Sと称する)容器オーケストレーション層、DevOpsチームと自動化ツールの層であります

1.JPG


コンテナ全体的なビジネスのクラウドプラットフォームアーキテクチャ次のように:

2.JPG


容器脇特定のビジネス・サービス、サービス機能だけにもかかわらず、それは、次の種類の複数に分割することができる(括弧内のマイクロサービスの一例です)。

  1. エンドユーザ(OpenAPIのは、サービングゲートウェイ)、(ベアメタル・サービス)のためのサービス提供
  2. 同期通信(カスタマーセンター)、非同期通信(サービスの構築)
  3. 一貫性のあるデータへの強い需要(etcd同期サービス)、最終的には一貫性の需要(リサイクルサービス)
  4. スループットに敏感な(サービスのログ)、遅延に敏感な(リアルタイムサービス)
  5. CPUの計算集約型(署名認証センター)、ネットワークIO集約型(ミラー倉庫)
  6. オンラインサービス(Webサービス)、オフラインビジネス(ミラー・チェック)
  7. バッチジョブ(アカウンティングログプッシュ)、定期的なタスク(分散スケジュールされたタスク)
  8. ロングコネクション(WebSocketのゲートウェイサービス)、短い接続(フック・サービス)
  9. ......


一旦决定做微服务架构,有很多现实问题摆在面前,比如技术选型、业务拆分问题、高可用、服务通信、服务发现和治理、集群容错、配置管理、数据一致性问题、康威定律、分布式调用跟踪、CI/CD、微服务测试,以及调度和部署等等......这并非一些简单招数能够化解。

作为主要编程语言是 Java 的容器服务来说,选择 Spring Cloud 去搭配 K8S 是一个很自然的事情。Spring Cloud 和 K8S 都是很好的微服务开发和运行框架。从应用的生命周期角度来看,K8S 覆盖了更广的范围,特别像资源管理,应用编排、部署与调度等,Spring Cloud 则对此无能为力。从功能上看,两者存在一定程度的重叠,比如服务发现、负载均衡、配置管理、集群容错等方面,但两者解决问题的思路完全不同,Spring Cloud 面向的纯粹是开发者,开发者需要从代码级别考虑微服务架构的方方面面,而 K8S 面向的是 DevOps 人员,提供的是通用解决方案,它试图将微服务相关的问题都在平台层解决,对开发者屏蔽复杂性。举个简单的例子,关于服务发现,Spring Cloud 给出的是传统的带注册中心 Eureka 的解决方案,需要开发者维护 Eureka 服务器的同时,改造服务调用方与服务提供方代码以接入服务注册中心,开发者需关心基于 Eureka 实现服务发现的所有细节。而 K8S 提供的是一种去中心化方案,抽象了服务 (Service),通过 DNS+ClusterIP+iptables 解决服务暴露和发现问题,对服务提供方和服务调用方而言完全没有侵入。

对于技术选型,我们有自己的考量,优先选择更稳定的方案,毕竟稳定性是云计算的生命线。我们并不是 “K8S 原教旨主义者”,对于前面提到的微服务架构的各要点,我们有选择基于 K8S 实现,比如服务发现、负载均衡、高可用、集群容错、调度与部署等。有选择使用 Spring Cloud 提供的方案,比如同步的服务间通信;也有结合两者的优势共同实现,比如服务的故障隔离和熔断;当然,也有基于一些成熟的第三方方案和自研系统实现,比如配置管理、日志采集、分布式调用跟踪、流控系统等。

我们利用 K8S 管理微服务带来的最大改善体现在调度和部署效率上。以我们当前的情况来看,不同的服务要求部署在不同的机房和集群(联调环境、测试环境、预发布环境、生产环境等),有着不同需求的软硬件配置(内存、SSD、安全、海外访问加速等),这些需求已经较难通过传统的自动化工具实现。K8S 通过对 Node 主机进行 Label 化管理,我们只要指定服务属性 (Pod label),K8S 调度器根据 Pod 和 Node Label 的匹配关系,自动将服务部署到满足需求的 Node 主机上,简单而高效。内置滚动升级策略,配合健康检查 (liveness 和 readiness 探针)和 lifecycle hook 可以完成服务的不停服更新和回滚。此外,通过配置相关参数还可以实现服务的蓝绿部署和金丝雀部署。集群容错方面,K8S 通过副本控制器维持服务副本数 (replica),无论是服务实例故障(进程异常退出、oom-killed 等)还是 Node 主机故障(系统故障、硬件故障、网络故障等),服务副本数能够始终保持在固定数量。

3.JPG


Docker 通过分层镜像创造性地解决了应用和运行环境的一致性问题,但是通常来讲,不同环境下的服务的配置是不一样的。配置的不同使得开发环境构建的镜像无法直接在测试环境使用,QA 在测试环境验证过的镜像无法直接部署到线上……导致每个环境的 Docker 镜像都要重新构建。解决这个问题的思路无非是将配置信息提取出来,以环境变量的方式在 Docker 容器启动时注入,K8S 也给出了 ConfigMap 这样的解决方案,但这种方式有一个问题,配置信息变更后无法实时生效。我们采用的是使用 Disconf 统一配置中心解决。配置统一托管后,从开发环境构建的容器镜像,可以直接提交到测试环境测试,QA 验证通过后,上到演练环境、预发布环境和生产环境。一方面避免了重复的应用打包和 Docker 镜像构建,另一方面真正实现了线上线下应用的一致性。

Spring Cloud Hystrix 在我们的微服务治理中扮演了重要角色,我们对它做了二次开发,提供更灵活的故障隔离、降级和熔断策略,满足 API 网关等服务的特殊业务需求。进程内的故障隔离仅是服务治理的一方面,另一方面,在一个应用混部的主机上,应用间应该互相隔离,避免进程间互抢资源,影响业务 SLA。比如绝对要避免一个离线应用失控占用了大量 CPU,使得同主机的在线应用受影响。我们通过 K8S 限制了容器运行时的资源配额(以 CPU 和内存限制为主),实现了进程间的故障和异常隔离。K8S 提供的集群容错、高可用、进程隔离,配合 Spring Cloud Hystrix 提供的故障隔离和熔断,能够很好地实践 “Design for Failure” 设计哲学。

服务拆分的好坏直接影响了实施微服务架构的收益大小。服务拆分的难点往往在于业务边界不清晰、历史遗留系统改造难、数据一致性问题、康威定律等。从我们经验来看,对于前两个问题解决思路是一样的:1)只拆有确定边界能独立的业务。2)服务拆分本质上是数据模型的拆分,上层应用经得起倒腾,底层数据模型经不起倒腾。对于边界模糊的业务,即使要拆,只拆应用不拆数据库。

以下是我们从主工程里平滑拆出用户服务的示例步骤:

4.JPG

 

  1. 将用户相关的 UserService、UserDAO 分离出主工程,加上 UserController、UserDTO 等,形成用户服务,对外暴露 HTTP RESTful API。
  2. 将主工程用户相关的 UserService 类替换成 UserFaçade 类,采用 Spring Cloud Feign 的注解,调用用户服务 API。
  3. 主工程所有依赖 UserServce 接口的地方,改为依赖 UserFaçade 接口,平滑过渡。


经过以上三个步骤,用户服务独立成一个微服务,而整个系统代码的复杂性几乎没有增加。

数据一致性问题在分布式系统中普遍存在,微服务架构下会将问题放大,这也从另一个角度说明合理拆分业务的重要性。我们碰到的大部分数据一致性场景都是可以接受最终一致的。“定时任务重试+幂等” 是解决这类问题的一把瑞士军刀,为此我们开发了一套独立于具体业务的 “分布式定时任务+可靠事件” 处理框架,将任何需保证数据最终一致的操作定义为一种事件,比如用户初始化、实例重建、资源回收、日志索引等业务场景。以用户初始化为例,注册一个用户后,必须对其进行初始化,初始化过程是一个耗时的异步操作,包含租户初始化、网络初始化、配额初始化等等,这需要协调不同的系统来完成。我们将初始化定义为一种 initTenant 事件,将 initTenant 事件及上下文存入可靠事件表,由分布式定时任务触发事件执行,执行成功后,清除该事件记录;如果执行失败,则定时任务系统会再次触发执行。对于某些实时性要求较高的场景,则可以先触发一次事件处理,再将事件存入可靠事件表。对于每个事件处理器来说,要在实现上确保支持幂等执行,实现幂等执行有多种方式,我们有用到布尔型状态位,有用到 UUID 做去重处理,也有用到基于版本号做 CAS。这里不展开说了。

5.jpg


ビジネスの境界と組織競合する場合は、私たちの実践的な経験から、サービスの境界分割の組織構造に沿って、より多くのを好むだろう。また、これはコンウェイの法則に沿っての練習です。コンウェイの法則は、システム・アーキテクチャは、組織の通信構造に相当し、言います。組織は、ソフトウェアシステムのアーキテクチャの描写の形に拘束されることになります。コンウェイの法則に反して、システム設計が死角に非常に傾向がある、発生する「二つは関係なく、」相互シルクの状況、我々はチーム内のチームの一つであるが、このような状況に遭遇しました。

これは、シリーズ最初の「練習網易クラウドプラットフォームのマイクロサービングコンテナ」で、コンテナとマイクロテクノロジーサービスアーキテクチャとの関係を説明し、我々はコンテナがプラットフォームをクラウド作りを目指し同様の簡単な紹介網易、クラウドベースのサービスのコンテナとKubernetes春の雲実務経験のマイクロサービス。紙面の都合に、いくつかのマイクロアーキテクチャのサービスポイントは、このような通信サービス、サービスの発見と管理、構成管理およびその他のトピックとして、拡張されませんでした。いくつかは言及されていない、そのような分散型コールトレース、CI / CD、マイクロサービスのテストや他のトピック、これらの領域としてシェア実務経験は、記事の続く一連で行います。マイクロサービスアーキテクチャは、種の数百万人がある方法を実践し、私たちはあなたの参照を与えることを期待して、それらの可能性を探求し、実践しています。

おすすめ

転載: www.cnblogs.com/badboyh2o/p/11495226.html