アプリケーションのレポジトリのセットアップ
アプリケーションのレポジトリには、アプリケーションのソースコードとDockerfile以外にも、アプリケーションのKubernetesのDeploymentとServiceのYAML、それらをデプロイするためのシェルスクリプト、Google Cloud Container Builderのビルド内容を記述したcloudbuild.yamlを含めるようにします。
Gitレポジトリの用意およびアプリケーションのソースコード、Dockerfileの説明は今回は割愛します。別途ご用意ください。Google Cloud Container Builderで使えるレポジトリはCloud Source Repositories、GitHub、Bitbucketです。今回はGitHubを想定して説明します。
アプリケーションのKubernetes用のDeploymentとServiceのYAML
アプリケーションのYAMLは、デプロイ時にバージョン指定部分を動的に書き換えるようにしたいです。そのため、バージョンを書き換えることを前提としたテンプレートファイルを用意します。リスト1の内容をコピーして、template.yamlとしてアプリケーションのレポジトリの直下に置いてください。
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: my-api-{tag} spec: replicas: 2 template: metadata: labels: app: my-api version: {tag} spec: containers: - name: my-api image: gcr.io/{プロジェクト名}/my-api:{tag} # ここはご自身のプロジェクト名に書き換えてください ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-api-{tag} spec: type: ClusterIP ports: - protocol: TCP port: 80 targetPort: 80 name: http selector: app: my-api version: {tag}
このテンプレートで{tag}と記述されている箇所が、アプリケーションのデプロイ時にバージョンの値で置換されます。
シェルスクリプトの作成
Dockerコンテナイメージ上ではkubectlなど、いくつかのコマンドを実行する必要があります。それらの処理はまとめてシェルスクリプトに記述します。リスト2の内容をコピーし、deploy.shのファイル名で保存してレポジトリの直下に置いてください。
#!/bin/bash set -eu cwd=$(cd $(dirname $0);pwd) cd ${cwd} # kubecltのcurrent-contextがなければ、gcloud container clustersのコマンドでkubectlの認証を行いcontextを取得します。 if [[ $(kubectl config current-context 2> /dev/null) == "" ]]; then cluster=$(gcloud config get-value container/cluster 2> /dev/null) zone=$(gcloud config get-value compute/zone 2> /dev/null) project=$(gcloud config get-value core/project 2> /dev/null) function var_usage() { cat <<EOF No cluster is set. To set the cluster (and the zone where it is found), set the environment variables CLOUDSDK_COMPUTE_ZONE=<cluster zone> CLOUDSDK_CONTAINER_CLUSTER=<cluster name> EOF exit 1 } [[ -z "$cluster" ]] && var_usage [[ -z "$zone" ]] && var_usage echo "Running: gcloud container clusters get-credentials --project=\"$project\" --zone=\"$zone\" \"$cluster\"" gcloud container clusters get-credentials --project="$project" --zone="$zone" "$cluster" || exit fi echo version: ${1} # テンプレートのYAMLからDeploymentとServiceを定義したYAMLを生成します。 cat ./template.yaml | sed s#{tag}#$1# > ./my-api-$1.yaml cat ./my-api-$1.yaml # 生成したYAMLの内容でデプロイします kubectl apply -f ./my-api-$1.yaml
このシェルスクリプトでは、kubectlのapplyコマンドを実行するために必要なcontextの取得と、テンプレートファイルからデプロイするアプリケーションのYAMLのセットアップ、最後にセットアップしたYAMLのデプロイを行います。デプロイ先のクラスタ名やゾーンは後述するGoogle Cloud Container Builderのcloudbuild.yamlで定義します。
kubectlのcontextの取得に関しては、Google Cloud Platformの公式レポジトリにあるkubectl.bashを参考にしています。
これでレポジトリのセットアップは完了です。本記事では解説しませんが、Dockerfileやソースコードも含めると、以下のディレクトリ構造になるはずです。
./template.yaml ./deploy.sh ./Dockerfile ./ソースコード
Google Cloud Container Builderのcloudbuild.yaml
cloudbuild.yamlにはGoogle Cloud Container Builderのビルド内容をYAML形式で記述します。Google Cloud Container Builderは各ステップでDockerコンテナイメージを実行するようになっているため、それぞれのステップでDockerコンテナイメージを指定します。
今回は「イメージのビルド」「イメージのプッシュ」「Kubernetesにデプロイ」のステップになります。リスト3の内容をコピーし、cloudbuild.yamlのファイル名でレポジトリに保存してください。
steps: - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/{プロジェクト名}/my-api:$TAG_NAME', '.'] - name: 'gcr.io/cloud-builders/docker' args: ['push', 'gcr.io/{プロジェクト名}/my-api:$TAG_NAME'] - name: 'gcr.io/cloud-builders/kubectl' entrypoint: ./deploy.sh args: ['$TAG_NAME'] env: - 'CLOUDSDK_COMPUTE_ZONE={Kubernetesのクラスタのゾーン}' - 'CLOUDSDK_CONTAINER_CLUSTER={Kubernetesのクラスタの名前}'
それぞれのステップで専用のDockerコンテナイメージを実行するようになっています。どのイメージもGoogleが公開しているものです。
最初の'gcr.io/cloud-builders/docker'ではbuildコマンドを引数に渡し、レポジトリのDockerfileをもとにDockerビルドを行います。次にそのイメージを'gcr.io/cloud-builders/docker'を使ってプッシュ、最後に'gcr.io/cloud-builders/kubectl'で先ほど作成したdeployを実行し、アプリケーションをデプロイしています。envでは、Kubernetesにデプロイするために必要なクラスタの情報{Kubernetesのクラスタの名前}とゾーンの情報{Kubernetesのクラスタのゾーン}を定義しています。
そのほか、YAMLの詳細に関しては公式ドキュメントを参照ください。