Kubernetes 1.32におけるKonnectivityの通信方式

## Konnectivityサービスの概要

![58fd1b65-2ead-4044-beb9-3bdfb0db2274.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/44be6246-8d78-4bc6-b644-64aca5a60862.png)


KubernetesにおけるKonnectivityサービスは、コントロールプレーン（APIサーバー）からクラスター（ノード）への通信を中継する **プロキシサービス** です。もともとKubernetesではSSHトンネルによってマスター⇔ノード間の通信を行っていましたが、KonnectivityはそのSSHトンネルを置き換える新しい仕組みとして導入されました ([Communication between Nodes and the Control Plane | Kubernetes](https://kubernetes.io/docs/concepts/architecture/control-plane-node-communication/#:~:text=As%20a%20replacement%20to%20the,traffic%20goes%20through%20these%20connections))。Konnectivityサービスはコントロールプレーン側で動作する「Konnectivityサーバー」と、各ノード側で動作する「Konnectivityエージェント」の2つのコンポーネントから構成されます ([Communication between Nodes and the Control Plane | Kubernetes](https://kubernetes.io/docs/concepts/architecture/control-plane-node-communication/#:~:text=As%20a%20replacement%20to%20the,traffic%20goes%20through%20these%20connections))。ノード上のエージェントがコントロールプレーン上のKonnectivityサーバーに対して接続を **確立・維持** し、この接続を通じて**APIサーバー→ノード**へのあらゆる通信（例：kubectlポートフォワードやログ取得、exec実行などノード上のkubeletやPodと通信する操作）がトンネリングされます ([Communication between Nodes and the Control Plane | Kubernetes](https://kubernetes.io/docs/concepts/architecture/control-plane-node-communication/#:~:text=consists%20of%20two%20parts%3A%20the,traffic%20goes%20through%20these%20connections))。エージェントが接続を開始することで、ファイアウォール環境下でもノードからマスターへの **一方向の発信** を利用し、結果として **双方向の通信路** を確保します。このようにKonnectivityは**L4(TCP)レベルのプロキシ**として機能し、コントロールプレーンとノード間の通信を間接化・安全化します ([Communication between Nodes and the Control Plane | Kubernetes](https://kubernetes.io/docs/concepts/architecture/control-plane-node-communication/#:~:text=As%20a%20replacement%20to%20the,traffic%20goes%20through%20these%20connections))。

## APIサーバーとKonnectivityサーバー間のプロトコル
**APIサーバー** と **Konnectivityサーバー** の間の通信プロトコルとしては、Konnectivityサービスでは **gRPC** か **HTTP CONNECT** のいずれかが使用されます ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=,recommended%20if%20the%20Konnectivity%20server))。Kubernetes 1.32時点でもこの方針に変わりはなく、公式ドキュメントの設定例でも `proxyProtocol` に `"GRPC"`（gRPCモード）または `"HTTPConnect"`（HTTP CONNECTモード）を指定できると記載されています ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=,recommended%20if%20the%20Konnectivity%20server))。gRPCモードの場合、APIサーバーはKonnectivityサーバーに対してgRPC（HTTP/2ベース）のインターフェース経由で接続し、HTTP CONNECTモードの場合はHTTP/1.1のCONNECTメソッドを用いたトンネルとして通信します ([What is the konnectivity service for Kubernetes? - Stack Overflow](https://stackoverflow.com/questions/61706923/what-is-the-konnectivity-service-for-kubernetes#:~:text=The%20proxy%20server%20which%20runs,known%20the%20Network%20Proxy%20Server))。**ユーザーから見た機能上の差異はなく**、どちらのモードでもコントロールプレーンからノードへの通信を同様にプロキシできます ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=,recommended%20if%20the%20Konnectivity%20server))。Kubernetesの一般的なセットアップではデフォルトでgRPCモードが使われることが多く、Unixドメインソケット(UDS)を介してAPIサーバーとKonnectivityサーバー間を直接接続する構成が推奨されています ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=,to%20secure%20the%20TCP%20transport))。UDSを利用することで同一マシン内で安全に通信でき、余分なTCPポートを開く必要がありません。**TCP経由で接続する場合**（例えば別ホスト上でKonnectivityサーバーを動かす場合など）は、**TLSによる暗号化**設定が必要とされています ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=the%20,to%20secure%20the%20TCP%20transport))。KonnectivityサーバーはAPIサーバーからの接続を待ち受ける「サーバーポート」を持ちます（UDS利用時はこのポートを使用しない構成も可能）。設定例ではUDSを使うために`--server-port=0`（無効化）とし、代わりにソケットファイル経由で接続しています ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=%22,server.conf))。

**重要な点として、Konnectivityのこの通信経路ではWebSocketは使用されていません。** サポートされるプロトコルは上述のとおりgRPCまたはHTTP CONNECTのみであり ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=,recommended%20if%20the%20Konnectivity%20server))、WebSocketによるAPIサーバー⇔Konnectivityサーバー間トンネル機能は公式には提供されていません。実際、Kubernetes 1.31で**kubectl**によるログ・Execなどのストリーミング通信がSPDYプロトコルからWebSocketプロトコルに変更されましたが、それはkubectlとAPIサーバー間の通信についての変更です。Konnectivityサービス自体の内部実装には依然としてgRPC/HTTP CONNECTベースのトンネリングが使われており、**WebSocketはKonnectivityの内部通信には関与しません** ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=,recommended%20if%20the%20Konnectivity%20server))。

## Konnectivityサーバーとエージェント間の通信
Konnectivityサーバーと各ノード上のKonnectivityエージェントとの間では、**エージェント側からサーバーへの長寿命の接続**が張られます ([Communication between Nodes and the Control Plane | Kubernetes](https://kubernetes.io/docs/concepts/architecture/control-plane-node-communication/#:~:text=consists%20of%20two%20parts%3A%20the,traffic%20goes%20through%20these%20connections))。各エージェントは起動時にコントロールプレーン上のKonnectivityサーバー（通常はコントロールプレーンのURLもしくは内部サービスIP）に対して接続を確立し、この接続を維持します。Konnectivityサーバー側では複数エージェント（各ノード）からの接続を受け入れ、それぞれを通じて該当ノードへの通信経路を確保します。エージェント→サーバーの接続は**双方向通信可能なトンネル**として機能し、APIサーバーからノード上のkubeletやPodへのリクエストは一旦Konnectivityサーバーに渡され、対応するエージェント経由で目的のノードに転送されます ([Communication between Nodes and the Control Plane | Kubernetes](https://kubernetes.io/docs/concepts/architecture/control-plane-node-communication/#:~:text=consists%20of%20two%20parts%3A%20the,traffic%20goes%20through%20these%20connections))。逆方向の応答データも同じ経路を辿ってAPIサーバーに戻ります。このように一度確立されたトンネル上でコントロールプレーンとノード間の双方向通信が行われるため、**各エージェント接続はフルデュープレックス（二方向同時通信）**です。特にgRPCモードの場合、HTTP/2ストリームを用いて一つのTCPコネクション上で複数のリクエストを多重化して転送できます（HTTP CONNECTモードでも複数トンネルを扱えますが実装方法が異なります）。Konnectivityではエージェント接続が切れた場合に再接続するリトライ機能や、複数コネクションを張って冗長化するオプション（代理サーバーの負荷分散/フェイルオーバー設定）も提供されていますが、基本的な通信方式は常時接続のトンネルを用いる形です。

### セキュリティとポート番号
Konnectivityエージェントとサーバー間の通信は**セキュアなチャネル**上で行われます。典型的には、Konnectivityサーバー側でクラスタCAによる証明書を用意し（例：`system:konnectivity-server`というCNの証明書を発行）、エージェントはサービスアカウントTokenやクライアント証明書を用いて認証を行います。通信内容自体もTLS暗号化され、第三者に傍受されないようになっています ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=the%20,to%20secure%20the%20TCP%20transport))。Konnectivityサーバーはデフォルトで**TCPポート8132**でエージェントからの接続を受け付け、加えて**8133**番ポートに管理用インターフェース（Adminサーバー）、**8134**番ポートにヘルスチェック用インターフェースを持ちます ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=%22,server.conf))。これらのポート番号はKonnectivityの標準設定であり、必要に応じて変更可能ですが、Kubernetes公式のマニフェスト例でも8132/8133/8134が使用されています ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=%22,server.conf))。一方、APIサーバーとKonnectivityサーバー間は前述の通り同一マシン上ならUDS経由、それ以外の場合は適宜設定したポート（例：Konnectivityサーバーの`--server-port`で指定）で通信します。Konnectivity導入時にはこれらポートへのアクセスが適切に許可されている必要があります（コントロールプレーンが外部からエージェント接続を受け入れる場合は8132を開放、内部接続のみならUDS利用など）。

