CKA

[CKA] Cluster Architecture, Installation & Configuration (2)

테런 2023. 5. 14. 01:01
  • CKA 시험 비중 (25%)
  • API 인증: RBAC
* API 서버에 접근하기 위해서는 인증 작업이 필요
* Role-based Access Control(RBAC, 역할 기반 액세스 제어)
* User: 클러스터 외부에서 쿠버네티스를 조작하는 사용자 인증 (kubectl 명령어) -> cat .kube/config
* Service Account: Pod가 쿠버네티스 API를 다룰 때 사용하는 계정
kubectl get secrets -> 토큰을 확인할 수 있다.

 

  • Role & RoleBinding
* 특정 유저나 ServiceAccount가 접근하려는 API에 접근 권한을 설정
* 권한 있는 User만 접근하도록 허용
* 권한 제어
* Role
1. 어떤 API를 이용할 수 있는지의 정의
2. 쿠버네티스의 사용 권한을 정의
3. 지정된 네임스페이스에서만 유효
* RoleBinding
1. 사용자/그룹 또는 Service Account와 Role을 연결

 

  • Cluster Role & RoleBinding
* 기본 Role & RoleBinding는 네임스페이스에 속한다.
* Cluster Role & RoleBinding 모든 네임스페이스에서 가능하다.

 

  • 실습1
애플리케이션 운영 중 특정 네임스페이스의 Pod들을 모니터할 수 있는 서비스가 요청되었습니다. api-access 네임스페이스의 모든 Pod를 view할 수 있도록 다음의 작업을 진행하세요.
* api-access라는 새로운 네임스페이스에 pod-viewer라는 이름의 Service Account를 만듭니다.
* podreader-role이라는 이름의 Role과 podreader-rolebinding이라는 이름의 RoleBinding을 만듭니다.
* 앞서 생성한 ServiceAccount를 API resource Pod에 대하여 watch, list, get을 허용하도록 매핑하세요.
# https://kubernetes.io/docs/reference/access-authn-authz/rbac/
$ kubectl create role podreader-role --verb=get --verb=list --verb=watch --resource=pods --namespace api-access

$ kubectl get role -n api-access
NAME             CREATED AT
podreader-role   2023-05-13T14:30:57Z

$ kubectl create rolebinding podreader-rolebinding --role=podreader-role --serviceaccount=api-access:pod-viewer --namespace=api-access
rolebinding.rbac.authorization.k8s.io/podreader-rolebinding created

$ kubectl get rolebindings -n api-access
NAME                    ROLE                  AGE
podreader-rolebinding   Role/podreader-role   14s

$ kubectl describe rolebindings podreader-rolebinding -n api-access
Name:         podreader-rolebinding
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  Role
  Name:  podreader-role
Subjects:
  Kind            Name        Namespace
  ----            ----        ---------
  ServiceAccount  pod-viewer  api-access

 

  • 실습2
애플리케이션 배포를 위해 새로운 ClusterRole을 생성하고, 특정 네임스페이스의 ServiceAccount를 바인드하세요.
* 다음의 resource type에서만 Create가 허용된 ClusterRole deployment-clusterrole을 생성합니다.
Resource Type: Deployment StatefulSet DaemonSet
* 미리 생성된 네임스페이스 api-access에 cicd-token이라는 새로운 ServiceAccount를 만듭니다.
* ClusterRole deployment-clusterrole을 네임스페이스 api-access로 제한된 새 ServiceAccount cicd-token에 바인딩합니다.
$ kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployment,statefulSet,daemonSet
clusterrole.rbac.authorization.k8s.io/deployment-clusterrole created # 네임스페이스 필요없다.

$ kubectl get clusterrole deployment-clusterrole 
NAME                     CREATED AT
deployment-clusterrole   2023-05-13T14:58:03Z

$ kubectl describe clusterrole deployment-clusterrole 
Name:         deployment-clusterrole
Labels:       <none>
Annotations:  <none>
PolicyRule:
  Resources          Non-Resource URLs  Resource Names  Verbs
  ---------          -----------------  --------------  -----
  daemonsets.apps    []                 []              [create]
  deployments.apps   []                 []              [create]
  statefulsets.apps  []                 []              [create]
  
