アプリケーションのレポジトリのセットアップ
アプリケーションのレポジトリには、アプリケーションのソースコードと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の詳細に関しては公式ドキュメントを参照ください。
