クラウドネイティブの初体験: K8s への Springboot アプリケーションのデプロイ

クラウドネイティブの初体験: K8s への Springboot アプリケーションのデプロイ

[[417286]]

「クラウド ネイティブ」に興味はあるけれど、どこから始めればいいか分からないですか?

この記事では、window 環境で k8s ベースの istio 環境を構築し、skaffold を介してイメージ構築とクラスター環境へのプロジェクト展開を完了します。実際、実験環境が限られている人であれば、特定のクラウド上の「バースト パフォーマンス インスタンス」 3 つを全額支払い、一晩試してみることもできます。これは、コーヒー 1 杯分の料金にすぎません。

はい、始めましょう!

実行プロセス

全体的なプロセスを下の図に示します。 Skaffold+jib は、開発されたアプリケーションをイメージにパッケージ化し、ローカル ウェアハウスに送信し、アプリケーションをクラスターにデプロイするために使用されます。異なるアプリケーション バージョンをシミュレートし、アクセス ウェイトを 20%:80% に設定するために、k8s に 2 つのポッドをデプロイします。

環境の選択

以前、minikube について詳しく紹介した記事を書きました。この実験を始めた当初は、kind を使うことの便利さにハマっていました。クラスターは docker 上に直接デプロイできるので、とても便利です。しかし、K8Sに対する理解が不十分だったため、後から多くの問題に遭遇しました。したがって、新しい友達には minikube を使用することをお勧めします。 k3s と RKE はどちらも複数の仮想マシンが必要です。マシンのパフォーマンスのため、このソリューションは現時点では考慮されていません。

次の表は、選択を容易にするために、minikube、kind、k3s のデプロイメント環境とサポートを比較したものです。

ミニキューブ 親切 k3s
ランタイム 仮想マシン 容器 ネイティブ
サポートされているアーキテクチャ AMD64 AMD64 AMD64、ARMv7、ARM64
サポートされているコンテナランタイム Docker、CRI-O、containerd、gvisor ドッカー Docker、コンテナ
起動時間 初期/後 5:19 / 3:15 2:48 / 1:06 0:15 / 0:15
メモリ要件 2GB 8GB (Windows、MacOS) 512MB
ルートが必要ですか? いいえ いいえ はい(rootless は実験的です)
マルチクラスタサポート はい はい いいえ(コンテナを使用することで実現可能)
マルチノードサポート いいえ はい はい
プロジェクトページ 詳細はこちら https://kind.sigs.k8s.io/

[1] 表はhttp://jiagoushi.pro/minikube-vs-kind-vs-k3s-what-should-i-useから引用したものです。

Docker Desktop には特別な要件はありません。残りはお好みに合わせてお使いください。 minikube についてまだ何か言う必要があります。最新の coredns を使用しないでください。修正する魔法がない限り、動作しません。それ以外の場合は、Alibaba によってコンパイルされた minikube バージョンを使用します。自分自身と戦わないでください。理由は聞かないでください...

私が使用しているバージョンは以下の通りです。

  1. ➜ ~ istioctl バージョン
  2. クライアントバージョン: 1.10.2
  3. コントロールプレーンバージョン: 1.10.2
  4. データ プレーン バージョン: 1.10.2 (10 プロキシ)
  5.  
  6. ➜ ~ minikube バージョン
  7. minikube バージョン: v1.18.1
  8. コミット: 511aca80987826051cf1c6527c3da706925f7909
  9.  
  10. ➜ ~ skaffold バージョン
  11. バージョン1.29.0

環境構築

minikubeを使用してクラスターを作成する

エンジンとして hyperv を使用し、メモリ 8192M カップ 4 コアを使用します。これより少ないと istio をプルアップできません。

  1. ➜ ~ minikube を起動します--image-mirror-country='cn' --registry-mirror=https://hq0igpc0.mirror.aliyuncs.com --vm-driver="hyperv" --memory=8192 --cpus=4 --hyperv-virtual-switch="minikubeSwitch" --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers  

また、hyperv で仮想ルーターを作成する必要があります。ここでは内部ネットワークを構築したので、ネットワーク カードの IP を設定することで内部ネットワークのネットワーク セグメントを修正できます。そうしないと、再起動するたびに IP が変更されます。

インターネットへのアクセスを共有するように内部ネットワークを構成します。

