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

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

[[419537]]

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

この記事では、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/ https://k3s.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名前空間を作成する

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

istioをインストールする

  1. 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. </ビルド>

シンプルなレストをビルドし、ビルド名を表示し、バージョン番号を設定します

  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. apiバージョン: skaffold/v2alpha1
  2. 種類: 設定
  3. 建てる:
  4. アーティファクト:
  5. - イメージ: 127.0.0.1:9001/callme-service
  6. ジブ: {}
  7. タグポリシー:
  8. 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

<<:  分散ロックに関する10,000語の記事

>>:  クラウド データベースの選択に必読: 要件を整理するにはどうすればよいでしょうか?

推薦する

Capital Online の IDC をクラウドに移行する方法

[51CTO.com からのオリジナル記事] インターネット データ センター (IDC) とは、サ...

4日間で新しいサイトを完璧に組み込むためのヒント

もともと、これらは私が自分で発見してまとめた小技であり、私も達人から学んで秘密にしておきたいと思って...

layerhost: 月額 4.99 ドル、ロサンゼルス VPS、PCCW、1G メモリ/1 コア/70g SSD/2T トラフィック

レイヤーホストのVPSは、当初の月額20ドルから現在の人気価格まで、新たな変革を迎えました。依然とし...

百度のアルゴリズム異常は「砂糖で覆われた弾丸」の疑い

みなさんこんにちは。私は梁磊です。百度はここ数日、異常な動きを見せています。皆さんも慣れていると思い...

SEOに関するジョーク: UE

UE (ユーザー エクスペリエンス) は、多くの SEO 担当者が日々話題にしているトピックであり、...

ポスト SEO 時代において、トラフィックを節約するために何ができるでしょうか?

SEOをご存知ですか?この言葉は、2007年にウェブマスターコミュニティでよく使われる言葉になりまし...

デディストリビューション - 3USD/80gDDoS 保護/4g メモリ/20gSSD/1T トラフィック/英国

dedistation.com の英国データセンターの特別な VPS: solusvm パネル、1G...

ウェブサイトに掲載されてから3日以内にホームページに表示されるキーワードによって引き起こされた思考

筆者は、オンラインになった日に含まれていたウェブサイトを持っており、その後頻繁にKステーションされて...

ロシアのホスティングプロバイダー: jino.ru、無制限のトラフィックの VPS が月額 11 元から

jino.ru は、2003 年から運営されているロシアのホスティング プロバイダーです。主な事業は...

ウェブサイトの3大タグの問題

検索エンジン最適化を行うときは、ウェブサイトの 3 つの主要なタグ、つまりタイトル、キーワード、説明...

hostkvm: 香港 VPS (メガデータセンター)、月額 6.8 ドル、2G メモリ/1 コア/40g SSD/500G トラフィック、300M 最適化/1Gbps 国際帯域幅

hostkvm は、複数の ISP/POP に接続され、香港および海外の顧客を対象とした新しい香港 ...

imidc 香港データセンターの BGP ネットワークの独立サーバーの簡単な評価 (30M 帯域幅)

現在、imidcでは香港サーバー(国際BGP)、日本サーバー(cn2+BGP)、台湾サーバー(BGP...

クラウドアーキテクチャのSLAの簡単な分析

[[318684]]クラウド サービスによりエンタープライズ アプリケーションのアーキテクチャが再形...

racknerd: 米国西海岸のサンノゼ VPS プロモーション、最低 $11.88/年

今月(4月)、racknerd は米国西海岸のサンノゼ データ センター専用の特別プロモーションを開...

Qvod CEO 王欣の「ピザ変革」は、苦難を乗り越えて経営をより明確にする

中小企業が「リーダー崇拝」病にかかっている場合、どうやって治すのか?ピザを分けるというアイデアに触発...