通常、多くのアプリケーションはポッドの範囲内(その範囲を超えたとしてもポッド間)の内部的な通信のみが必要になりますが、アプリケーションを外部に公開して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デモ・アプリケーションが表示されます。