スタートアップの成功:

  1. ➜ istio-1.10.2 minikube の起動
  2. 😄 Microsoft Windows 10 Pro 10.0.19042 ビルド 19042 上の minikube v1.18.1
  3. 🎉 minikube 1.20.0 が利用可能になりました!ダウンロードはこちら: https://github.com/kubernetes/minikube/releases/tag/v1.20.0
  4.  
  5. ✨ 既存の構成ファイルに基づいて HyperV ドライバーを使用する
  6. 👍クラスター minikubeコントロール プレーン ノード minikube を起動します
  7. 🔄既存のHyperV VM再起動する  「ミニキューブ」 ...
  8. 🐳 Docker 20.10.3 で Kubernetes v1.20.2 を準備中…
  9. 🔎 Kubernetes コンポーネントを検証しています...
  10. ▪ イメージ registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v4 (グローバルイメージリポジトリ)を使用する
  11. ▪ イメージ registry.hub.docker.com/kubernetesui/dashboard:v2.1.0 を使用する
  12. ▪ イメージ registry.hub.docker.com/kubernetesui/metrics-scraper:v1.0.4 を使用する
  13. ▪ イメージ registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.2.1 (グローバルイメージリポジトリ)を使用する
  14. 🌟 有効なアドオン: metrics-server、storage-provisioner、dashboard、 default -storageclass
  15. 🏄 完了しました! kubectl「minikube」クラスターを使用するように設定され   「デフォルト」名前空間 デフォルト 

istioをデプロイする

istio-system名前空間を作成する

kubectl で名前空間 istio-system を作成します。

istioをインストールする

istioctl マニフェストを適用 --set profile=demo

インストールが完了したら、kubectl get svc -n istio-systemコマンドを実行します。

  1. ➜ ~ kubectl get svc -n istio-system
  2. 名前タイプ クラスター IP 外部 IP ポート 年齢
  3. istio-egressgateway ClusterIP 10.105.31.73 <なし> 80/TCP、443/TCP 8d
  4. istio-ingressgateway ロードバランサー 10.103.61.73 <保留中> 15021:31031/TCP、80:31769/TCP、443:30373/TCP、31400:31833/TCP、15443:32411/TCP 8d
  5. クラスターIP 10.110.109.205 <なし> 15010/TCP、15012/TCP、443/TCP、15014/TCP 8d

bookinfo を展開する

bookinfoデモをデプロイして環境を確認する

コマンドを実行

  1. kubectl ラベル名前空間デフォルトistio-injection=enabled
  2.  
  3. kubectl apply -f サンプル/bookinfo/platform/kube/bookinfo.yaml

すべてのポッドが起動するのを待った後、アクセス用のbookinfoネットワーク構成を追加します。kubectl apply -f .\samples\bookinfo\networking\bookinfo-gateway.yaml

  1. ➜ istio-1.10.2 kubectl apply -f .\samples\bookinfo\networking\bookinfo-gateway.yaml
  2.  
  3. gateway.networking.istio.io/bookinfo-gateway が作成されました
  4.  
  5. virtualservice.networking.istio.io/bookinfo が作成されました

サービスを表示するには、次のコマンドを使用します: kubectl get services

  1. ➜ ~ kubectl サービスを取得する
  2. 名前タイプ クラスター IP 外部 IP ポート 年齢
  3. callme-service NodePort 10.106.26.24 <なし> 8080:30101/TCP 8d
  4. 詳細 ClusterIP 10.110.253.19 <なし> 9080/TCP 8d
  5. kubernetes ClusterIP 10.96.0.1 <なし> 443/TCP 8d
  6. 製品ページ ClusterIP 10.96.246.175 <なし> 9080/TCP 8d
  7. 評価 ClusterIP 10.99.234.109 <なし> 9080/TCP 8d
  8. レビュー ClusterIP 10.103.177.123 <なし> 9080/TCP 8d

ポッドのステータスを表示する kubectl get pods

  1. ➜ ~ kubectl ポッドを取得する
  2. 名前準備完了 ステータス 再起動 年齢
  3. callme-service-v1-76dd76ddcc-znb62 2/2 実行中 0 4 時間 59 分
  4. callme-service-v2-679db76bbc-m4svm 2/2 実行中 0 4時間59分
  5. details-v1-79f774bdb9-qk9q8 2/2 実行中 8 8d
  6. productpage-v1-6b746f74dc-​​p4xcb 2/2 実行中 8 8d
  7. ratings-v1-b6994bb9-dlvjm 2/2 ランニング 8 8d
  8. reviews-v1-545db77b95-sgdzq 2/2 実行中 8 8d
  9. レビュー-v2-7bf8c9648f-t6s8z 2/2 実行中 8 8d
  10. reviews-v3-84779c7bbc-4p8hv 2/2 ランニング 8 8d