## まとめ
以上より、**Kubernetes 1.32におけるKonnectivityの通信方式**は以下の通りです：

- **プロトコル**: APIサーバーとKonnectivityサーバー間は **gRPC (HTTP/2)** または **HTTP CONNECT** プロトコルを使用します ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=,recommended%20if%20the%20Konnectivity%20server))。Konnectivityエージェントとサーバー間も同様にこれらプロトコル上でトンネリングを行います（gRPCモードが一般的）。  
- **WebSocketの不使用**: Konnectivityでは **WebSocketは利用しません** ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=,recommended%20if%20the%20Konnectivity%20server))。サポートされる通信はgRPC/HTTP CONNECTに限定されており、kubectlストリーミング等で使用されるWebSocketはKonnectivity内部には登場しません。  
- **接続方式**: ノード側のエージェントがコントロールプレーン側のKonnectivityサーバーに対して**アウトバウンド接続を確立**し、その単一のコネクションを通じて**双方向の通信**（コントロールプレーン→ノードおよびノード→コントロールプレーン）を行います ([Communication between Nodes and the Control Plane | Kubernetes](https://kubernetes.io/docs/concepts/architecture/control-plane-node-communication/#:~:text=consists%20of%20two%20parts%3A%20the,traffic%20goes%20through%20these%20connections))。この接続は長時間維持され、必要に応じて再接続や複数確立も行われます。  
- **TLSセキュリティ**: Konnectivityの通信は基本的に**TLSで保護**されています。特にTCP上でAPIサーバー↔Konnectivityサーバーを接続する場合や、ノード↔サーバー間接続には証明書やトークンによる認証とTLS暗号化が適用されます ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=the%20,to%20secure%20the%20TCP%20transport))。  
- **使用ポート**: デフォルトではKonnectivityサーバーは **8132/TCP** でエージェント接続を待ち受けます（管理用に8133、ヘルスチェックに8134も使用） ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=%22,server.conf))。APIサーバーとの間は同一ホストならUDS、それ以外では適宜設定されたポート（例: 8132や任意のポート）で接続します。

以上のように、Kubernetes 1.32環境におけるKonnectivityは**gRPCまたはHTTP CONNECTベースのトンネル**によって実装されており、**WebSocketは使用されていない**ことが確認できます。これにより、安全で効率的なコントロールプレーン↔ノード間の通信チャネルが提供されています。 ([Set up Konnectivity service | Kubernetes](https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/#:~:text=,recommended%20if%20the%20Konnectivity%20server)) ([Communication between Nodes and the Control Plane | Kubernetes](https://kubernetes.io/docs/concepts/architecture/control-plane-node-communication/#:~:text=As%20a%20replacement%20to%20the,traffic%20goes%20through%20these%20connections))