|
| 1 | +--- |
| 2 | +title: ノードとコントロールプレーン間の通信 |
| 3 | +content_type: concept |
| 4 | +weight: 20 |
| 5 | +aliases: |
| 6 | +- master-node-communication |
| 7 | +--- |
| 8 | + |
| 9 | +<!-- overview --> |
| 10 | + |
| 11 | +本ドキュメントは、APIサーバーとKubernetesクラスター間の通信経路をまとめたものです。 |
| 12 | +その目的は、信頼できないネットワーク上(またはクラウドプロバイダー上の完全なパブリックIP)でクラスターが実行できるよう、ユーザーがインストールをカスタマイズしてネットワーク構成を強固にできるようにすることです。 |
| 13 | + |
| 14 | +<!-- body --> |
| 15 | + |
| 16 | +## ノードからコントロールプレーンへの通信 {#node-to-control-plane} |
| 17 | + |
| 18 | +Kubernetesには「ハブアンドスポーク」というAPIパターンがあります。ノード(またはノードが実行するPod)からのすべてのAPIの使用は、APIサーバーで終了します。他のコントロールプレーンコンポーネントは、どれもリモートサービスを公開するようには設計されていません。APIサーバーは、1つ以上の形式のクライアント[認証](/ja/docs/reference/access-authn-authz/authentication/)が有効になっている状態で、セキュアなHTTPSポート(通常は443)でリモート接続をリッスンするように設定されています。 |
| 19 | +特に[匿名リクエスト](/ja/docs/reference/access-authn-authz/authentication/#anonymous-requests)や[サービスアカウントトークン](/ja/docs/reference/access-authn-authz/authentication/#service-account-token)が許可されている場合は、1つ以上の[認可](/docs/reference/access-authn-authz/authorization/)形式を有効にする必要があります。 |
| 20 | + |
| 21 | +ノードは、有効なクライアント認証情報とともに、APIサーバーに安全に接続できるように、クラスターのパブリックルート証明書でプロビジョニングされる必要があります。適切なやり方は、kubeletに提供されるクライアント認証情報が、クライアント証明書の形式であることです。kubeletクライアント証明書の自動プロビジョニングについては、[kubelet TLSブートストラップ](/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/)を参照してください。 |
| 22 | + |
| 23 | +APIサーバーに接続したいPodは、サービスアカウントを利用することで、安全に接続することができます。これにより、Podのインスタンス化時に、Kubernetesはパブリックルート証明書と有効なBearerトークンを自動的にPodに挿入します。 |
| 24 | +`kubernetes`サービス(`デフォルト`の名前空間)は、APIサーバー上のHTTPSエンドポイントに(`kube-proxy`経由で)リダイレクトされる仮想IPアドレスで構成されます。 |
| 25 | + |
| 26 | +また、コントロールプレーンのコンポーネントは、セキュアなポートを介してAPIサーバーとも通信します。 |
| 27 | + |
| 28 | +その結果、ノードやノード上で動作するPodからコントロールプレーンへの接続は、デフォルトでセキュアであり、信頼されていないネットワークやパブリックネットワークを介して実行することができます。 |
| 29 | + |
| 30 | +## コントロールプレーンからノードへの通信 {#control-plane-to-node} |
| 31 | + |
| 32 | +コントロールプレーン(APIサーバー)からノードへの主要な通信経路は2つあります。 |
| 33 | +1つ目は、APIサーバーからクラスター内の各ノードで実行されるkubeletプロセスへの通信経路です。 |
| 34 | +2つ目は、APIサーバーの _プロキシー_ 機能を介した、APIサーバーから任意のノード、Pod、またはサービスへの通信経路です。 |
| 35 | + |
| 36 | +### APIサーバーからkubeletへの通信 {#api-server-to-kubelet} |
| 37 | + |
| 38 | +APIサーバーからkubeletへの接続は、以下の目的で使用されます: |
| 39 | + |
| 40 | +* Podのログの取得。 |
| 41 | +* 実行中のPodへのアタッチ(通常は`kubectl`を使用)。 |
| 42 | +* kubeletのポート転送機能の提供。 |
| 43 | + |
| 44 | +これらの接続は、kubeletのHTTPSエンドポイントで終了します。デフォルトでは、APIサーバーはkubeletのサービング証明書を検証しないため、接続は中間者攻撃の対象となり、信頼されていないネットワークやパブリックネットワークを介して実行するのは**安全ではありません**。 |
| 45 | + |
| 46 | +この接続を検証するには、`--kubelet-certificate-authority`フラグを使用して、kubeletのサービング証明書を検証するために使用するルート証明書バンドルを、APIサーバーに提供します。 |
| 47 | + |
| 48 | +それができない場合は、信頼できないネットワークやパブリックネットワークを介した接続を回避するため、必要に応じてAPIサーバーとkubeletの間で[SSHトンネル](#ssh-tunnels)を使用します。 |
| 49 | + |
| 50 | + |
| 51 | +最後に、kubelet APIを保護するために、[Kubelet認証/認可](/docs/reference/access-authn-authz/kubelet-authn-authz/)を有効にする必要があります。 |
| 52 | + |
| 53 | +### APIサーバーからノード、Pod、サービスへの通信 {#api-server-to-nodes-pods-and-services} |
| 54 | + |
| 55 | +APIサーバーからノード、Pod、またはサービスへの接続は、デフォルトで平文のHTTP接続になるため、認証も暗号化もされません。API URL内のノード、Pod、サービス名に`https:`を付けることで、セキュアなHTTPS接続を介して実行できますが、HTTPSエンドポイントから提供された証明書を検証したり、クライアント認証情報を提供したりすることはありません。そのため、接続の暗号化はされますが、完全性の保証はありません。これらの接続を、信頼されていないネットワークやパブリックネットワークを介して実行するのは、**現在のところ安全ではありません**。 |
| 56 | + |
| 57 | +### SSHトンネル {#ssh-tunnels} |
| 58 | + |
| 59 | +Kubernetesは、コントロールプレーンからノードへの通信経路を保護するために、SSHトンネルをサポートしています。この構成では、APIサーバーがクラスター内の各ノードへのSSHトンネルを開始(ポート22でリッスンしているSSHサーバーに接続)し、kubelet、ノード、Pod、またはサービス宛てのすべてのトラフィックをトンネル経由で渡します。 |
| 60 | +このトンネルにより、ノードが稼働するネットワークの外部にトラフィックが公開されないようになります。 |
| 61 | + |
| 62 | +{{< note >}} |
| 63 | +SSHトンネルは現在非推奨であるため、自分が何をしているのか理解していないのであれば、使用すべきではありません。この通信経路の代替となるものとして、[Konnectivityサービス](#konnectivity-service)があります。 |
| 64 | +{{< /note >}} |
| 65 | + |
| 66 | +### Konnectivityサービス {#konnectivity-service} |
| 67 | + |
| 68 | +{{< feature-state for_k8s_version="v1.18" state="beta" >}} |
| 69 | + |
| 70 | +SSHトンネルの代替として、Konnectivityサービスは、コントロールプレーンからクラスターへの通信に、TCPレベルのプロキシーを提供します。Konnectivityサービスは、コントロールプレーンネットワークのKonnectivityサーバーと、ノードネットワークのKonnectivityエージェントの、2つの部分で構成されています。 |
| 71 | +Konnectivityエージェントは、Konnectivityサーバーへの接続を開始し、ネットワーク接続を維持します。 |
| 72 | +Konnectivityサービスを有効にすると、コントロールプレーンからノードへのトラフィックは、すべてこの接続を経由するようになります。 |
| 73 | + |
| 74 | +[Konnectivityサービスのセットアップ](/docs/tasks/extend-kubernetes/setup-konnectivity/)に従って、クラスターにKonnectivityサービスをセットアップしてください。 |
| 75 | + |
0 commit comments