このドキュメントでは、Zhuサーバー(実際にはapiserver)とKubernetesクラスターの間の通信パスを分類しています。目的は、クラスターを信頼できないネットワーク(またはクラウドプロバイダーの完全なパブリックIP)で実行できるように、ユーザーがインストールを定義してネットワーク構成を強化できるようにすることです。
マスターノードへのクラスター
クラスターからホストへのすべての通信パスはapiserverに配置されます(他のホストコンポーネントはリモートサービスを公開するように設計されていません)。典型的なデプロイメントでは、apiserverは、1つ以上の形式のクライアント認証が有効になっているセキュアなHTTPSポート(443)でリモート接続をリッスンするように構成されます(~~をお楽しみください)。特に匿名リクエスト(~~をお楽しみください)またはサービスアカウントトークン(~~をお楽しみください)が許可されている場合は、1つ以上の認証形式を有効にする必要があります(~~ をお楽しみください)。
クラスターのパブリックルート証明書は、有効なクライアント認証情報とともにapiserverに安全に接続できるように、ノードに対して構成する必要があります。たとえば、デフォルトのGKEデプロイでは、kubeletに提供されるクライアント認証情報はクライアント証明書の形式をとります。kubeletクライアント証明書の自動構成については、kubelet TLSブートを参照してください(~~をお待ちください)。
apiserverに接続するポッドは、サービスアカウントを使用して安全に接続できるため、Kubernetesは、ポッドをインスタンス化するときに、パブリックルート証明書と有効なベアラートークンをポッドに自動的に挿入します。Kubernetes
サービス(すべての名前空間内)には仮想IPアドレスが構成されており、仮想サーバーはkube-proxyを介してapiserverのHTTPSにリダイレクトされ、電源がオフになります。
メインコンポーネントは、安全なポートを介してクラスターapiserverとも通信します。
したがって、デフォルトでは、クラスター(ノードで実行されているノードとポッド)からホストへの接続を保護するためのデフォルトの動作モードは、信頼できないネットワークやパブリックネットワークで実行できます。
クラスターへのマスターノード
メインサーバー(apiserver)からクラスターへの2つの主要な通信パスがあります。1つ目は、apiserverから、クラスター内の各ノードで実行されているkubeletプロセスまでです。2つ目は、apiserverから、apiserverのプロキシー機能を介して任意のノード、ポッド、またはサービスへです。
apiserverからkubelet
apiserverからkubeletへの接続は、次の目的で使用されます。
- ポッドのログを取得します。
- (kubectl経由)実行中のポッドに接続されています。
- kubectlポート転送機能を提供します。
これらの接続は、kubeletのHTTPSエンドポイントで終了します。デフォルトでは、apiserverはkubeletのサービス証明書を検証しません。これにより、接続が中間者攻撃にさらされ、信頼できないネットワークやパブリックネットワークで実行できなくなります。
接続を確認するために、使用する--kubelet-certificate-authority
サービス証明書kubeletの検証のために、apiserverバンドルにルート証明書を提供するフラグ。
これが不可能な場合は、apiserverとkubeletの間でSSHチャネルを使用し(必要な場合)、信頼できないネットワークまたはパブリックネットワークを介した接続を回避します。
最後に、kubelet APIを保護するために、Kubeletの認証または承認(あるいは ~~にご注意ください)を有効にする必要があります。
ノード、ポッド、サービスへのapiserver
apiserverからノード、ポッド、またはサービスへの接続は、デフォルトで純粋なHTTP接続になるため、認証も暗号化もされません。ノードによってフロントポッド名、サービス名等におけるAPIのURLに追加しhttps:
、安全なHTTPS接続でそれらを実行するために、彼らはHTTPSエンドポイントが提供する証明書を検証していない、それはクライアントの資格情報を提供することはありません、接続が暗号化されます、完全性を保証するものではありません。これらの接続は現在、信頼できないネットワークやパブリックネットワーク上では安全ではありません。
SSHトンネル
KubernetesはSSHチャネルをサポートして、マスターノード->クラスター通信パスを保護します。この構成では、apiserverはクラスター内の各ノードのSSHチャネル(ポート22でリッスンするSSHサーバーに接続)を開始し、kubelet、ノード、ポッド、またはサービスを宛先とするすべてのトラフィックをチャネル経由で渡します。このチャネルは、ノードが実行されているネットワークの外部にトラフィックが公開されないようにします。
現在、SSHチャネルは推奨されていません。そのため、私たちが何をしているのかわからない場合は、使用しないでください。Konnectivityは、この通信チャネルの代替として機能します。
Konnectivityサービス
機能ステータス:Kubernetes v1.18
beta
SSHチャネルの代わりに、Konnectivityサービスはマスター->クラスター通信用のTCPレベルのプロキシを提供します。Konnectivityは、メインネットワークとクラスターネットワークで実行されているKonnectivityサーバーとKonnectivityエージェントの2つの部分で構成されています。KonnectivityエージェントはKonnectivityサーバーとの接続を開始し、接続を維持します。次に、すべてのマスターノード->クラスター通信がこれらの接続を経由します。
クラスターでのセットアップ方法については、Konnectivity Service Setupを参照してください(~~をお待ちください)。