Kubelet 인증/인가
개요
kubelet의 HTTPS 엔드포인트는 다양한 민감도의 데이터에 대한 접근을 제공하는 API를 노출하며, 노드와 컨테이너 내에서 다양한 수준의 권한으로 작업을 수행할 수 있도록 허용한다.
이 문서는 kubelet의 HTTPS 엔드포인트에 대한 접근을 인증하고 인가하는 방법을 설명한다.
Kubelet 인증
기본적으로, 다른 구성의 인증 방법에 의해 거부되지 않은 kubelet의 HTTPS 엔드포인트에 대한 요청은
익명의 요청으로 처리되며, system:anonymous
의 사용자 이름과 system:unauthenticated
의 그룹이 부여된다.
익명의 접근을 비활성화하고 인증되지 않은 요청에 401 Unauthorized
응답을 보내려면 아래를 참고한다.
--anonymous-auth=false
플래그로 kubelet을 시작
kubelet의 HTTPS 엔드포인트에 대한 X509 클라이언트 인증서 인증을 활성화하려면 아래를 참고한다.
--client-ca-file
플래그로 kubelet을 시작하면 클라이언트 인증서를 확인할 수 있는 CA 번들을 제공--kubelet-client-certificate
및--kubelet-client-key
플래그로 apiserver를 시작- 자세한 내용은 apiserver 인증 문서를 참고
API bearer 토큰(서비스 계정 토큰 포함)을 kubelet의 HTTPS 엔드포인트 인증에 사용하려면 아래를 참고한다.
- API 서버에서
authentication.k8s.io/v1beta1
API 그룹이 사용 가능한지 확인 --authentication-token-webhook
및--kubeconfig
플래그로 kubelet을 시작- kubelet은 구성된 API 서버의
TokenReview
API를 호출하여 bearer 토큰에서 사용자 정보를 결정
Kubelet 승인
성공적으로 인증된 모든 요청(익명 요청 포함)이 승인된다. 기본 인가 모드는 모든 요청을 허용하는 AlwaysAllow
이다.
kubelet API에 대한 접근을 세분화하는 데는 다양한 이유가 있다.
- 익명 인증을 사용할 수 있지만, 익명 사용자의 kubelet API 호출 기능은 제한되어야 함
- bearer 토큰 인증을 사용할 수 있지만, 임의의 API 사용자(API 계정)의 kubelet API 호출 기능은 제한되어야 함
- 클라이언트 인증을 사용할 수 있지만, 구성된 CA에서 서명한 일부 클라이언트 인증서만 kubelet API를 사용하도록 허용해야 함
kubelet API에 대한 접근을 세분화하려면 API 서버에 권한을 위임한다.
authorization.k8s.io/v1beta1
API 그룹이 API 서버에서 사용 가능한지 확인--authorization-mode=Webhook
및--kubeconfig
플래그로 kubelet을 시작- kubelet은 구성된 API 서버의
SubjectAccessReview
API를 호출하여 각각의 요청이 승인되었는지 여부를 확인
kubelet은 API 요청을 apiserver와 동일한 요청 속성 접근 방식을 사용하여 승인한다.
동사는 들어오는 요청의 HTTP 동사로부터 결정된다.
HTTP 동사 | 요청 동사 |
---|---|
POST | create |
GET, HEAD | get |
PUT | update |
PATCH | patch |
DELETE | delete |
리소스 및 하위 리소스는 들어오는 요청의 경로로부터 결정된다.
Kubelet API | 리소스 | 하위 리소스 |
---|---|---|
/stats/* | nodes | stats |
/metrics/* | nodes | metrics |
/logs/* | nodes | log |
/spec/* | nodes | spec |
all others | nodes | proxy |
네임스페이스와 API 그룹 속성은 항상 빈 문자열이며,
리소스 이름은 항상 kubelet의 Node
API 오브젝트 이름이다.
이 모드로 실행할 때, --kubelet-client-certificate
및 --kubelet-client-key
플래그로 식별된 사용자에게
다음 속성에 대한 권한이 있는지 확인한다.
- verb=*, resource=nodes, subresource=proxy
- verb=*, resource=nodes, subresource=stats
- verb=*, resource=nodes, subresource=log
- verb=*, resource=nodes, subresource=spec
- verb=*, resource=nodes, subresource=metrics