SHOEISHA iD

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

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

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

KubernetesクラスタにServiceとIngressを追加し、Webアプリケーションを外部に公開

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


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

Ingressの作成

 次にIngressを作成します。Ingressにより、Webアプリケーションが外部に公開されるようになります。

 このIngressでは先ほど作成したServiceを指定します。

Static-IPを予約

 Ingressを作成する前に固定IPアドレスを予約しましょう。IngressはIPを指定しないで作成すると毎回ランダムなIPが振られてしまいます。これではIPにドメインを振っていた場合等で都合が悪いです。そのため静的なIPを予約して、それをIngressのIPとして使う設定にしましょう。

gcloudのコマンドでIPを予約

 gcloudコマンドで固定IPアドレスを予約します。Google Cloud Platformの固定IPアドレスには2つのタイプがありますが、今回予約するIPのタイプはグローバルを指定します。

$ gcloud compute addresses create test-ip --global
Created [https://www.googleapis.com/compute/v1/projects/{my-project}/global/addresses/test-ip].

 このコマンドが完了したら、実際に固定IPアドレスが予約されたかを確認します。予約しただけなので、STATUSはRESERVEDになってるはずです。

$ gcloud compute addresses list --global
NAME                     REGION  ADDRESS          STATUS
test-ip                          xx.xxx.xxx.xxx   RESERVED

Ingressの作成

 それでは次にIngressを作成します。このIngressでは先ほど予約した固定IPアドレスを指定します。

 エディタを開いて、リスト2をコピー&ペーストしてingress-my-api.yamlというファイル名で保存してください。

リスト2 ingress-my-api.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "test-ip" # 先ほど、予約したstatic-ipを指定
spec:
  backend:
    serviceName: service-my-api # 前の手順で作成したServiceの名前を指定
    servicePort: 80

 このYAMLでは「metadata > annotations > kubernetes.io/ingress.global-static-ip-name」で予約したStatic-ipを指定して、IngressのIPに対してアクセスした場合にSericeのservice-my-apiに振り分けるように、「spec > backend > serviceName & servicePort」を指定しています。

 それでは、kubectl createコマンドでIngressを作成してみましょう。

$ kubectl create -f ingress-my-api.yaml
ingress "test-ingress" created

 コマンドが正常終了したら、次にgetdescribeコマンドでIngressの状態を確認してみましょう。

 Ingressの作成には数分ほどかかるので、createコマンドを実行した直後であれば、以下の通りADDRESSに何も表示されていない結果が得られます。

kubectl get ing
NAME           HOSTS        ADDRESS   PORTS     AGE
test-ingress   dev.app.io             80        25s

 Ingressの作成が完了していれば、以下と同様の結果が得られるはずです。

$ kubectl get ing
NAME           HOSTS        ADDRESS         PORTS     AGE
test-ingress   dev.app.io   {予約したStatic-IP}   80        4m

 この結果が得られない場合は、Ingressの作成がまだ途中なので作成完了まで数分ほど待ちましょう。

 getコマンドでIngressのADDRESSが表示されたら、次はdescribeコマンドを実行しましょう。

kubectl describe ing/test-ingress
Name:            test-ingress
Namespace:        default
Address:        {予約したStatic-IP}
Default backend:    default-http-backend:80 (10.48.1.4:8080)
Rules:
  Host    Path    Backends
  ----    ----    --------
  *    *     service-my-api:80 (10.48.0.5:80,10.48.2.7:80)
Annotations:
  backends:        {"k8s-be-31708--c599329eddb5878a":"HEALTHY","k8s-be-32765--c599329eddb5878a":"HEALTHY"}
  forwarding-rule:    k8s-fw-default-test-ingress--c599329eddb5878a
  target-proxy:        k8s-tp-default-test-ingress--c599329eddb5878a
  url-map:        k8s-um-default-test-ingress--c599329eddb5878a
Events:
  FirstSeen    LastSeen    Count    From            SubObjectPath    Type        Reason    Message
  ---------    --------    -----    ----            -------------    --------    ------    -------
  14m        14m        1    loadbalancer-controller            Normal        ADD    default/test-ingress
  12m        12m        1    loadbalancer-controller            Normal        CREATE    ip: {予約したStatic-IP}
  12m        36s        7    loadbalancer-controller            Normal        Service    no user specified default backend, using system default

 Ingressが正常に作成されていれば、Ruleの部分にservice-my-api:80が確認できると思います。

 Ingressではヘルスチェックとして、Serviceを経由してPodのルートディレクトリ(http://ServiceのIP:port/)に対してgetリクエストを投げてHTTPステータスコード200が返ってくるかを確認するようになっています。

 describeの結果内の「Annotations > backends」で{"k8s-be-31708--c599329eddb5878a":"HEALTHY","k8s-be-32765--c599329eddb5878a":"HEALTHY"}と表示されているのが、ヘルスチェックの結果です。HEALTHYと表示されていれば、ヘルスチェックをパスしたということになります。

 次に、Deploymentのログを確認してみましょう。ヘルスチェックのアクセス履歴がlogコマンドで得られるはずです。

$ kubectl log deploy/my-api                                                                                                                       
W0718 08:49:26.645167   81531 cmd.go:392] log is DEPRECATED and will be removed in a future version. Use logs instead.
Found 2 pods, using pod/my-api-1799588982-s5msj
10.146.0.5 - - [17/Jul/2017:23:48:49 +0000] "GET / HTTP/1.1" 200 612 "-" "GoogleHC/1.0" "-"
10.48.0.1 - - [17/Jul/2017:23:48:50 +0000] "GET / HTTP/1.1" 200 612 "-" "GoogleHC/1.0" "-"
10.48.0.1 - - [17/Jul/2017:23:48:50 +0000] "GET / HTTP/1.1" 200 612 "-" "GoogleHC/1.0" "-"
10.48.0.1 - - [17/Jul/2017:23:48:51 +0000] "GET / HTTP/1.1" 200 612 "-" "GoogleHC/1.0" "-"

 GoogleHC/1.0がIngressのヘルスチェックのユーザーエージェントで、Serviceを経由してPodのルートディレクトリ(http://ServiceのIP:port/)に対してGETリクエストを投げていることが確認できます。その時のレスポンスで200を返しているため、ヘルスチェックを問題なくパスしたことになっています。

 最後にcurlコマンドを手元のマシンから実行して、先ほど予約した固定IPアドレスからデプロイしたPodにアクセスできるかを確認しましょう。

$ curl {予約した固定IPアドレス}

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...中略...
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

 このように、nginxのhtmlがレスポンスとして返ってきたことが確認できると思います。これで、Podを外部に公開することができました。

最後に

 以上でServiceとIngressを使いWebアプリケーションを外部に公開することができました。次回はBlue-Green Deployment相当の機能と、アプリケーションのバージョンごとにURLを生成する機能を追加する方法について紹介します。

参考Webページ

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

  • 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/10523 2017/12/18 15:46

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング