kubernetes에서 kubectl 같이 클라이언트나 파드 내부에서 API 서버에 접근할 때는 인증과 권한이 필요
접근 제어
User/Group → 인증
- 인증서는 클라이언트 신원을 확인하는 데 사용
- ex)
kubectl get nodes실행 시 사용자 인증 필요
- ex)
- 인증서(certificate)를 kubeconfig에 등록하여 사용
ServiceAccount → 권한
- 파드 내부에서 쿠버네티스 API를 호출할 때 사용
- Pod 실행 시 자동으로 토큰이
/var/run/secrets/kubernetes.io/serviceaccount/token에 마운트
- Pod 실행 시 자동으로 토큰이
- 파드 내부에서 자동으로 마운트되거나 Secret을 통해 주입
사용자 생성 절차
개인키 생성
CSR 생성
CSR 요청 및 승인
1 2kubectl apply -f csr.yaml kubectl certificate approve myuser-csrRole/RoleBinding 생성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: read-pods namespace: default subjects: - kind: User name: myuser roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.iokubeconfig에 사용자 추가
1kubectl config set-credentials myuser --client-certificate=user.crt --client-key=user.keycontext 변경
1 2kubectl config set-context myuser-context --cluster=mycluster --namespace=default --user=myuser kubectl config use-context myuser-context
서비스 어카운트 생성 절차
서비스 어카운트 생성
1kubectl create serviceaccount mysa -n defaultRolebinding 생성
1 2 3 4 5 6 7 8 9 10 11 12 13kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: sa-read-pods namespace: default subjects: - kind: ServiceAccount name: mysa namespace: default roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.iopod 실행시 서비스 어카운트 지정
1 2 3 4 5 6 7 8 9 10apiVersion: v1 kind: Pod metadata: name: test-pod spec: serviceAccountName: mysa containers: - name: curl image: curlimages/curl command: ["sleep", "3600"]
권한 관리(RBAC)
- Role
- 네임스페이스 단위 권한
- ex) default namespace에서 pod 읽기
- 네임스페이스 단위 권한
- RoleBinding
- Role을 특정 User/Group/ServiceAccount에 바인딩
- ClusterRole
- 클러스터 전체 권한
- ex) 모든 namespace에서 pod 읽기
- 클러스터 전체 권한
- ClusterRoleBinding
- ClusterRole을 User/Group/ServiceAccount에 바인딩