クラスターの IP とポートを表示する

  1. ➜ ~ kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}'  
  2. 192.168.137.115
  3.  
  4.  
  5.  
  6. ➜ istio-1.10.2 kubectl get svc istio-ingressgateway -n istio-system
  7.  
  8. 名前タイプ クラスター IP 外部 IP ポート 年齢
  9.  
  10. istio-ingressgateway ロードバランサー 10.110.228.32 <保留中> 15021:32343/TCP、80:30088/TCP、443:31869/TCP、31400:32308/TCP、15443:32213/TCP 3分17秒

次のアドレスにアクセスしてください: http://192.168.137.115:31769/productpage

bookinfo が正常に展開されました。次にアプリケーションを作成します。

アプリを構築する

一般的な Springboot プロジェクトをビルドし、コンパイル プラグインを追加します。ここでは、ローカルの Docker ウェアハウスを使用してイメージを保存します。

  1. <ビルド>
  2. <プラグイン>
  3. <プラグイン>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-maven-plugin</artifactId>
  6. <処刑>
  7. <実行>
  8. <目標>
  9. <goal>ビルド情報</goal>
  10. <goal>再パッケージ化</goal>
  11. </目標>
  12. </実行>
  13. </処刑>
  14. </プラグイン>
  15. <プラグイン>
  16. <groupId>com.google.cloud.tools</groupId>
  17. <artifactId>jib-maven-plugin</artifactId>
  18. <バージョン>3.1.1</バージョン>
  19. <構成>
  20. <から>
  21. <画像>127.0.0.1:9001/${プロジェクト アーティファクト ID}:${プロジェクト バージョン}}</画像>
  22. <認証>
  23. <ユーザー名>
  24. xxx
  25. </ユーザー名>
  26. <パスワード>
  27. xxx
  28. </パスワード>
  29. </auth>
  30. </から>
  31. <allowInsecureRegistries>は true です</allowInsecureRegistries>
  32. </構成>
  33. </プラグイン>
  34. </プラグイン>
  35. </ビルド>

シンプルな REST をビルドし、ビルド名と構成のバージョン番号を表示します。

  1. オートワイヤード
  2. ビルドプロパティ ビルドプロパティ;
  3. @Value( "${VERSION}" )
  4. プライベート文字列バージョン;
  5.  
  6. @GetMapping( "/ping" )
  7. パブリック文字列ping() {
  8. LOGGER.info( "Ping: name={}, version={}" , buildProperties.getName(), version);
  9. 戻る  「私はサービスに電話します」 + バージョン;
  10. }

skaffold.xml を作成して、skafflod のイメージをコンパイルし、クラスターに送信して使用します。

  1. 種類: 設定
  2. 建てる:
  3. アーティファクト:
  4. - イメージ: 127.0.0.1:9001/callme-service
  5. ジブ: {}
  6. タグポリシー:
  7. gitコミット: {}

k8s デプロイメント記述 k8s/deployment.yml とアクセス用のサービスを作成します。

  1. APIバージョン: アプリ/v1
  2. 種類: デプロイメント
  3. メタデータ:
  4. 名前: callme-service-v1
  5. 仕様:
  6. レプリカ: 1
  7. セレクタ:
  8. 一致ラベル:
  9. アプリ: callme-service
  10. バージョン: v1
  11. テンプレート:
  12. メタデータ:
  13. ラベル:
  14. アプリ: callme-service
  15. バージョン: v1
  16. 仕様:
  17. コンテナ:
  18. -名前: callme-service
  19. イメージ: 127.0.0.1:9001/callme-service
  20. イメージプルポリシー: IfNotPresent
  21. ポート:
  22. - コンテナポート: 8080
  23. 環境:
  24. -名前: バージョン
  25. 値: "v1"  
  26. ---  
  27. APIバージョン: アプリ/v1
  28. 種類: デプロイメント
  29. メタデータ:
  30. 名前: callme-service-v2
  31. 仕様:
  32. レプリカ: 1
  33. セレクタ:
  34. 一致ラベル:
  35. アプリ: callme-service
  36. バージョン: v2
  37. テンプレート:
  38. メタデータ:
  39. ラベル:
  40. アプリ: callme-service
  41. バージョン: v2
  42. 仕様:
  43. コンテナ:
  44. -名前: callme-service
  45. イメージ: 127.0.0.1:9001/callme-service
  46. イメージプルポリシー: IfNotPresent
  47. ポート:
  48. - コンテナポート: 8080
  49. 環境:
  50. -名前: バージョン
  51. 値: "v2"  
  52. ---  
  53. APIバージョン: v1
  54. 種類: サービス
  55. メタデータ:
  56. 名前: callme-service
  57. ラベル:
  58. アプリ: callme-service
  59. 仕様:
  60. タイプ: NodePort
  61. ポート:
  62. - ポート: 8080
  63. 名前: http
  64. ノードポート: 30101
  65. セレクタ:
  66. アプリ: callme-service

