[[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 バージョンを使用します。自分自身と戦わないでください。理由は聞かないでください... 私が使用しているバージョンは以下の通りです。 - ➜ ~ istioctl バージョン
- クライアントバージョン: 1.10.2
- コントロールプレーンバージョン: 1.10.2
- データ プレーン バージョン: 1.10.2 (10 プロキシ)
-
- ➜ ~ minikube バージョン
- minikube バージョン: v1.18.1
- コミット: 511aca80987826051cf1c6527c3da706925f7909
-
- ➜ ~ skaffold バージョン
- バージョン1.29.0
環境構築minikubeを使用してクラスターを作成するエンジンとして hyperv を使用し、メモリ 8192M カップ 4 コアを使用します。これより少ないと istio をプルアップできません。 - ➜ ~ minikube を起動します
また、hyperv で仮想ルーターを作成する必要があります。ここでは内部ネットワークを構築したので、ネットワーク カードの IP を設定することで内部ネットワークのネットワーク セグメントを修正できます。そうしないと、再起動するたびに IP が変更されます。 インターネットへのアクセスを共有するように内部ネットワークを構成します。 スタートアップの成功: - ➜ istio-1.10.2 minikube の起動
- 😄 Microsoft Windows 10 Pro 10.0.19042 ビルド 19042 上の minikube v1.18.1
- 🎉 minikube 1.20.0 が利用可能になりました!ダウンロードはこちら: https://github.com/kubernetes/minikube/releases/tag/v1.20.0
-
- ✨ 既存の構成ファイルに基づいて HyperV ドライバーを使用する
- 👍クラスター minikubeでコントロール プレーン ノード minikube を起動します
- 🔄既存のHyperV VMを再起動する 「ミニキューブ」 ...
- 🐳 Docker 20.10.3 で Kubernetes v1.20.2 を準備中…
- 🔎 Kubernetes コンポーネントを検証しています...
- ▪ イメージ registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v4 (グローバルイメージリポジトリ)を使用する
- ▪ イメージ registry.hub.docker.com/kubernetesui/dashboard:v2.1.0 を使用する
- ▪ イメージ registry.hub.docker.com/kubernetesui/metrics-scraper:v1.0.4 を使用する
- ▪ イメージ registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.2.1 (グローバルイメージリポジトリ)を使用する
- 🌟 有効なアドオン: metrics-server、storage-provisioner、dashboard、 default -storageclass
- 🏄 完了しました! kubectlは「minikube」クラスターを使用するように設定され、 「デフォルト」名前空間 デフォルト
istioをデプロイするistio-system名前空間を作成する - kubectl で名前空間 istio-systemを作成します。
istioをインストールする - istioctl マニフェストを適用
インストールが完了したら、kubectl get svc -n istio-systemコマンドを実行します。 - ➜ ~ kubectl get svc -n istio-system
- 名前タイプ クラスター IP 外部 IP ポート 年齢
- istio-egressgateway ClusterIP 10.105.31.73 <なし> 80/TCP、443/TCP 8d
- istio-ingressgateway ロードバランサー 10.103.61.73 <保留中> 15021:31031/TCP、80:31769/TCP、443:30373/TCP、31400:31833/TCP、15443:32411/TCP 8d
- クラスターIP 10.110.109.205 <なし> 15010/TCP、15012/TCP、443/TCP、15014/TCP 8d
bookinfo を展開するbookinfoデモをデプロイして環境を確認する コマンドを実行 - kubectl ラベル名前空間デフォルトistio-injection=enabled
-
- kubectl apply -f サンプル/bookinfo/platform/kube/bookinfo.yaml
すべてのポッドが起動するのを待った後、アクセス用のbookinfoネットワーク構成を追加します。kubectl apply -f .\samples\bookinfo\networking\bookinfo-gateway.yaml - ➜ istio-1.10.2 kubectl apply -f .\samples\bookinfo\networking\bookinfo-gateway.yaml
-
- gateway.networking.istio.io/bookinfo-gateway が作成されました
-
- virtualservice.networking.istio.io/bookinfo が作成されました
サービスを表示するには、次のコマンドを使用します: kubectl get services - ➜ ~ kubectl サービスを取得する
- 名前タイプ クラスター IP 外部 IP ポート 年齢
- callme-service NodePort 10.106.26.24 <なし> 8080:30101/TCP 8d
- 詳細 ClusterIP 10.110.253.19 <なし> 9080/TCP 8d
- kubernetes ClusterIP 10.96.0.1 <なし> 443/TCP 8d
- 製品ページ ClusterIP 10.96.246.175 <なし> 9080/TCP 8d
- 評価 ClusterIP 10.99.234.109 <なし> 9080/TCP 8d
- レビュー ClusterIP 10.103.177.123 <なし> 9080/TCP 8d
ポッドのステータスを表示する kubectl get pods - ➜ ~ kubectl ポッドを取得する
- 名前準備完了 ステータス 再起動 年齢
- callme-service-v1-76dd76ddcc-znb62 2/2 実行中 0 4 時間 59 分
- callme-service-v2-679db76bbc-m4svm 2/2 実行中 0 4時間59分
- details-v1-79f774bdb9-qk9q8 2/2 実行中 8 8d
- productpage-v1-6b746f74dc-p4xcb 2/2 実行中 8 8d
- ratings-v1-b6994bb9-dlvjm 2/2 ランニング 8 8d
- reviews-v1-545db77b95-sgdzq 2/2 実行中 8 8d
- レビュー-v2-7bf8c9648f-t6s8z 2/2 実行中 8 8d
- reviews-v3-84779c7bbc-4p8hv 2/2 ランニング 8 8d
クラスターの IP とポートを表示する - ➜ ~ kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}'
- 192.168.137.115
-
-
-
- ➜ istio-1.10.2 kubectl get svc istio-ingressgateway -n istio-system
-
- 名前タイプ クラスター IP 外部 IP ポート 年齢
-
- 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 リポジトリを使用してイメージを保存します。 - <ビルド>
- <プラグイン>
- <プラグイン>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <処刑>
- <実行>
- <目標>
- <goal>ビルド情報</goal>
- <goal>再パッケージ化</goal>
- </目標>
- </実行>
- </処刑>
- </プラグイン>
- <プラグイン>
- <groupId>com.google.cloud.tools</groupId>
- <artifactId>jib-maven-plugin</artifactId>
- <バージョン>3.1.1</バージョン>
- <構成>
- <から>
- <画像>127.0.0.1:9001/${プロジェクト アーティファクト ID}:${プロジェクト バージョン}}</画像>
- <認証>
- <ユーザー名>
- xxx
- </ユーザー名>
- <パスワード>
- xxx
- </パスワード>
- </auth>
- </から>
- <allowInsecureRegistries>は true です</allowInsecureRegistries>
- </構成>
- </プラグイン>
- </プラグイン>
- </ビルド>
シンプルなレストをビルドし、ビルド名を表示し、バージョン番号を設定します - オートワイヤード
- ビルドプロパティ ビルドプロパティ;
- @Value( "${VERSION}" )
- プライベート文字列バージョン;
-
- @GetMapping( "/ping" )
- パブリック文字列ping() {
- LOGGER.info( "Ping: name={}, version={}" , buildProperties.getName(), version);
- 戻る 「私はサービスに電話します」 + バージョン;
- }
skaffold.xml を作成して skafflod のイメージをコンパイルし、クラスターに送信して使用します。 - apiバージョン: skaffold/v2alpha1
- 種類: 設定
- 建てる:
- アーティファクト:
- - イメージ: 127.0.0.1:9001/callme-service
- ジブ: {}
- タグポリシー:
- gitコミット: {}
k8sデプロイメント記述k8s/deployment.ymlとアクセス用のサービスを作成する - APIバージョン: アプリ/v1
- 種類: デプロイメント
- メタデータ:
- 名前: callme-service-v1
- 仕様:
- レプリカ: 1
- セレクタ:
- 一致ラベル:
- アプリ: callme-service
- バージョン: v1
- テンプレート:
- メタデータ:
- ラベル:
- アプリ: callme-service
- バージョン: v1
- 仕様:
- コンテナ:
- -名前: callme-service
- イメージ: 127.0.0.1:9001/callme-service
- イメージプルポリシー: IfNotPresent
- ポート:
- - コンテナポート: 8080
- 環境:
- -名前: バージョン
- 値: "v1"
-
- APIバージョン: アプリ/v1
- 種類: デプロイメント
- メタデータ:
- 名前: callme-service-v2
- 仕様:
- レプリカ: 1
- セレクタ:
- 一致ラベル:
- アプリ: callme-service
- バージョン: v2
- テンプレート:
- メタデータ:
- ラベル:
- アプリ: callme-service
- バージョン: v2
- 仕様:
- コンテナ:
- -名前: callme-service
- イメージ: 127.0.0.1:9001/callme-service
- イメージプルポリシー: IfNotPresent
- ポート:
- - コンテナポート: 8080
- 環境:
- -名前: バージョン
- 値: "v2"
-
- APIバージョン: v1
- 種類: サービス
- メタデータ:
- 名前: callme-service
- ラベル:
- アプリ: callme-service
- 仕様:
- タイプ: NodePort
- ポート:
- - ポート: 8080
- 名前: http
- ノードポート: 30101
- セレクタ:
- アプリ: callme-service
istio記述ファイルk8s\istio-rules.yamlを作成します。 - APIバージョン: networking.istio.io/v1beta1
- 種類: 宛先ルール
- メタデータ:
- 名前: callme-service-destination
- 仕様:
- ホスト: callme-service
- サブセット:
- -名前: v1
- ラベル:
- バージョン: v1
- -名前: v2
- ラベル:
- バージョン: v2
- # trafficPolicy: #
- # 接続プール:
- # http:
- # http1最大保留リクエスト数: 1
- # 接続あたりの最大リクエスト数: 1
- # 最大再試行回数: 0
- # 外れ値検出:
- # 連続5xxエラー: 3
- # 間隔: 30秒
- # ベース排出時間: 1分
- # 最大排出率: 100
-
- APIバージョン: networking.istio.io/v1beta1
- 種類: 仮想サービス
- メタデータ:
- 名前: callme-service-route
- 仕様:
- ホスト:
- - コールミーサービス
- http:
- - ルート:
- - 行き先:
- ホスト: callme-service
- サブセット: v2
- 重量: 80
- - 行き先:
- ホスト: callme-service
- サブセット: v1
- 重量: 20
- 再試行:
- 試行回数: 3
- 再試行: ゲートウェイ エラー、接続失敗、ストリーム拒否
- タイムアウト: 0.5秒
- # 障害: #
- # 遅れ:
- # パーセンテージ:
- # 値: 33
- # 固定遅延: 3秒
skaffold を実行してコンパイルし、イメージを送信し、アプリケーションをデプロイします。skaffold run --tail - ➜ callme-service git:(master) ✗ skaffold run
- タグを生成しています...
-
- - 127.0.0.1:9001/callme-service -> 127.0.0.1:9001/callme-service:e9c731f-dirty
- キャッシュを確認しています...
- - 127.0.0.1:9001/callme-service: ローカルで見つかりました
- テストを開始しています...
- デプロイメントで使用されるタグ:
- - 127.0.0.1:9001/callme-service -> 127.0.0.1:9001/callme-service:60f1bf39367673fd0d30ec1305d8a02cb5a1ed43cf6603e767a98dc0523c65f3
- デプロイを開始しています...
- - deploy.apps/callme-service-v1 が設定されている
- - deploy.apps/callme-service-v2 が設定されている
- -service/callme-service が設定されました
- - destinationrule.networking.istio.io/callme-service-destination が設定されました
- - virtualservice.networking.istio.io/callme-service-route が設定されました
- 展開が安定するのを待っています...
- - デプロイメント/callme-service-v1:初期化コンテナ istio-init の起動を待機中
- - pod/callme-service-v1-76dd76ddcc-znb62: initコンテナ istio-init の起動を待機しています
- - デプロイメント/callme-service-v2:初期化コンテナ istio-init の起動を待機中
- - pod/callme-service-v2-679db76bbc-m4svm:初期化コンテナ istio-initの開始を待機しています
- - Deployment/callme-service-v2 が準備完了です。 [1/2 の展開はまだ保留中]
- -deployment/callme-service-v1 の準備ができました。
- 展開は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 |