$ kubectl create sa cicd-token -n api-access
serviceaccount/cicd-token created

$ kubectl create clusterrolebinding deployment-clusterrolebinding --clusterrole=deployment-clusterrole --serviceaccount=api-access:cicd-token
clusterrolebinding.rbac.authorization.k8s.io/deployment-clusterrolebinding created

$ kubectl get clusterrolebindings deployment-clusterrolebinding 
NAME                            ROLE                                 AGE
deployment-clusterrolebinding   ClusterRole/deployment-clusterrole   33s

$ kubectl describe clusterrolebindings deployment-clusterrolebinding
Name:         deployment-clusterrolebinding
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  ClusterRole
  Name:  deployment-clusterrole
Subjects:
  Kind            Name        Namespace
  ----            ----        ---------
  ServiceAccount  cicd-token  api-access

 

  • 실습3
CSR(Certificate Signing Request)를 통해 app-manager 인증서를 발급받은 user app-manager에게 cluster내 모든 namespace의 deployment, pod, service 리소스를 create, list, get, update, delete 할 수 있는 권한을 할당하세요.
* user name: app-manager
* certificate name: app-manager
* clusterRole name: app-access
* clusterRoleBinding name: app-access-binding
# https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/

$ openssl genrsa -out app-manager.key 2048
openssl req -new -key app-manager.key -out app-manager.csr -subj "/CN=app-manager"

$ cat app-manager.csr | base64 | tr -d "\n"

$ vi app-manager.yaml
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: app-manager
spec:
  request: {cat app-manager.csr | base64 | tr -d "\n" 결과값 입력}
  signerName: kubernetes.io/kube-apiserver-client
  usages:
  - client auth

$ kubectl apply -f app-manager.yaml
certificatesigningrequest.certificates.k8s.io/app-manager created

# 아직 Pending 상태이다. 승인을 해줘야한다.
$ kubectl get csr
NAME          AGE   SIGNERNAME                            REQUESTOR       REQUESTEDDURATION   CONDITION
app-manager   32s   kubernetes.io/kube-apiserver-client   minikube-user   <none>              Pending

$ kubectl certificate approve app-manager 
certificatesigningrequest.certificates.k8s.io/app-manager approved

$ kubectl get csr                        
NAME          AGE   SIGNERNAME                            REQUESTOR       REQUESTEDDURATION   CONDITION
app-manager   86s   kubernetes.io/kube-apiserver-client   minikube-user   <none>              Approved,Issued

$ kubectl get csr/app-manager -o yaml

# 인증서 생성 완료
$ kubectl get csr app-manager -o jsonpath='{.status.certificate}'| base64 -d > app-manager.crt

$ kubectl create clusterrole app-access --verb=create,list,get,update,delete --resource=deployment,pod,service
clusterrole.rbac.authorization.k8s.io/app-access created

$ kubectl create clusterrolebinding app-access-binding --clusterrole=app-access --user=app-manager
clusterrolebinding.rbac.authorization.k8s.io/app-access-binding created

# 확인하는 과정
$ kubectl config set-credentials app-manager --client-key=app-manager.key --client-certificate=app-manager.crt --embed-certs=true
User "app-manager" set.

$ kubectl config view

$ kubectl config set-context app-manager --cluster=kubernetes --user=app-manager
Context "app-manager" created.

$ cka kubectl config view

$ kubectl config use-context app-manager
Switched to context "app-manager".

 

출처: TTABAE-LEARN - 이성미 강사

'CKA' 카테고리의 다른 글

[CKA] Storage  (2) 2023.05.14
[CKA] Workloads & Scheduling  (0) 2023.05.14
[CKA] Cluster Architecture, Installation & Configuration (1)  (0) 2023.05.13
[CKA] Troubleshooting  (0) 2023.05.13
[CKA] Services & Networking  (2) 2023.05.07