Kubernetes 클러스터의 워커 노드에서 Kubelet은 배의 선장과 같습니다. Kubelet은 컨테이너를 적재하고 내리는 작업을 지휘하며, 클러스터의 상태를 지속적으로 모니터링하고 보고하는 역할을 합니다. 하지만 선장이 잘못된 지시를 받는다면 클러스터 전체의 안전과 보안에 큰 문제가 생길 수 있습니다. 이 글에서는 Kubelet과 Kube-apiserver 간의 통신 보안을 보장하는 방법을 살펴보겠습니다.
Kubelet은 Kubernetes 클러스터의 워커 노드에서 다음과 같은 역할을 수행합니다:
Kubelet을 설치하고 구성하려면 기본적으로 Kubelet 바이너리를 다운로드하고 서비스로 실행되도록 설정해야 합니다. Kubeadm 도구는 클러스터 부트스트랩을 자동화하지만, 워커 노드에서 Kubelet은 수동으로 설치해야 합니다.
Kubelet은 다양한 설정 옵션을 가지고 있으며, 대부분의 매개변수는 Kubelet 구성 파일로 이동되었습니다. 이 파일의 경로는 일반적으로 /var/lib/kubelet/config.yaml
입니다. 이 파일을 통해 Kubelet의 매개변수와 설정을 확인하고 수정할 수 있습니다. 예를 들어, 네트워크 플러그인 버전, 클러스터 도메인, 클러스터 DNS 등의 세부 사항이 설정됩니다.
명령줄 인수로 지정된 플래그는 Kubelet 구성 파일의 값을 재정의합니다. 따라서 Kubeadm을 사용하여 클러스터를 설정하는 경우, Kubeadm은 Kubelet 구성 파일을 자동으로 생성하고 이를 통해 Kubelet을 설정할 수 있습니다.
Kubelet은 기본적으로 두 개의 포트를 통해 서비스를 제공합니다.
1. 포트 10250: 전체 액세스를 허용하는 Kubelet API 서버
2. 포트 10255: 인증되지 않은 읽기 전용 액세스를 허용하는 API
기본 설정에서는 포트 10250과 10255 모두 익명 액세스를 허용합니다. 이는 보안상 큰 위협이 될 수 있습니다. 이를 방지하기 위해 다음과 같은 보안 조치를 취할 수 있습니다.
Kubelet 서비스 구성 파일에서 --anonymous-auth
플래그를 false
로 설정하여 익명 인증을 비활성화할 수 있습니다:
authentication:
anonymous:
enabled: false
Kubelet은 인증서 기반 인증과 API bearer 토큰 기반 인증을 지원합니다. 인증서 기반 인증을 설정하려면 클라이언트 CA 파일 경로를 Kubelet 서비스에 제공해야 합니다:
authentication:
x509:
clientCAFile: "/path/to/client-ca.crt"
API 서버도 Kubelet의 클라이언트로 인증서를 사용해야 합니다. 이를 위해 Kube-apiserver 서비스 구성에서 -kubelet-client-certificate
-kubelet-client-key
플래그를 설정해야 합니다.
Kubelet의 기본 승인 모드는 모든 요청을 허용하는 AlwaysAllow
입니다. 이를 Webhook
으로 설정하여 Kube-apiserver에서 각 요청을 승인하도록 설정할 수 있습니다:
authorization:
mode: Webhook
포트 10255에서 제공되는 읽기 전용 서비스는 기본적으로 활성화되어 있으며, 이를 비활성화하려면 --read-only-port
를 0
으로 설정해야 합니다. Kubelet 구성 파일에서는 기본적으로 이 포트가 0으로 설정되어 있습니다:
readOnlyPort: 0
Kubelet의 보안을 강화하려면 다음과 같은 조치를 취해야 합니다:
이러한 설정은 Kubelet 구성 파일을 통해 관리할 수 있으며, 이를 통해 클러스터의 보안을 더욱 강화할 수 있습니다. Kubelet의 현재 구성을 확인하고 필요한 보안 조치를 적용하여 안전한 Kubernetes 환경을 구축하세요.