Kubernetes でのマイクロサービス アーキテクチャの実装

Kubernetes でのマイクロサービス アーキテクチャの実装

[編集者注] この記事は、マイクロサービス メッシュ シリーズの第 2 部です。最も人気のあるマイクロサービス展開プラットフォームであるKubernetesを使用して、マイクロサービスの展開プロセスを詳しく説明します。これにより、ユーザーはマイクロサービスについて具体的に理解できると同時に、Istioと組み合わせてより複雑なサービスをその後展開するための基盤を築くことができます。

前回の記事では、マイクロサービスへの最近の傾向と、マイクロサービス アーキテクチャで発生する可能性のある複雑さのいくつかについて説明しました。今後数週間にわたってこの問題を詳しく検討していきます。さまざまな設計上の選択に内在するトレードオフと、それを軽減するために何ができるかを検討します。

[[270478]]

ただし、本題に入る前に、少し時間を取って、今日のマイクロサービスの最新状況を理解しておくのが賢明だと思います。まず、主要なコンテナ管理およびサービス オーケストレーション フレームワークである Kubernetes について確認しましょう。 Kubernetes とマイクロサービスは今日ではほぼ同義語となっているため、これらがどのように連携するかを徹底的に理解することが最善です。

クベネフィット

マイクロサービス自体と同様に、コンテナは近年、最新のスケーラブルなアーキテクチャの不可欠な部分になっています。マイクロサービスと同様に、コンテナは開発プロセスに実質的なメリットをもたらすため人気が高まっています。コンテナは信頼性が高く、拡張が容易で、Web サービスのコア コンポーネントを分離する優れた抽象化を提供します。より多くの Kubernetes 技術専門家とコミュニケーションを取りたい場合は、私の WeChat liyingjiese を追加し、「グループに参加」と記入してください。当グループは、世界中の大手企業のベストプラクティスや業界のトレンドを毎週レポートしています。

特に、あるコンテナ化技術は他の技術をはるかに上回っています。そうです、マイクロサービスへの旅の次の目的地は、最新のマイクロサービス インストールの主力である Kubernetes と Docker を調べることです。簡単に言えば、Kubernetes は最新のコンテナベースの DevOps のゴールド スタンダードであり、マイクロサービスとコンテナは密接に連携しています。

コンテナ化の普及に伴い、大規模な Docker デプロイメントとコンテナベースのサービスを管理するための競合するテクノロジがいくつかあります。廃止されたソリューションの中には、Docker Swarm、Apache Mesos、OpenStack Magnum などがあるのを覚えているかもしれません。しかし、現在では Kubernetes が競争に勝ちました。これは、AWS、Azure、Google Cloud にネイティブに付属する唯一のコンテナ化ソリューションであり、RedHat や Pivotal などの多くのプライベート クラウド プロバイダーによっても提供されています。

Kubernetes が急速に普及した理由は、構成とオーケストレーションを分離しているためです。このレベルの複雑さは驚くべきことではありません。Kubernetes は Google の社内プロジェクト Borg から生まれたものであり、分散システムにおける Google の数十年にわたる経験を集約したものです。 Kubernetes を使用すると、サービスの外観、必要なインスタンスの数、サービスに持たせる冗長性のタイプ、サービスの配置場所を指定できます。次に、ツールは現在の状態からサービスを作成するために必要な変更を自動的に計算します。これは、データベースが各行をどのように追加または変換するかを指定しない SQL のようなものだと考えてください。データの外観を指定すると、データベースがそれをどのように実装するかを判断します。 Kubernetes についても同様です。

Kubernetes の機能

Kubernetes が提供するのは、コンテナをサービス定義として表示する機能です。 Kubernetes は純粋なコンテナを処理できます。マイクロサービスの世界に踏み込まずにコンテナだけをデプロイしたい場合でも、Kubernetes は管理とデプロイの面で大いに役立ちます。クラスター内のサーバーに Kubernetes ソフトウェアをインストールすると、Kubernetes マスター プロセスによってソフトウェアが自動的にデプロイされます。

