GKEの使いかたがわからないので、
GKEを使ってwebアプリケーションサーバーを立ててみました!
ついでに、k8sの使い方も忘れたので復習でメモたくさん書いてます。
手順
- GCPコンソールにログインをし、Kubernetes Engine APIを「有効にする」
- CloudShellを起動する。
- gcloudコマンドのプロジェクトを設定する
$ gcloud config set project {PROJECT ID}
- clusterを作成する
$ gcloud container clusters create-auto {CLUSTER NAME} --location=us-central1
今回はCLUSTER NAME
を「test-web-server」にしたので、下記のようにclusterが作成されていることを確認できました。
5. clusterと外部からやり取りが行えるように、資格情報を取得します。
$ gcloud container clusters get-credentials {CLUSTER NAME} --location us-central1
上記のコマンドを打つと、デフォルトでkubectl
コマンドのconfigに資格情報が保存されます。
下記のコマンドを打って確認することができます。
$ cat $HOME/.kube/config
apiVersion: v1
clusters: # 接続可能なクラスタの一覧
- cluster:
certificate-authority-data: {CAデータ}
server: {クラスタサーバーUR}
name: {クラスタ名}
contexts: # 利用可能なcontextの一覧
- context:
cluster: {クラスタ名}
user: {ユーザー名}
name: {クラスタ名}
current-context: {ファイル位置} # 接続時に利用されるcontext
kind: Config
preferences: {}
users: # クラスタに接続可能なユーザー一覧
- name: gke_test-gcp-389922_us-central1_test-web-server # ユーザー名
user:
exec: # 接続の際に実行するコマンドの設定。
apiVersion: client.authentication.k8s.io/v1beta1
command: gke-gcloud-auth-plugin
installHint: Install gke-gcloud-auth-plugin for use with kubectl by following
https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke # コマンドが実行される際に表示されるメッセージ。オプション。
provideClusterInfo: true # 大きなCAデータが含まれる可能性があるクラスター情報の場合、exec実行をKUBERENETES_EXEC_INFO環境変数の一部として設定するか否か。
※kubectl
とは:k8sクラスタのAPIサーバーと通信するためのコマンドラインツール。
6. アプリをデプロイします。
Dockerのイメージ(Dockerコンテナパッケージングされたアプリケーションのイメージ)をデプロイできます。今回は、googleが提供しているサンプルアプリのイメージをデプロイしました。
$ kubectl create deployment {WORKLOAD NAME} --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
WORKLOAD NAME
を「test-web-app」としたので、下記のようにコンソールで作成されたのを確認できました。
※K8sのDeployment
とは...?
Deploymentを行うと、Kubernetesが指定のアプリケーションのインスタンスを作成し、更新する方法を指示できます。流れは以下の通りです。
1: ノードで実行したい、コンテナパッケージングされたアプリのイメージと、レプリカの数を指定してDeploymentを行います。
2:Deployment後、KubernetesマスターはDeploymentで指定されていたアプリケーションインスタンスを作成し、クラスタ内の個々のノードで実行するように設定します。
3:アプリケーションインスタンスが作成されると、Kuberbetes Deoloymentコントローラは、それらのインスタンスを継続的に監視します。インスタンスをホストしているノードが停止、削除された場合、Deploymentコントローラはそのインスタンスをクラスタ内の別のノード上のインスタンスと置き換えます。
※ GKEのワークロード
というのは?
Kubernetesシステムを使用して、Kuberbetesコントローラオブジェクト(上記のDeploymentで行われる一環のこと)を作成して、管理できます。Kubernatesではコントローラと言われている部分。
- Serviceを作成し、アプリケーションを外部に公開する
$ kubectl expose deployment {WORKLOAD NAME} --type LoadBalancer --port 80 --target-port 8080
LoadBalancerのComputeEngineを立てて、インターネット公開用ポートを80に設定。アプリケーションのポート8080にルーティングするように設定してServiceを作成することで、アプリケーションを外部トラフィックへ公開できます。
下記のように、コンソールでサービス公開が設定されていることが確認できます。
8. 実行中のPodを検査する
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
{POD NAME} 1/1 Running 0 60m
動いていることが確認できましたが、
Podとはなんでしょうか?
※Podとは...?
Podは、1つまたは複数のアプリケーションコンテナを内包するストレージ、リソース、一つのIPアドレスを共有する空間。Pod内のアプリケーション同士は「localhost」で通信ができるというのがイメージつきやすい。ストレージは共有ボリュームをPod内のコンテナ同士で共有できる。
9. 外部から動作確認を行う
Serviceのエンドポイントを叩くと、公開されていることが確認できます。
できました。
イメージでまとめるとこんな感じ?
次に気になること
わからないことがまだまだあるので、次は以下を調べたいと思います。
- どうやって、Pod内に複数コンテナデプロイできるか
- Node内にどうやって複数コンテナデプロイできるか
- Cluster内に複数Nodeを作成する方法。複数Nodeを作成する利点とは?
とりあえず全体像とユースケースは少し掴めてきました。