티스토리 뷰

 

쿠버네티스 API 요청 과정

 

간단하게 API Server에 접근하기 까지 프로세스를 보면,

 

첫번째, 요청을 보냈을 때 인증(Authentication) 과정을 거친다. 

"너는 k8s cluster에 등록된 사용자가 맞는거지?"

 

두번째, 인증 과정을 통과한 후 인가(Authorization) 과정을 거친다.

"등록된 사용자는 맞고 이 액션을 할 수 있는 권한은 있니?"

 

세번째, 인증과 인가를 통과하게 되면 Admission Control을 거친다.

"너가 보낸 요청을 적절한지 확인해볼까?"

 

이 과정을 무사히 마치면 "요청 승인"이 된다. 하지만 만약 한 과정이라도 적절치 않다면 "요청 반려"가 된다.

 

그럼 본격적으로 AWS EKS를 이용하여 만든 클러스터에 최초 생성한 IAM 사용자가 아닌 새롭게 만든 IAM 사용자를 추가해보겠다. 아래 링크를 클릭하면 AWS 공식문서로 이동할 수 있다.

 

 

클러스터의 사용자 또는 IAM 역할 관리 - Amazon EKS

"Error from server (NotFound): configmaps "aws-auth" not found"와 같은 오류가 발생할 경우, 앞의 절차를 통해 재고 ConfigMap을 적용합니다.

docs.aws.amazon.com

 

만약 EKS가 아닌 온프레미스 환경이나 커스텀으로 클러스터를 생성했을 경우 아래 설명하는 방법으로는 사용자를 추가할 수 있다. 이 부분에 대해서 추후 추가하겠다.


들어가기 앞서, 최초 클러스터 생성자가 아닌 다른 생성자가 접근 했을 시 진짜 클러스터에 접근이 안되는지 확인해보자

 

$ aws configure

 

자신의 access-key를 넣어 aws 접속 한 후 아래 명령어를 입력하게 되면,

$ kubectl get configmaps

이런 메시지가 나온다. 인증이 되지 않은 IAM 사용자여서 이런 메시지가 나오는 것이다. 진짜로 접근이 안된다.

 

그럼 이 IAM 사용자가 kubectl를 사용할 수 있게 해주겠다.

 

$ kubectl edit configmap -n kube-system aws-auth

 

apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - rolearn: <ARN of instance role (not instance profile)>
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes

 

그럼 위와 같이 출력된다. 이후 아래의 코드를 추가해준다. 기존에 있는건 절대 수정하시면 안된다.

data:
  mapRoles: |
    - rolearn: <arn:aws:iam::111122223333:role/eksctl-my-cluster-nodegroup-standard-wo-NodeInstanceRole-1WP3NUE3O6UCF>
      username: <system:node:{{EC2PrivateDNSName}}>
      groups:
        - <system:bootstrappers>
        - <system:nodes>
  mapUsers: |
    - userarn: <arn:aws:iam::111122223333:user/admin>
      username: <admin>
      groups:
        - <system:masters>
    - userarn: <arn:aws:iam::111122223333:user/ops-user>
      username: <ops-user>
      groups:
        - <system:masters>

 

groups에는 clusterbinding 또는 rolebinding을 넣어준다. 저 같은 경우 role과 rolebinding을 만들어주어 아래와 같이 해주었다.

 

수정한 부분을 저장한다. EKS 클러스터가 아닌 경우 crs, private.key, crt 만들어서 user를 추가해주지만 EKS를 사용함으로써 이러한 부분은 해주지 않아도 된다.

 

AWS 공식문서를 보면 아래와 같이 명시되어있다.

 

"Amazon EKS 클러스터를 생성할 경우, 클러스터를 생성하는 IAM 엔터티 사용자 또는 역할(예: 페더레이션 사용자)에는 제어 영역의 클러스터 RBAC 구성에 system:masters 권한이 자동으로 부여됩니다. 이 IAM 엔터티는 ConfigMap 또는 기타 표시되는 구성에 나타나지 않으므로 클러스터를 원래 생성한 IAM 엔터티를 추적해야 합니다. AWS 사용자나 역할에 클러스터와 상호 작용할 추가 권한을 부여하려면 Kubernetes 내에서 aws-auth ConfigMap을 편집해야 합니다."

 

따라서 $ kubectl get configMap --all-namespaces 명령어를 해도 최초 클러스터 생성 IAM 정보를 찾을 수 없다.

 

이후 아래 명령어를 하게 되면,

$ kubectl get nodes

Error from server (Forbidden): nodes is forbidden: ~~

 

라는 에러 메시지가 나온다. 방금 전이랑은 다른 메시지다. IAM 사용자를 aws-auth에 등록해줌으로써 이제 인증은 되었고, 인가가 안되서 나오는 메시지이다. 

 

그럼 이제 인가를 해보자.


인가 부분은 role과 rolebinding을 만들어주면 된다. 방금 aws-auth 부분에 groups를 추가했었는데 이 부분에 지금부터 만드는 rolebinding 이름을 넣어주면 된다.

 

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: guest:pods-get-list-role
rules:
- apiGroups:
  - ""
  resources: 
  - pods
  verbs:
  - get
  - list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: guest:pods-get-list-role-binding
  namespace: default
subjects:
- kind: User
  name: <username>
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: guest:pods-get-list-role
  apiGroup: rbac.authorization.k8s.io

 

위와 같은 yaml 파일을 만든 후 아래 명령어를 실행해 role과 rolebinding을 만들어준다.

 

$ kubectl apply -f role.yaml # yaml 파일이름은 만들어준 이름으로 지정해줘야한다.

 

이제 다시 터미널로 가서 아래 명령을 실행해보자

$ kubectl get pods

role에서 리소스를 pods 로 제한했기 때문에 pods에 대해서만 접근이 가능하다.

접근이 아주 잘되는 걸 확인 할 수 있다. 만약 service에 접근하게 된다면 아래와 같은 에러메시지가 출력된다.

 

이렇게 해서 EKS로 만든 클러스터에 IAM 사용자를 추가해주는 방법에 대해 알아보았다.

 

만약 default namespace가 아닌 사용자 namespace에도 이 인증인가를 적용하고 싶다면 사용자 namespace로 이동 후 role과 rolebinding을 만들어 준후 aws-auth groups에 추가해주면 된다.

댓글
댓글쓰기 폼
공지사항
Total
248,450
Today
825
Yesterday
1,065
링크
«   2022/10   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
글 보관함