Kubernetes では、基本的なコンテナに加えて、Pod と呼ばれるものも使用できます。 Pod は、1 つ以上のサービスから構成される単一の定義です。 Pod には、独立して実行される単一のサーバーから、キー値ストアと組み合わせたデータベース コンテナーや http サーバーが一緒に含まれている完全なマルチコンテナー サービスまで、あらゆるものを含めることができます。ポッドは Kubernetes の基本的な構成要素です。

***最初の要素はサービスです。 Kubernetes では、サービスはポッドをアプリケーションに構成するためのレシピのようなものです。 Pod はライフサイクルを持つ具体的なデプロイメントですが、サービスはより抽象的です。バックエンドやデータベースなどの個々のコンポーネントについて説明します。

これらすべての機能を組み合わせたのが、Kubernetes コマンドライン ツール kubectl です。 Kubernetes が提供する抽象化は優れていますが、コマンドライン ツールは非常に強力で、kubectl コマンドを使用してアーキテクチャに対する複雑な変更を記述できます。全体として、kubectl CLI ツールには、コンテナベースのマイクロサービス デプロイメントを変更するときに発生するすべての状況 (間違いは必ず起こります) を処理するための約 50 種類のコマンドが含まれています。

実際に体験してみる

高レベルの説明は役に立ちますが、Kubernetes サービスを実際にデプロイするよりも理解しやすい方法はありません。ここではロケット科学的なことは何もしていません。単純な「Hello World」サービスをデプロイする方法を示しているだけですが、参考になるはずです。

HTTP リクエストに「Hello World」で応答するシンプルなサーバーを Go で作成しました。コードは非常にシンプルです:

  1. パッケージメイン
  2. 輸入 (
  3. 「fmt」  
  4. "ログ"  
  5. 「ネット/http」  
  6. 「オス」  
  7. 関数ハンドラ(w http.ResponseWriter, r *http.Request) {
  8. log.Print( "Hello world がリクエストを受信しました。" )
  9. バージョン:= os.Getenv( "VERSION" )
  10. バージョン == ""の場合{
  11. バージョン = "v1"  
  12. }
  13. log.Println(バージョン)
  14. fmt.Fprintf(w, "Hello world %s\n" ,バージョン)
  15. }
  16. 関数main() {
  17. log.Print( "Hello World サンプルが開始されました。" )
  18. http.HandleFunc( "/api/hello" 、ハンドラー)
  19. ポート:= os.Getenv( "PORT" )
  20. ポート == ""の場合{
  21. ポート = "8080"  
  22. }
  23. log.Fatal(http.ListenAndServe(fmt.Sprintf( ":%s" , ポート), nil))
  24. }

実行するための最初のステップは、それを Docker コンテナにビルドすることです。これを実行するには、ベースの Go Docker イメージから次の Dockerfile を構築します。

  1. # 公式Golangイメージ使用して ビルド成果物を作成します
  2. # https://hub.docker.com/_/golang
  3. golangからビルダーとして
  4. #ローカルコードコンテナ イメージコピーします。
  5. ワークディレクトリ /go/src/github.com/haseebh/hello-world
  6. コピー 。 。
  7. go build -o helloworld-v1 main/helloworld-v1.go を実行します。
  8. # Dockerマルチステージビルドを使用して リーン生産イメージを作成します
  9. # https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
  10. アルパインから
  11. コピー--from=builder /go/src/github.com/haseebh/hello-world-v1 /helloworld-v1  
  12. 環境ポート8080
  13. # コンテナの起動時にWeb サービスを実行します
  14. コマンド [ "/helloworld-v1" ]

今はそれを構築するだけです。イメージ タグを選択し、次の 2 つの Docker コマンドを実行してイメージをビルドして保存します。

  1. #ローカルマシン上でコンテナを構築する
  2. docker build -t <イメージタグ> 。
  3. # コンテナをDockerレジストリプッシュする
  4. docker push <イメージタグ>

展開する前にもう 1 つの手順があります。 Pod に何を入れるかは定義しましたが、サービスはまだ定義していません。 Hello Service という簡単なサービス定義を作成しましょう。これを hello-service.yml サービス定義ファイルに保存します。

  1. APIバージョン: v1
  2. 種類: サービス
  3. メタデータ:
  4. 名前: helloworld-v1
  5. 仕様:
  6. ポート:
  7. - ポート: 80
  8. プロトコル: TCP
  9. ターゲットポート: 8080
  10. セレクタ:
  11. アプリ: helloworld-v1
  12. タイプ: ロードバランサー
  13.  
  14. ---  
  15.  
  16. APIバージョン: アプリ/v1
  17. 種類: デプロイメント
  18. メタデータ:
  19. 名前: helloworld-v1
  20. ラベル:
  21. アプリ: helloworld-v1
  22. 仕様:
  23. レプリカ: 1
  24. セレクタ:
  25. 一致ラベル:
  26. アプリ: helloworld-v1
  27. テンプレート:
  28. メタデータ:
  29. ラベル:
  30. アプリ: helloworld-v1
  31. 仕様:
  32. コンテナ:
  33. -名前: helloworld-kubernetes
  34. # <image-tag>実際の画像置き換えます
  35. 画像: <画像タグ>
  36. ポート:
  37. - コンテナポート: 8080

今、必要なものはすべて揃っています。イメージが構築され、それに基づいてサービスが定義されました。これで、Kubernetes を使用してようやくデプロイできるようになりました。 kubectl コマンドライン ツールを使用して、これをクラスターにデプロイします。

  1. kubectl を適用 -f helloworld-go-v1.yaml

サービス ロード バランサー IP を取得するには、次のコマンドを実行します。

  1. kubectl get svc helloworld-v1 -o ワイド

外部 IP をメモします。

これで、ロードバランサーのアドレスにアクセスすると、デプロイされたサービスを確認できます。大したことではありませんが、「Hello World」はすべてが機能していることを示しています。

主要コンポーネント

このサービスを構築することで、Kubernetes の主要コンポーネントのほとんどを実証することができました。まず、サービスのコードを作成するために Dockerfile をレイアウトしました。 Kubernetes で実際にサービスを作成するには、YAML を使用して定義する必要があります。私たちの定義は、定義したイメージを取得し、それをどこに展開するか、どのバージョンか、その他の構成情報などの重要な情報を提供します。

その後、Pod にサービスをデプロイしました。 Kubernetes モデルでは、ポッドはコンテナと密接に関連しています。私たちのような多くのデプロイメントでは、サービスに単一の Pod を使用します。厳密に言えば、Kubernetes はコンテナを管理しません。これらのコンテナは Pod と 1 対 1 の関係にある場合もあれば、複数のコンテナが Pod に関連付けられている場合もあります。

***、振り付けの原理がわかります。 API をどのようにデプロイするかを定義した後は、構成ファイルを Kubernetes にプッシュするだけで、残りの作業は Kubernetes が行ってくれます。 kubectl を使用すると、必要なアーキテクチャを指定でき、残りの処理は Kubernetes が処理します。後で、複数のバージョンと複雑なデプロイメントを含む、より複雑な例を見ると、この単純なアイデアの威力がより明確にわかるでしょう。

もっと詳しく知る

シンプルなサービスを導入するのはほんの始まりに過ぎません。 Kubernetes はマイクロサービスをネイティブにサポートしており、基本的なマイクロサービス アーキテクチャやさらに複雑なマイクロサービス アーキテクチャをあまり手間をかけずにデプロイできる優れた方法を提供します。しかし、マイクロサービスのスケーラビリティを真に活用するには、さらに多くのことを知る必要があります。

次の記事では、Istio について紹介します。マイクロサービス アプローチを使用すると、モノリシック アプリケーションを複数のサービスに分解できます。最初の記事では、このアプローチにより、開発者の俊敏性が向上し、複雑なシステムに対処するための抽象化が向上することを説明しました。ここでは、Kubernetes を使用して実際にマイクロサービスをデプロイする方法を見てきました。来週は、マイクロサービス メッシュなど、マイクロサービス分野の新しい概念のいくつかを検討し、これらのテクノロジーの真の威力を紹介します。

<<:  ビジネス準備: ハイブリッドクラウドの波及効果

>>:  5G時代に、クラウドコンピューティングと5Gはどんな火花を散らすのでしょうか?

推薦する

同僚はDockerとK8Sを知らなかったため、会社のグループチャットから削除されました

Docker はコンテナと同義であり、K8S はコンテナ オーケストレーションと同義です。これら 2...

ウェブサイトは成長し始めたばかりです。運営のアイデアやウェブサイト構築のプロセスを共有しましょう

ウェブサイトは成長し始めたばかりで、私はウェブサイト構築における私の運営アイデアとエネルギーを共有し...

ウェブサイトの最適化に関する簡単な説明:SEOランキングは核心的なポイントを把握する必要がある

みなさんこんにちは。最近何かが起こり、忙しくてオンラインになっていなかったので、記事をシェアしていま...

Baidu のマッチングアルゴリズムがウェブサイトのランキングに与える影響

多くのウェブマスターの友人は私と同じだと思います。彼らは時々 SEO ブログ、SEO フォーラム、ま...

Nutanix、ハイブリッドクラウドプラットフォームにストレージサービスを拡張

Nutanix は本日、非構造化データ ストレージ製品である Objects と Files 向けの...

マイクロコミュニティ開発の方向性:サービス重視のマーケティングを避けるためのサービスとO2O

テキスト | 朱怡先週土曜日に開催された河南省モバイルインターネットマイクロパワーサミットで、筆者は...

一般的な分散ファイルシステムの包括的なレビュー。ビッグデータを理解したいなら、ストレージから始めましょう

[[239139]]ビッグデータの最初の層はストレージです。効率的にアクセスできる分散システムにデー...

クラウドコンピューティングを効率的に導入する方法

過去数年間に私たちが目にしてきた革新的なビジネスとテクノロジーの破壊的変化のほとんどは、クラウド コ...

クラウドコンピューティングが教育業界にもたらす力

COVID-19パンデミックは多くの分野に大きな混乱を引き起こしており、教育も例外ではありません。世...

Vultr-ロサンゼルスストレージVPSはオンライン、大容量ハードディスク、カスタマイズ可能なシステムです

Vultrは、新たに追加されたロサンゼルスデータセンターのストレージVPSが正式に運用開始したことを...

中央銀行がオンライン決済監督の嵐を巻き起こし、アリババとテンセントの競争の内幕が明らかに

これは、2つのインターネット金融大手によるカーブでの競争ゲームです。中央銀行はタイミングよく介入し、...

エンタープライズハイブリッドクラウドの将来はどうなるのでしょうか?

現在でも、多くの組織は、ワークロード全体をオフプレミスからクラウドに移行することに苦労しています。こ...

ウェブサイトの事例分析: データに語らせる方法

編集者: S++ チーム多くのウェブサイトでは、データは製品やデザインの品質を測定するための基本的な...

ウェブサイトの構築は6つの主要な安定性に従います:運用は主に安定性に基づいています(パート1)

私がインターネットに初めて触れた時から今まで、十数個のウェブサイトを構築してきました。ウェブサイト構...

racknerd Los Angeles DC-02 (multacom) Intelシリーズ + SSDハードディスク VPS 簡易評価

実は、Hostcat は以前 racknerd のロサンゼルス VPS をテストしたことがありました...