SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

KubernetesによるスケーラブルなWebアプリ環境の構築

Google Cloud Container Builderでアプリケーションのデプロイと継続的インテグレーションを実現

KubernetesによるスケーラブルなWebアプリ環境の構築 第4回

  • X ポスト
  • このエントリーをはてなブックマークに追加

アプリケーションのレポジトリのセットアップ

 アプリケーションのレポジトリには、アプリケーションのソースコードと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としてアプリケーションのレポジトリの直下に置いてください。

リスト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のファイル名で保存してレポジトリの直下に置いてください。

リスト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のファイル名でレポジトリに保存してください。

リスト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の詳細に関しては公式ドキュメントを参照ください。

次のページ
Google Cloud Container Builderの設定

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
KubernetesによるスケーラブルなWebアプリ環境の構築連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 吉海 将太(ヨシカイ ショウタ)

 株式会社カブクのサーバーサイドエンジニアです。APIの開発(Python,GO,AppEngine)とKubernetesによるインフラ環境の構築を担当しています。好きな獣はチベットスナギツネです。 Twitter: @yoshikai_ FacebookWINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10610 2018/01/17 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング