SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

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

Kubernetesで構築したWebアプリケーションに、Blue-Green Deployment相当の機能と、バージョンごとにURLを生成する機能を追加

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


Nginx(Deployment)のデプロイ

 次に、Develop用のServiceと通信するNginxのDeploymentをデプロイしていきましょう。このNginxを経由することで、バージョンを含むURLで各バージョンのWebアプリケーションにアクセスできるようになります。これはNginxのlocation機能を使って実現します。

 それでは、NginxのPodをデプロイしていきましょう。今回は、Nginxの設定ファイルを編集する必要があるので、Dockerイメージのビルドから行います。手順は以下の通りです。

  1. NginxのDockerイメージのビルド
  2. DockerイメージをGoogle cloud platformのContainer Registryにpush
  3. NginxのPodのデプロイ

 Container RegistryはGoogle Cloud Platformが提供している、プライベートなDockerコンテナイメージのレポジトリです。GKEから自前のDockerイメージを使う場合などによく使います。

 では早速、NginxのDockerイメージのビルドをしていきましょう。

 Dockerfileやnginxの設定ファイルは私が事前に編集したものがあるので、それをgit cloneして使ってください。

$ git clone https://github.com/tinjyuu/k8s-codezine.git
$ cd k8s-codezine/step3/nginx

 pullが完了したら、次はdocker buildとpushを行いましょう。tag名はGKEのプロジェクトIDを含んだものを指定します。これは、GKEと同じプロジェクトのContainer Registryにpushするためで、GKEから見ると同じプロジェクトのContainer Registryなのでそのイメージを特別な設定なしにpullして使えます。

$ docker build -t gcr.io/{プロジェクト名}/nginx:v1 .
$ gcloud docker -- push gcr.io/{プロジェクト名}/nginx:v1

 pushが完了したらNginxのDeploymentをデプロイします。イメージには先ほどpushしたイメージを指定します。このDeploymentは先ほどのNginxのイメージとDnsmasq(DNSサーバー)の構成になっています。

 それでは、Deploymentの設定ファイルを作成していきましょう。エディタを開き、次の内容をコピーして「nginx-develop.yaml」というファイル名で保存してください。

リスト3 nginx-develop.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-develop

spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: gcr.io/{project-id}/nginx:v1
        ports:
        - containerPort: 80
      - name: dnsmasq
        image: "janeczku/go-dnsmasq:release-1.0.5"
        args:
          - --listen
          - "127.0.0.1:53"
          - --default-resolver
          - --append-search-domains
          - --hostsfile=/etc/hosts
          - --verbose

 nginx-develop.yamlをデプロイします。

$kubectl create -f nginx-develop.yaml

Ingressの設定

 次に、Ingressをデプロイします。エディタを開き、次の内容をコピーして「ingress-my-api.yaml」というファイル名で保存してください。

リスト4 ingress-my-api.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "test-ip" # 第2回の記事で、予約したstatic-ipを指定
spec:
  rules:
  - host: pro.app.io
    http:
      paths:
      - backend:
          serviceName: service-production
          servicePort: 80
  - host: dev.app.io
    http:
      paths:
      - backend:
          serviceName: service-develop
          servicePort: 80

 このIngressでは以下の設定をしています。

  • pro.app.ioのドメインからのアクセスであれば、service-productionにリクエストを流す設定
  • dev.app.ioのドメインからのアクセスであれば、service-developにリクエストを流す設定

 今回は、前回の記事で作成したIngressの設定を上書きする形でデプロイしましょう。そのため、createコマンドではなくてapplyコマンドを使います。

$kubectl apply -f ingress-my-api.yaml

動作確認

 最後に動作確認をしましょう。確認したい点は以下の通りです。

  • pro.app.ioにアクセスするとProductionのServiceで指定したアプリケーションのバージョンにつながるか。
  • dev.app.io/versions/{my-apiのversion}にアクセスすると{my-apiのversion}で指定したmy-apiのバージョンにつながるか。

 それでは、curlコマンドを使って、pro.app.ioにアクセスしましょう。ただ、実際にはIngressのIPにpro.app.ioのドメインが振られていないはずなのでcurlの--resolveオプションを使ってアクセスします。

$curl --resolve pro.app.io:80:{ingress-ip} http://pro.app.io
my-api-v2%

 my-apiのv2にアクセスできたことが確認できると思います。

 次に、dev.app.ioのversionsというURLパスで各versionのmy-apiにアクセスしてみます。

$curl --resolve dev.app.io:80:{ingress-ip} http://dev.app.io/versions/v2/index
my-api-v2%
$curl --resolve dev.app.io:80:{ingress-ip} http://dev.app.io/versions/v3/index
my-api-v3%

 URLのパスに合わせてアクセスできるバージョンが変わったことが確認できると思います。

最後に

 以上でServiceのselectorを使ったBlue-Green Deployment相当の機能の実現、アプリケーションのバージョンごとにURLを自動で割り当てる機能を実現できました。

参考Webページ

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
KubernetesによるスケーラブルなWebアプリ環境の構築連載記事一覧

もっと読む

この記事の著者

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

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

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

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、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本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10582 2018/01/22 00:15

イベント

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

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

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

メールバックナンバー