istio 記述ファイル k8s\istio-rules.yaml を作成します。

  1. APIバージョン: networking.istio.io/v1beta1
  2. 種類: 宛先ルール
  3. メタデータ:
  4. 名前: callme-service-destination
  5. 仕様:
  6. ホスト: callme-service
  7. サブセット:
  8. -名前: v1
  9. ラベル:
  10. バージョン: v1
  11. -名前: v2
  12. ラベル:
  13. バージョン: v2
  14. # trafficPolicy: # --- DestinationRule にサーキットブレーカーを追加できるようにする 
  15. # 接続プール:
  16. # http:
  17. # http1最大保留リクエスト数: 1
  18. # 接続あたりの最大リクエスト数: 1
  19. # 最大再試行回数: 0
  20. # 外れ値検出:
  21. # 連続5xxエラー: 3
  22. # 間隔: 30秒
  23. # ベース排出時間: 1分
  24. # 最大排出率: 100
  25. ---  
  26. APIバージョン: networking.istio.io/v1beta1
  27. 種類: 仮想サービス
  28. メタデータ:
  29. 名前: callme-service-route
  30. 仕様:
  31. ホスト:
  32. - コールミーサービス
  33. http:
  34. - ルート:
  35. - 行き先:
  36. ホスト: callme-service
  37. サブセット: v2
  38. 重量: 80
  39. - 行き先:
  40. ホスト: callme-service
  41. サブセット: v1
  42. 重量: 20
  43. 再試行:
  44. 試行回数: 3
  45. 再試行: ゲートウェイ エラー、接続失敗、ストリーム拒否
  46. タイムアウト: 0.5秒
  47. # 障害: # --- ルートに障害を注入できるようにする 
  48. # 遅れ:
  49. # パーセンテージ:
  50. # 値: 33
  51. # 固定遅延: 3秒

skaffold を実行してコンパイルし、イメージを送信し、アプリケーション skaffold run --tail をデプロイします。

  1. ➜ callme-service git:(master) ✗ skaffold run --tail  
  2. タグを生成しています...
  3.  
  4. - 127.0.0.1:9001/callme-service -> 127.0.0.1:9001/callme-service:e9c731f-dirty
  5. キャッシュを確認しています...
  6. - 127.0.0.1:9001/callme-service: ローカルで見つかりました
  7. テストを開始しています...
  8. デプロイメント使用されるタグ:
  9. - 127.0.0.1:9001/callme-service -> 127.0.0.1:9001/callme-service:60f1bf39367673fd0d30ec1305d8a02cb5a1ed43cf6603e767a98dc0523c65f3
  10. デプロイを開始しています...
  11. - deploy.apps/callme-service-v1 が設定されている
  12. - deploy.apps/callme-service-v2 が設定されている
  13. -service/callme-service が設定されました
  14. - destinationrule.networking.istio.io/callme-service-destination が設定されました
  15. - virtualservice.networking.istio.io/callme-service-route が設定されました
  16. 展開が安定する待っています...
  17. - デプロイメント/callme-service-v1:初期化コンテナ istio-init の起動待機
  18. - pod/callme-service-v1-76dd76ddcc-znb62: initコンテナ istio-init の起動を待機ます
  19. - デプロイメント/callme-service-v2:初期化コンテナ istio-init の起動待機
  20. - pod/callme-service-v2-679db76bbc-m4svm:初期化コンテナ istio-init開始待機ています
  21. - Deployment/callme-service-v2 が準備完了です。 [1/2 の展開はまだ保留中]
  22. -deployment/callme-service-v1 の準備ができました。
  23. 展開は45.671秒安定しました

