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はどんな火花を散らすのでしょうか?

推薦する

電子会員カード商品観察(第2部):加盟店はどんな商品を求めているのか?

[コアヒント] 現在、O2O 企業はユーザーに焦点を当てていますが、マーチャントが本当に必要とする価...

Terranode: ロサンゼルス VPS、月額 3.49 ドル、1G メモリ/2 コア (Ryzen9 7950X)/20g NVMe/1T トラフィック/10G 帯域幅/無料バックアップ

テラノードは2009年に設立されたとされる企業で、主にVPS事業を展開しており、データセンターは米国...

Baidu はどのようにして独創性を保護するのでしょうか? Baidu Originalについて

オリジナリティは常に大きな問題であり、より広い意味で言えば、インターネットの生態環境はますます悪化し...

効率性の束縛を打ち破るUAI-Trainにより、ARKieは設計ニーズをより深く理解できるようになります

過去2年間で、人工知能(AI)は研究・概念レベルから応用レベルへと徐々に移行し、ますます多くの企業が...

UHIDS はホストのセキュリティ保護を強化する 5 つの新機能を追加しました

ジェムアルトの報告によると、2017年上半期には918件のインターネットセキュリティ侵入が発生し、1...

個人のウェブサイトを宣伝するために何をすべきかについての簡単な話

インターネット関連技術の発達や、オープンソースのウェブサイト構築ソフトウェアやツールの各種公開により...

クラウドコンピューティングのデータ保護状態を改善する方法

現在、ほとんどのデータ保護ソリューションは、オンプレミスのデータ保護インフラストラクチャのコストを削...

#香港: arvixe-月額4ドル/香港/softlayer/1000Mポート/無制限トラフィック

Arvixe は 2003 年から運営されているアメリカの老舗ホスティング会社です。皆さんもよくご存...

マルチクラウドの実現丨Akamai が CDN をベースに新しいクラウド サービスを構築!​

現在、エンタープライズレベルのマルチクラウド戦略の割合が増加しています。最近、Akamai の「ワー...

K8sオフライン展開の説明と実践的な操作

1. 概要Kubernetes は、コンテナ化されたアプリケーションの展開、管理、および操作の自動化...

プライベート クラウド市場: 数年にわたる混乱を経て、今後中国市場を支配するのは誰か?

私は仕事柄、国内のプライベートクラウド市場の発展を注視しており、その市場に参加する栄誉に恵まれてきま...

Google、Gmailと他の製品を統合した統合検索を開始

検索コンテンツの提案には、連絡先、電子メール、スケジュールなどが含まれます。検索結果にはGmailと...

不要なクラウドサービスのコストを削減する方法

初期コストが比較的低いため、ビジネス マネージャーが独自のクラウド予算を管理できる場合もありますが、...