Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

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

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2017/11/27 14:00

 本連載では、オープンソースのオーケストレーションシステムである「Kubernetes」を用いて、スケーラブルで運用しやすいWebアプリケーションを構築する方法を紹介します。前回はGoogle Container Engine上にKubernetesクラスタを作成し、それにDeploymentをデプロイしました。今回はWebアプリケーションを外部に公開するために、クラスタにServiceとIngressを追加します。

目次

はじめに

 Podを外部に公開するだけであれば、Serviceだけでも可能です。しかし、IngressとServiceを組み合わせたほうがURLごとに接続するServiceを変更できるなど多機能であるため、本記事ではService+Ingressの構成について解説を行います。

 以下は本記事の構成図です。

本記事の構成図
本記事の構成図

 第1回で追加したPodに対してServiceを追加し、そのIngressとPodがSeriviceを通じて通信ができるようにします。Ingressは外部に公開されており、インターネットを通じて外部と通信できます。

対象読者

  • Linuxの基本的なコマンドが使える方
  • Dockerの使用経験がある方
  • Kubernetes使ったことがない技術者

検証環境

Kubernetes側の環境

  • Google Container Engine 1.7.5
  • Kubernetes 1.7.5

クライアントの環境

  • macOS Sierra 10.12.6
  • kubectl 1.7.3

PodとIngressを接続するためのService(NodePort)の作成

 それでは、Serviceを作成していきましょう。Serviceを追加することで、Serviceで指定したPodがクラスタ内のPodやIngressと通信ができるようになります。

 Serviceのkind(種類)はNodePortです。NodePortは各NodeのIPでポートを公開します。これにより、クラスタの外からServiceにアクセスできるようになります。

 今回作成するServiceはselectorで、第1回目で作成したPodのlabelsを指定します。エディタを開き、リスト1をコピー&ペーストして「service-my-api.yaml」というファイル名で保存してください。

リスト1 service-my-api.yaml
apiVersion: v1
kind: Service
metadata:
  name: service-my-api
spec:
  type: NodePort # typeにNodePortを指定する
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    name: http
  selector:
    app: my-api # Deploymentと同じappを指定する
    version: v1 # Deploymentと同じversionを指定する

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

$ kubectl create -f service-my-api.yaml
service "service-my-api" created

 createコマンドが正常終了したら、次はServiceが作られているかどうかをkubectl getで確認します。

$ kubectl get svc
NAME             CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes       xx.xx.xxx.x     <none>        443/TCP        5h
service-my-api   xx.xx.xxx.xxx   <nodes>       80:31708/TCP   36s

 Serviceが正常に作られていたら、「service-my-api」という名前のServiceが確認できるはずです。

 次に、kubectl describeコマンドでSelectorが設定されているかを確認しましょう。describeコマンドは指定したリソースの詳細を確認することができるコマンドです。

$ kubectl describe svc/service-my-api
Name:            service-my-api
Namespace:        default
Labels:            <none>
Annotations:        <none>
Selector:        app=my-api,version=v1
Type:            NodePort
IP:            10.51.251.245
Port:            http    80/TCP
NodePort:        http    31708/TCP
Endpoints:        <none>
Session Affinity:    None
Events:            <none>

 YAMLで定義した内容でServiceが作成されたことが確認ができたでしょうか。Selectorの項目にSelector: app=my-api,version=v1と表示されているはずです。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

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

     株式会社カブクのサーバーサイドエンジニアです。APIの開発(Python,GO,AppEngine)とKubernetesによるインフラ環境の構築を担当しています。好きな獣はチベットスナギツネです。 Twitter: @yoshikai_ Faceb...

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

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:KubernetesによるスケーラブルなWebアプリ環境の構築
All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5