結果を表示するには、次のサイトにアクセスしてください:

この時点で、主要な環境の構築は基本的に完了しています。クラウドネイティブに対応して、少しは理解したような気がしますが、理解していないようです。まだ理解すべきことがたくさんあります。このシリーズは続きます。皆様とコミュニケーションを取っていただければ幸いです。また、フォローや転送も大歓迎です。

参考リンク;

https://piotrminkowski.com/2020/02/14/local-java-development-on-kubernetes/

https://pklinker.medium.com/integrating-a-spring-boot-application-into-an-istio-service-mesh-a55948666fd

https://blog.csdn.net/xixingzhe2/article/details/88537038

https://blog.csdn.net/chenleiking/article/details/86716049

この記事はWeChat公式アカウント「Qisi Miaoxiang」から転載したものです。下のQRコードからフォローできます。この記事を転載する場合は、Qisi Miaoxiang公式アカウントにご連絡ください。

<<:  クラウドネイティブセキュリティのための5つのヒント

>>:  Pythonの仮想環境は非常に簡単です。これを読めばすぐにわかるでしょう。

推薦する

企業サイト内で3つのキーワードを連携させ、コンバージョン率を向上

キーワードを選択した後、それに応じてキーワードを整理し始めることがよくあります。キーワードのレイアウ...

Bilibiliはなぜ新規ユーザーを引き付けるために赤い封筒を使い始めたのでしょうか?

ビリビリのコミュニティ生態系に関する最近の騒動にもかかわらず、ビリビリは拡大のペースを緩めるつもりは...

Rushmail: 企業のマーケティングデータを機密に保つにはどうすればいいですか?一括メールプラットフォームの操作ログの分析

月給5,000~50,000のこれらのプロジェクトはあなたの将来ですインターネット時代の発展に伴い、...

プロバイダー: スロバキア VPS、月額 10 ユーロ、1G メモリ/1 コア/20g ハードディスク/1Gbps 帯域幅 (トラフィック無制限)

2010 年に設立されたスロバキアの商人である profvds は、HVM 仮想化、1Gbps の帯...

液浸冷却と AIML 統合がエッジ コンピューティングに革命をもたらす

急速に進化する今日のテクノロジー環境では、人工知能 (AI) と機械学習 (ML) とエッジ コンピ...

オンライン音楽は7月以降に完全有料化される見込みで、中小規模の音楽サイトが影響を受ける

北京ビジネスデイリー(記者 江夢偉)現在、ウェブサイトやその他の配信チャネルでは音楽の著作権侵害が依...

越境電子商取引の生死に関わる危機

最近、業界関係者が越境電子商取引について語るとき、避けて通れない話題がアマゾンの「店舗閉鎖の波」だ。...

どのようなタイトルが訪問者を本当に惹きつけクリックさせるのかの解釈例

私がSEO業界に入った当初は、タイトルを書くときにキーワードの書き方しか知らなかったことを覚えていま...

ライムウェーブはどうですか?シアトルのライムウェーブの無制限トラフィックVPSの簡単なレビュー

ライムウェーブはどうですか? Limewaveは最近とても人気がありますが、これはおそらくブラックフ...

2021 年に注目すべき 5 つのオープンソース Kubernetes プロジェクト

オープンソース プロジェクトにより、Kubernetes はさらに強力になります。 Java、可観測...

ウェブサイトをリアルタイムで更新できるリアルタイムテクノロジーが1億ドルの投資を受ける

数日前、どんなウェブサイトが「リアルタイム」と呼べるのかと尋ねられました。 Weibo の「XX 件...

調査によると、企業の80%がクラウドコンピューティングに過剰に支出している

クラウド コンピューティング最適化サービス プロバイダーの Virtana の委託を受け、調査会社 ...

美成の「Kステーションゲート」続編:コメディーな結末、美成インターネットの危機対応能力は称賛に値する

1月10日、筆者は「美城K駅事件全貌」と題する記事を執筆し、事件の詳細を報道し、今回の事件で美城イン...

ポストSEO時代の人気のないロングテールキーワードのチャンス

2007年頃まで、SEOでお金を稼ぐのはとても簡単でした。当時は、キーワードスタッキングや外部リンク...

タオ・シャオカイ:私たちがやっていることは、結局のところユーザーエクスペリエンスに関することです

以前、私はブログやウェブサイトに意味を持たせる必要があると考えていました。多くの先輩に相談した後、よ...