2.3.4 アプリケーションのサービス・オブジェクトの公開

通常、多くのアプリケーションはポッドの範囲内(その範囲を超えたとしてもポッド間)の内部的な通信のみが必要になりますが、アプリケーションを外部に公開してKubernetesクラスタの外側にあるクライアントがアプリケーションとインタフェース接続できるようにすることが必要になる場合もあります。これは、そのデプロイメントに対応するサービス定義を作成することで実現できます。

サービス・オブジェクトを使用してデプロイメントを公開するには、使用するサービス・タイプを定義する必要があります。クラウドベースのロード・バランシング・サービスを使用していない場合は、サービス・タイプをNodePortに設定できます。NodePortサービスは、クラスタ内のすべてのノードに対するパブリックIPアドレス上の専用ポートで、クラスタ内で実行しているアプリケーションを公開します。次のようにkubectl expose deploymentコマンドを使用して、新しいサービスを作成します。

$ kubectl expose deployment hello-world --port 80 --type=LoadBalancer
service/hello-world exposed

次のようにkubectl get servicesを使用して、クラスタで実行中の各種サービスをリストし、そのサービスにアクセスするために必要なポート情報を取得します。

$ kubectl get services
NAME          TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
hello-world   LoadBalancer   10.102.42.160   <pending>     80:31847/TCP   3s
kubernetes    ClusterIP      10.96.0.1       <none>        443/TCP        5h13m

この例の出力では、クラスタ内部のポート80へのトラフィックがNodePort 31847にマップされていることがわかります。サービスにアクセスするために使用できる外部IPは、<pending>としてリストされています。これは、ポート31847でクラスタ内のいずれかのノードの外部IPアドレスに接続することで、そのサービスにアクセスできることを意味します。

このガイドの例では、クラスタ内のいずれかのノード(たとえば、http://worker1.example.com:31847/)を指すようにしてWebブラウザを開くと、NGINXデモ・アプリケーションが表示されます。