GKEのデプロイ時に中の人がやってることを絵にしてみた
GKEを触り始めて日が浅いですが、ちょっとだけ、GKE とか Kubernetes の仕組みに興味を持ちました。
でも、文字だけだと、イメージしづらい!
、、、というわけで、以下の公式チュートリアルに沿って、実際にどんな動きをしているか、というのを自分なりに絵にしてみました。
チュートリアル:コンテナ化されたウェブアプリのデプロイ
ここ違うよ!とかあったらぜひご指摘いただけたら嬉しいです!
前提
Container Registry にコンテナがUPされていること
→実際にGKEにデプロイされるタイミングでどんなことが起こっているか、をわかりやすくしたかっただけなので。実際にローカルのコンテナから動かしてみたい、という方はチュートリアルをご参照くださいませ。
コマンドに関してある程度の知識があればなおOK
→ぶっちゃけ、あんまり知らなくてもいいのですけど、説明があっさりしているところもあるかと思いますので、簡単に何やってるかわかると読みやすいかも。。。(詳細は上記チュートリアルを参考にしていただけるといいかもです。
1. クラスタの作成
$ gcloud container clusters create hello-cluster --num-nodes=3
$ gcloud container clusters create hello-cluster --num-nodes=3
gcloud
: GKEが実行するコマンドで、クラスタの操作を行います。
(ここではクラスタ作成)
--num-nodes
:作成するノードの数を設定するオプション。
ノードは、GCEインスタンス として作成されます。
クラスタが作成されると、ノードの他にクラスタマスターも作成されます。
クラスタマスターについては、公式に以下の通りに記載されています。
クラスタは少なくとも 1 つのクラスタ マスターと、ノードと呼ばれる複数のワーカーマシンで構成されます。
クラスタ マスター
クラスタ マスターは、Kubernetes API サーバー、スケジューラ、コアリソース コントローラといった Kubernetes コントロール プレーンのプロセスを実行します。マスターのライフサイクル管理は GKE が行い、クラスタの作成または削除のタイミングを管理します。クラスタ マスター上で実行される Kubernetes バージョンのアップグレードも、管理の対象に含まれます。アップグレードは GKE が自動的に行いますが、自動スケジュールに先立って手動でアップグレードすることもできます。
<コマンドでやってること>
① GKE : クラスタ(クラスタマスター)の作成
② GKE : クラスタ内に指定された数のノードを作成
ちなみに、以下のコマンドを実行すると、ノード分のGCEインスタンスが作成されていることが確認できます。
$ gcloud compute instances list
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS
gke-hello-cluster-default-pool-xxxxxxxx-96xs us-central1-b n1-standard-1 10.128.0.4 35.225.xxx.xxx RUNNING
gke-hello-cluster-default-pool-xxxxxxxx-pctm us-central1-b n1-standard-1 10.128.0.3 35.223.xxx.xxx RUNNING
gke-hello-cluster-default-pool-xxxxxxxx-r8dr us-central1-b n1-standard-1 10.128.0.2 35.193.xxx.xxx RUNNING
2.アプリケーションのデプロイ
2-1.Deploymentの作成
下記の kubectl run コマンドを実行すると、Kubernetes がクラスタに hello-web という名前の Deployment を作成します。Deployment は、レプリカと呼ばれるアプリケーションの複数のコピーを管理し、クラスタ内の個々のノード上で実行するようにスケジューリングします。今回の場合、Deployment ではアプリケーションの 1 つのポッドのみが実行されます。
$ kubectl create deployment hello-web --image=gcr.io/${PROJECT_ID}/hello-app:v1
下記の kubectl run コマンドを実行すると、Kubernetes がクラスタに hello-web という名前の Deployment を作成します。Deployment は、レプリカと呼ばれるアプリケーションの複数のコピーを管理し、クラスタ内の個々のノード上で実行するようにスケジューリングします。今回の場合、Deployment ではアプリケーションの 1 つのポッドのみが実行されます。
$ kubectl create deployment hello-web --image=gcr.io/${PROJECT_ID}/hello-app:v1
<コマンドでやってること>
① クラスタマスター: --image
にて指定された dockerイメージ を使って POD を作成
② クラスタマスター: ①で作成した POD を利用して Deployment を作成
③ Deployment : POD を各ノードにばらまく
2-2.インターネットへの公開
デフォルトの状態だと、GKEで動作するコンテナは外部からアクセスできません。
理由はExternalIP(外部IP)が公開されていないから。
というわけで、以下のコマンドを実行します。
kubectl expose deployment hello-web --type=LoadBalancer --port 80 --target-port 8080
上記の kubectl expose コマンドは、アプリケーションのポッドにネットワーキングと IP サポートを提供する Service リソースを作成します。GKE は、アプリケーションの外部 IP とロードバランサ(課金対象)を作成します。
--port
フラグには、フラグはロードバランサで構成されたポート番号を指定します。--target-port
フラグには、hello-app コンテナがリッスンするポート番号を指定します。>
<コマンドでやってること>
① クラスタマスター:Service の作成
② GKE : ExternalIP を取得し、Service に設定
③ GKE : Service に LoadBalancer作成
作成したserviceの内容を確認したいときは以下のコマンドで。
$ kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-web 10.3.251.122 203.0.xx.xx 80:30877/TCP 3d
①「http://302.0.xx.xx」 にアクセスする。
→外部からのportは 80
②Serviceがリクエストの振り分けを行う。
→クラスタ内部のアクセスportは 8080
(podにてアクセスポートが8080に指定されている)
まとめ
というわけで、中でどんなことが行われているのか、を理解したくて、ドキュメント読みつつ絵にしてみたわけですが。
実はクラスタマスターが結構仕事している(GKEだけだとあまり意識しないけど)
クラスタの作成とかクラスタに関するところは
gcloud
コマンドを使うけど、クラスタ内部の操作はクラスタマスターが実行するのでkubectl
を使う内部では Deployment と Service が仕事してる
PODの管理はDeploymentの仕事
ネットワーク周りはServiceの仕事
ってことが今回の「へぇ〜」でした。
ちなみに、実際のデプロイだと、Deployment、Service共にyamlを作成してそこから作成することが多そうです。
色々調べていくと奥が深そうですが、仕組みを知るとなんでこの時にこのコマンド?とか、挙動がおかしい時に「ここが怪しいかも」とあたりをつけたりできそうなので、いろんな動きを調べてみたいなーと思いました。
なので、「正確には〜」とか「ここ違う」のご指摘大歓迎です!!
参考
Author And Source
この問題について(GKEのデプロイ時に中の人がやってることを絵にしてみた), 我々は、より多くの情報をここで見つけました https://qiita.com/anyanco/items/7e3b3a7028503a5b67a4著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .