KubernetesクラスタにServiceとIngressを追加し、Webアプリケーションを外部に公開
KubernetesによるスケーラブルなWebアプリ環境の構築 第2回
本連載では、オープンソースのオーケストレーションシステムである「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」というファイル名で保存してください。
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と表示されているはずです。
この記事は参考になりましたか?
- 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編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
