クラスター内で実行されているサービスへのアクセス

このページでは、Kubernetesクラスター内で実行されているサービスに接続する方法を説明します。

始める前に

Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:

バージョンを確認するには次のコマンドを実行してください: kubectl version.

クラスター内で実行されているサービスへのアクセス

KubernetesでノードPod、そしてServiceは、それぞれの独自のIPアドレスを持ちます。 多くの場合、クラスター内のノードIP、Pod IP、そして一部のService IPはルーティングされないため、デスクトップマシンなどのクラスター外のマシンからは到達できません。

接続方法

クラスター外からノード、PodそしてServiceに接続するためには、いくつかのオプションがあります。

  • パブリックIPを介してServiceにアクセスする。
    • クラスター外からServiceに到達できるように NodePortまたはLoadBalancerタイプのServiceを使用します。 詳細はServiceおよびkubectl exposeのドキュメントを参照してください。
    • クラスターの環境によって、Serviceが社内ネットワークのみに公開される場合もあれば、インターネットに公開される場合もあります。 公開するServiceが安全かどうかを検討してください。 そのServiceは独自の認証機能を備えていますか?
    • PodはServiceの背後に配置します。 デバッグなどの目的で、複数のレプリカの中から特定のPodにアクセスするためには、そのPodにユニークなラベルを付与し、そのラベルを選択する新しいServiceを作成します。
    • ほとんどの場合、アプリケーション開発者がnodeIPを使用してノードに直接アクセスする必要はありません。
  • Proxy Verbを使用してService、ノード、Podにアクセスする。
    • リモートのServiceにアクセスする前に、Apiサーバーによる認証および認可を行われます。 Serviceをインターネットに公開するほど安全ではない場合や、ノードIP上のポートにアクセスしたい場合、またはデバッグ目的で使用します。
    • プロキシは、一部のWebアプリケーションで問題を引き起こす可能性があります。
    • HTTP/HTTPSのみで動作します。
    • 詳細はこちらを参照してください。
  • クラスター内のノードまたはPodからアクセスする。
    • Podを起動し、kubectl execを使用してそのPodのShellに接続します。
    • 一部のクラスターは、ノードへのSSHアクセスを許可する場合があります。 その場合、そこからクラスターのServiceにアクセスできる可能性があります。 ただし、これは標準的な方法ではなく、クラスターによっては動作しないことがあります。 ブラウザやほかのツールがインストールされていない場合もあります。 クラスターDNSが動作しないこともあります。

組み込みServiceの検出

通常、kube-systemによってクラスター内で起動されるServiceがいくつか存在します。 これらは、kubectl cluster-infoコマンドを通して一覧表示ができます。

kubectl cluster-info

出力は次のとおりです。

Kubernetes master is running at https://192.0.2.1
elasticsearch-logging is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy
kibana-logging is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/kibana-logging/proxy
kube-dns is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/kube-dns/proxy
grafana is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
heapster is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/monitoring-heapster/proxy

これは、各Serviceにアクセスするためのproxy-verb URLを示しています。 たとえば、このクラスターでは(Elasticsearchを使用した)クラスター単位のログ収集が有効で、適切な認証情報を渡すことで、次のURLからアクセスができます。 https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/ または、たとえば次のようにkubectl proxyを介してアクセスすることもできます。 http://localhost:8080/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/

ApiサーバーのProxy URLを手動で構築する方法

前述のとおり、 ServiceのProxy URLを取得するにはkubectl cluster-infoコマンドを使用します。 Serviceのエンドポイント、サフィックス、パラメータを含むProxy URLを作成するには、次の形式でServiceのProxy URLに追記します。 http://kubernetes_master_address/api/v1/namespaces/namespace_name/services/[https:]service_name[:port_name]/proxy

ポートに名前を指定していない場合、URLにport_nameを指定する必要はありません。 また、名前付きポート、名前なしポートのいずれの場合でも、port_nameの代わりにポート番号を使用することもできます。

デフォルトでは、APIサーバーはHTTPを使用してServiceにプロキシします。 HTTPSを使用する場合は、Service名の前にhttps:を付与します。 http://<kubernetes_master_address>/api/v1/namespaces/<namespace_name>/services/<service_name>/proxy

URLの<service_name>部分では、次の形式がサポートされています。

  • <service_name> - HTTPを使用して、デフォルトまたは名前なしのポートにプロキシします
  • <service_name>:<port_name> - HTTPを使用して、指定したポート名またはポート番号にプロキシします
  • https:<service_name>: - httpsを使用して、デフォルトまたは名前なしのポートにプロキシします(末尾のコロンに注意してください)
  • https:<service_name>:<port_name> - https を使用して、指定したポート名またはポート番号にプロキシします
  • Elasticsearchサービスのエンドポイント_search?q=user:kimchyにアクセスするには、次のURLを使用します。

    http://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_search?q=user:kimchy
    
  • Elasticsearchクラスターのヘルス情報_cluster/health?pretty=trueにアクセスするには、次のURLを使用します。

    https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_cluster/health?pretty=true
    

    ヘルス情報は次のような内容です。

    {
      "cluster_name" : "kubernetes_logging",
      "status" : "yellow",
      "timed_out" : false,
      "number_of_nodes" : 1,
      "number_of_data_nodes" : 1,
      "active_primary_shards" : 5,
      "active_shards" : 5,
      "relocating_shards" : 0,
      "initializing_shards" : 0,
      "unassigned_shards" : 5
    }
    
  • httpsを経由してElasticsearchサービスのヘルス情報_cluster/health?pretty=trueにアクセスするには、次のURLを使用します。

    https://192.0.2.1/api/v1/namespaces/kube-system/services/https:elasticsearch-logging:/proxy/_cluster/health?pretty=true
    

クラスター内で実行されているサービスにWebブラウザからアクセスする {#using-web-browsers-to- access-services-running-on-the-cluster}

ブラウザのアドレスバーにApiサーバーのプロキシURLを直接入力してアクセスできる場合があります。ただし、以下の点を注意してください。

  • Webブラウザのアドレスバーは通常トークンを送信できないため、基本的な認証(パスワード)を使用する必要があります。 Apiサーバーは基本認証を受け付けるように設定できますが、クラスターがその設定になっていない場合もあります。
  • 一部のWebアプリケーションは正しく動作しないことがあります。特に、プロキシのパスプレフィックスを考慮せずにURLを生成するクライアントサイドJavaScriptを使用している場合です。
最終更新 December 24, 2025 at 1:42 AM PST: minor wording fix (7df8218fb2)