[CKS] 1-12. Bootstrap token for authentication & Service Account token and use it to access API server Lab
kubeadm 부트스트랩 토큰으로 워커 노드를 안전하게 추가하고 초기 역할을 부여하며, RBAC를 통해 클러스터 전반의 권한을 정교하게 관리합니다.
개요
kubernetes 워커 노드가 어떻게 조인할 수 있는지 랩을 통해 확인했습니다.
Hands-on
kubeadm 부트스트랩 토큰(Bootstrap Token)을 생성하는 Secret
리소스입니다.
토큰은 새로운 워커 노드(Worker Node)를 쿠버네티스 클러스터에 안전하게 추가(kubeadm join
)할 때 사용합니다.
apiVersion: v1
kind: Secret
metadata:
# Name MUST be of form "bootstrap-token-<token id>"
name: bootstrap-token-07401b
namespace: kube-system
# Type MUST be 'bootstrap.kubernetes.io/token'
type: bootstrap.kubernetes.io/token
stringData:
# Human readable description. Optional.
description: "The default bootstrap token generated by 'kubeadm init'."
# Token ID and secret. Required.
token-id: 07401b
token-secret: f395accd246ae52d
# Expiration. Optional.
expiration: 2017-03-10T03:22:11Z
# Allowed usages.
usage-bootstrap-authentication: "true"
usage-bootstrap-signing: "true"
# Extra groups to authenticate the token as. Must start with "system:bootstrappers:"
auth-extra-groups: system:bootstrappers:worker,system:bootstrappers:ingress
auth-extra-groups: system:bootstrappers:worker,system:bootstrappers:ingress
(핵심 특징)
- 이 토큰을 사용해서 클러스터에 참여하는 노드는 기본 부트스트랩 그룹 외에, 추가적으로
system:bootstrappers:worker
system:bootstrappers:ingress
두 그룹의 멤버로 인증됩니다.- 다시말해 워커 노드와 인그레스 노드 역할을 할 수 있는, 특정 그룹 멤버십을 가진" 부트스트랩 토큰을 선언적으로 생성한 것과 유사합니다.
kubeadm token create 07401a.f395accd246ae52e --dry-run --print-join-command --ttl 2h
- 토큰 생성 확인:
kubeadm token create [토큰값] --dry-run
- 인증서 해시 출력: 토큰 생성이 성공했기 때문에,
-print-join-command
옵션이 "서비스" 차원에서join
에 필요한 클러스터의 고유한 CA 인증서 해시값을 자동으로 가져와 완성된 명령어 출력
이는 노드가 마스터에 조인하기 위한 과정을 확인하기 위한 것입니다.
부트스트랩 토큰은 새로운 노드를 '안전하게' 추가하는 표준 방식으로 사용됩니다.
- 제한된 권한:
- 이 토큰은 새 노드가 클러스터에 합류하기 위한 TLS 부트스트랩 과정에 필요한 최소한의 권한만 가지고 있습니다.
- 관리자 권한을 부여하지 않습니다.
- 서버 신원 확인:
-discovery-token-ca-cert-hash
와 함께 사용되어, 노드가 연결하려는 컨트롤 플레인이 진짜인지 검증함으로써 중간자 공격(Man-in-the-Middle attack)을 방지합니다.
Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-service-account
namespace: default
secrets:
- name: my-service-account-token
---
apiVersion: v1
kind: Secret
metadata:
name: my-service-account-token
namespace: default
annotations:
kubernetes.io/service-account.name: "my-service-account"
type: kubernetes.io/service-account-token
kubectl create rolebinding read-pods --serviceaccount=default:my-service-account --role=pod-reader
Role
(일반 Role): 특정 네임스페이스(Namespace) 하나에만 적용되는 권한입니다.ClusterRole
: 클러스터 전체에 적용되는 권한입니다.
<1. Role (네임스페이스 범위의 역할)>
Role
은 특정 네임스페이스 안에 존재하는 리소스(예: Pod, Deployment, Service 등)에 대한 권한을 정의합니다.
- 특징:
- 반드시 특정 네임스페이스 안에 생성되고, 해당 네임스페이스에만 영향을 줍니다.
- 예를 들어,
development
네임스페이스에pod-reader
라는Role
을 만들면, 이 역할은development
네임스페이스의 Pod에만 접근할 수 있고,production
네임스페이스의 Pod에는 접근할 수 없습니다.
- 연결 방법:
RoleBinding
을 사용하여 특정 사용자(User), 그룹(Group), 또는 서비스 어카운트(ServiceAccount)에게 해당 네임스페이스 내에서Role
의 권한을 부여합니다.
- 사용 사례:
- "개발팀 멤버 'Alice'가
development
네임스페이스의 Pod 로그만 볼 수 있게 하고 싶다." - "특정 애플리케이션의 서비스 어카운트가 자신이 속한
app-ns
네임스페이스의ConfigMap
만 읽을 수 있게 하고 싶다."
- "개발팀 멤버 'Alice'가
# "dev" 네임스페이스에만 적용되는 Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: dev # 이 Role은 'dev' 네임스페이스에 속함
name: pod-reader
rules:
- apiGroups: [""] # ""는 core API 그룹을 의미
resources: ["pods"]
verbs: ["get", "watch", "list"]
<2. ClusterRole (클러스터 범위의 역할)>
ClusterRole
은 Role
과 기능적으로 동일하지만, 범위가 클러스터 전체입니다. 두 가지 중요한 목적을 가집니다.
- 클러스터 범위 리소스에 대한 권한 정의:
- 노드(Nodes), 퍼시스턴트 볼륨(PersistentVolumes), 네임스페이스(Namespaces) 자체와 같이 네임스페이스에 속하지 않는 리소스에 대한 권한을 부여하려면 반드시
ClusterRole
을 사용해야 합니다.
- 노드(Nodes), 퍼시스턴트 볼륨(PersistentVolumes), 네임스페이스(Namespaces) 자체와 같이 네임스페이스에 속하지 않는 리소스에 대한 권한을 부여하려면 반드시
- 모든 네임스페이스의 리소스에 대한 권한 정의:
- 클러스터 관리자가 모든 네임스페이스의 Pod를 관리해야 하는 경우처럼, 여러 네임스페이스에 걸쳐 동일한 권한을 부여하고 싶을 때 사용합니다.
- (매번 네임스페이스마다
Role
을 만들 필요가 없어 편리합니다.)
- (매번 네임스페이스마다
- 클러스터 관리자가 모든 네임스페이스의 Pod를 관리해야 하는 경우처럼, 여러 네임스페이스에 걸쳐 동일한 권한을 부여하고 싶을 때 사용합니다.
- 연결 방법:
RoleBinding
을 사용하면:ClusterRole
의 권한을 특정 네임스페이스 하나에만 부여할 수 있습니다.- 예:
view
라는ClusterRole
을 'Bob'에게staging
네임스페이스에서만 적용
- 예:
ClusterRoleBinding
을 사용하면:ClusterRole
의 권한을 클러스터 전체에 부여할 수 있습니다.- 예:
cluster-admin
이라는ClusterRole
을 관리자 그룹에게 클러스터 전체에 적용
- 예:
- 사용 사례:
- "클러스터 관리자가 클러스터의 모든 노드 상태를 확인할 수 있게 하고 싶다."
- (
Node
는 클러스터 범위 리소스)
- (
- "모니터링 시스템이 클러스터의 모든 네임스페이스에 있는 서비스(Service)와 파드(Pod) 정보를 수집할 수 있게 하고 싶다."
- "모든 개발자가 클러스터에 어떤 네임스페이스들이 있는지 목록을 볼 수 있게 하고 싶다.”
- (
Namespace
는 클러스터 범위 리소스)
- (
- "클러스터 관리자가 클러스터의 모든 노드 상태를 확인할 수 있게 하고 싶다."
k config view --raw