컨트롤 플레인-노드 통신

컨트롤 플레인-노드 통신 (Control Plane-Node Communication)

이 문서는 컨트롤 플레인과 쿠버네티스 노드 사이의 통신 경로를 목록으로 정리해요. 의도는 사용자가 네트워크 구성을 강화하도록 설치를 사용자 정의해, 클러스터를 신뢰할 수 없는 네트워크(또는 클라우드 제공자의 완전히 공개된 IP)에서 실행할 수 있게 하는 것입니다.

출처: 문서

본문

노드 → 컨트롤 플레인

쿠버네티스는 "hub-and-spoke" API 패턴을 가집니다. 노드(또는 그들이 실행하는 파드)의 모든 API 사용은 API 서버에서 종료됩니다. 다른 컨트롤 플레인 구성 요소는 원격 서비스를 노출하도록 설계되지 않았습니다. API 서버는 하나 이상의 형태의 클라이언트 인증이 활성화된 보안 HTTPS 포트(보통 443)에서 원격 연결을 수신하도록 구성됩니다. 특히 익명 요청이나 서비스 계정 토큰이 허용된다면, 하나 이상의 형태의 권한 부여도 활성화해야 합니다.

노드는 클러스터의 공개 루트 인증서로 프로비저닝되어 유효한 클라이언트 자격 증명과 함께 API 서버에 안전하게 연결할 수 있어야 합니다. 좋은 접근 방식은 kubelet에 제공되는 클라이언트 자격 증명이 클라이언트 인증서 형태인 것입니다. kubelet 클라이언트 인증서의 자동 프로비저닝은 kubelet TLS 부트스트래핑을 참조하세요.

API 서버에 연결하려는 파드는 서비스 계정을 활용해 안전하게 그렇게 할 수 있습니다. 쿠버네티스가 파드가 인스턴스화될 때 공개 루트 인증서와 유효한 베어러 토큰을 자동으로 주입하기 때문입니다. kubernetes 서비스(default 네임스페이스)는 API 서버의 HTTPS 엔드포인트로 (kube-proxy를 통해) 리디렉션되는 가상 IP 주소로 구성됩니다.

컨트롤 플레인 구성 요소도 보안 포트를 통해 API 서버와 통신합니다.

결과적으로 노드와 노드에서 실행되는 파드에서 컨트롤 플레인으로의 연결의 기본 운영 모드는 기본적으로 보안되며, 신뢰할 수 없는 및/또는 공개 네트워크에서 실행될 수 있습니다.

컨트롤 플레인 → 노드

컨트롤 플레인(API 서버)에서 노드로의 두 가지 주요 통신 경로가 있습니다. 첫 번째는 API 서버에서 클러스터의 각 노드에서 실행되는 kubelet 프로세스로의 경로입니다. 두 번째는 API 서버의 프록시 기능을 통해 API 서버에서 모든 노드, 파드 또는 서비스로의 경로입니다.

API 서버에서 kubelet으로

API 서버에서 kubelet으로의 연결은 다음에 사용됩니다:

  • 파드 로그 가져오기.
  • (보통 kubectl을 통해) 실행 중인 파드에 연결(attach).
  • kubelet의 포트 포워딩 기능 제공.

이 연결은 kubelet의 HTTPS 엔드포인트에서 종료됩니다. 기본적으로 API 서버는 kubelet의 제공 인증서를 검증하지 않으므로, 이 연결은 중간자(man-in-the-middle) 공격에 노출되며 신뢰할 수 없는 및/또는 공개 네트워크에서 실행하기에 안전하지 않습니다.

이 연결을 검증하려면 --kubelet-certificate-authority 플래그를 사용해 API 서버에 kubelet의 제공 인증서를 검증하는 데 사용할 루트 인증서 번들을 제공하세요.

그것이 불가능하다면, 신뢰할 수 없는 또는 공개 네트워크를 통해 연결하는 것을 피해야 할 때 필요에 따라 API 서버와 kubelet 사이에 SSH 터널링을 사용하세요.

마지막으로, kubelet API를 보호하려면 Kubelet 인증 및/또는 권한 부여를 활성화해야 합니다.

API 서버에서 노드, 파드, 서비스로

API 서버에서 노드, 파드 또는 서비스로의 연결은 기본적으로 일반 HTTP 연결이며, 따라서 인증되지 않고 암호화되지도 않습니다. API URL에서 노드, 파드 또는 서비스 이름에 https:를 붙여 안전한 HTTPS 연결로 실행될 수 있지만, HTTPS 엔드포인트가 제공하는 인증서를 검증하지 않으며 클라이언트 자격 증명도 제공하지 않습니다. 그래서 연결이 암호화되긴 하지만 무결성에 대한 보장은 제공하지 않습니다. 이러한 연결은 신뢰할 수 없는 또는 공개 네트워크에서 실행하기에 현재 안전하지 않습니다.

SSH 터널

쿠버네티스는 컨트롤 플레인에서 노드로의 통신 경로를 보호하기 위해 SSH 터널을 지원합니다. 이 구성에서 API 서버는 클러스터의 각 노드에 SSH 터널을 시작하고(22 포트에서 수신하는 SSH 서버에 연결), kubelet, 노드, 파드 또는 서비스로 향하는 모든 트래픽을 터널을 통해 전달합니다. 이 터널은 트래픽이 노드가 실행되는 네트워크 밖에 노출되지 않도록 보장합니다.

SSH 터널은 현재 더 이상 사용되지 않으므로(deprecated), 무엇을 하는지 알지 못한다면 옵트인해서 사용하면 안 됩니다. Konnectivity 서비스가 이 통신 채널의 대체품입니다.

Konnectivity 서비스

SSH 터널의 대체품으로 Konnectivity 서비스는 컨트롤 플레인에서 클러스터 통신을 위한 TCP 수준 프록시를 제공합니다. Konnectivity 서비스는 두 부분으로 구성됩니다: 컨트롤 플레인 네트워크의 Konnectivity 서버와 노드 네트워크의 Konnectivity 에이전트. Konnectivity 에이전트가 Konnectivity 서버에 연결을 시작하고 네트워크 연결을 유지합니다. Konnectivity 서비스를 활성화하면 모든 컨트롤 플레인에서 노드로의 트래픽이 이 연결들을 통해 이동합니다.

클러스터에서 Konnectivity 서비스를 설정하려면 Konnectivity 서비스 작업을 따르세요.

더 알아보기 (Learn more)