'IAM'에 해당하는 글 3건

EKS 버전 업그레이드 (1.28 -> 1.31) 후에 대표 관리자를 제외한 부 관리자들이 EKS 모니터링 실행에 실패하는 현상이 나타났고, 실패 로그는 아래와 같았다.

 

Proxy request for clusterId="11115f91f1f9e3f0c97e4c3692f41111" to url="/apis/metrics.eks.amazonaws.com/v1" has statusCode=401
Proxy request for clusterId="11115f91f1f9e3f0c97e4c3692f41111" to url="/apis/metrics.eks.amazonaws.com/v1" failed with UNAUTHORIZED

 

aws-auth ConfigMap 에는 기존 버전 그대로 해당 사용자들의 권한이 명시되어 있었다.

 

  mapUsers: |
    - groups:
      - system:masters
      userarn: arn:aws:iam::111151101111:user/honggildong

 

 

다른 모든 api 권한은 문제가 없는데, 제어 플레인 (control plane) 메트릭 가져오는 api 만 인증되지 않았다는게 당최 어디서 설정을 해야 하는건지...

 

그렇게 찾다보니, EKS 액세스 관리 제어에 관련된 AWS 기술 블로그를 찾았다.
https://aws.amazon.com/ko/blogs/tech/a-deep-dive-into-simplified-amazon-eks-access-management-controls/

 

간소화된 Amazon EKS 액세스 관리 제어 톺아보기 | Amazon Web Services

본 블로그 포스트는 Sheetal Joshi, Rodrigo Bersa, Mike Stefaniak 님의 영문 블로그를 원문으로 한글 번역된 블로그 입니다.  소개 초기 Amazon Elastic Kubernetes Service (Amazon EKS) 출시 이후 클러스터에서 인증할

aws.amazon.com

 

기존의 액세스 권한 부여 방식이 복잡했기 때문에, 액세스 관리 제어 기능을 통해 AuthN(인증) / AuthZ(권한) 부분을 간소화 하였다는 내용이다.

 

EKS 관리 제어에 두가지 용어가 추가됐다.
- 액세스 항목(access entries) : IAM 사용자나 역할에 연결되어 EKS 클러스터를 인증 (AuthN)
- 액세스 정책(access policy) : 특정 클러스터 작업에 대한 EKS 만의 권한 부여 (AuthZ)

 

액세스 항목 + 액세스 정책 대신 기존의 RBAC(Role-Based Access Control: 역할 기반 액세스 제어) 의 권한 부여(ClusterRoleBinding) 와 결합하는 것도 가능하다.

 

 

 

특정 클러스터에의 사용자에게 권한을 주려면 액세스 항목에 IAM 사용자나 역할로 생성하고, 정책을 할당하여 특정 권한을 부여하는 프로세스 이다. (기존에는 위 예제처럼 ConfigMap 에 IAM 정보와 권한을 부여할 group 을 설정했었다.) 이 기능이 2024년 7월 경 오픈되었고 이 날 이후에 업그레이드된 클러스터에서는 인증/권한 설정에 대해 기존의 CONFIG_MAP, 새로운 API, 두가지 모두 사용 가능한 API_AND_CONFIG_MAP 모드를 선택하게 됐다. 이 문서에서는 기존 클러스터를 API_AND_CONFIG_MAP 인증 모드로 설정하고, 기존의 aws-auth configMap 에서 사용된 동일한 ID / 그룹을 지정하여 동등한 액세스 항목을 생성할 것을 권장하고 있다. access_entries / aws-auth 모두 설정되어 있을 경우, 우선순위는 액세스 항목 > ConfigMap 순이다. 또한 클러스터 뿐아닌 네임스페이스 레벨의 권한도 설정이 가능하다.

명령) 특정 클러스터에 IAM ARN 인증 및 권한 설정

 

$ aws eks create-access-entry --cluster-name <CLUSTER_NAME> \
  --principal-arn <IAM_PRINCIPAL_ARN>

$ aws eks associate-access-policy --cluster-name <CLUSTER_NAME> \
  --principal-arn <IAM_PRINCIPAL_ARN> \
  --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy
  --access-scope type=cluster

 

하지만 다 필요없고, EKS 대시보드에서 아주 간편하게 액세스 관리 제어를 설정할 수 있다...

 

 

EKS 액세스 항목에 부 관리자 IAM 설정하고, 정책(AmazonEKSClusterAdminPolicy) 연결해서 문제는 해결됐다. 하지만 위의 오류가 발생했던 이유는, 지금도 잘 모르겠다. 버전 업데이트 후에 액세스 관리 제어 설정이 안되어 있어서 configMap 에만 의존하고 있었을 것이고, ConfigMap 에 설정된 system:masters 권한이라면 기존과 동일하게 api 권한의 문제는 없었어야 했는데, 다른 api 는 다 되고 metric api 만 거부됐다는게...

 

몰라몰라~~

 

이제 aws-auth ConfigMap 에서 사용자 권한을 편집할 필요가 없어졌다. 추후 EKS 에서 ConfigMap 이 제거된다고 하니 액세스 관리 제어의 사용은 필수...

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

일반적으로 EKS cluster 를 생성한 계정 이외에 다른 IAM 사용자나 role 을 세분화하여 추가할 수 있으며, 심플한 사용자 추가를 진행해 보았다. 예전에 뭣 때문에 eksctl 을 설치했는지는 모르겠다만 땡큐~

 

eksctl 이 설치되어 있지 않다면... https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/eksctl.html

 

eksctl 설치 또는 업데이트 - Amazon EKS

GitTag 버전은 0.105.0 이상이어야 합니다. 그렇지 않은 경우 터미널 출력에서 설치 또는 업그레이드 오류가 있는지 확인하거나, 1단계의 주소를 https://github.com/weaveworks/eksctl/releases/download/v0.105.0/eksct

docs.aws.amazon.com

 

eksctl 을 이용하면 간단히 cluster 정보와 추가할 iam 계정의 arn, ClusterRoleBinding group 을 지정한다.

 

$ eksctl create iamidentitymapping \
    --cluster cluster-name \
    --region=ap-northeast-2 \
    --arn arn:aws:iam::111122223333:user/ggamzzak \
    --group system:masters \
    --profile my-profile

2022-08-02 17:25:32 [ℹ]  eksctl version 0.75.0
2022-08-02 17:25:32 [ℹ]  using region ap-northeast-2
2022-08-02 17:25:32 [ℹ]  adding identity "arn:aws:iam::111122223333:user/ggamzzak" to auth ConfigMap

 

"system:masters" 그룹의 자격 증명을 사용하면 cluster-admin 슈퍼유저의 역할을 바인딩하여 모든 작업을 수행할 수 있다.

 


 

configmap/aws-auth 를 확인하면 다음과 같이 추가되어 있다.

 

$ kubectl describe configmap -n kube-system aws-auth
Name:         aws-auth
Namespace:    kube-system
Labels:       <none>
Annotations:  <none>

Data
====
mapUsers:
----
- groups:
  - system:masters
  userarn: arn:aws:iam::111122223333:user/ggamzzak 

mapRoles:
...

 

또는,

 

$ eksctl get iamidentitymapping --cluster my-cluster --region=ap-northeast-2 --profile my-profile
2022-08-02 20:52:23 [ℹ]  eksctl version 0.75.0
2022-08-02 20:52:23 [ℹ]  using region ap-northeast-2
ARN                                                             USERNAME                        GROUPS                                                                          ACCOUNT
...
arn:aws:iam::111122223333:user/ggamzzak                                                         system:masters

 

추가된 IAM 계정으로 테스트 ㄱㄱ~

 

 

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

AWS 로드 밸런서 컨트롤러는 k8s ingress 를 생성할 때 ALB(Application Load Balancer) / NLB(Network Load Balancer) 를 생성해 주고 관리한다. ALB / NLB 가 필요하다면 배포해야 하는데 EKS 와 k8s 간에 로드 밸런서 관리 권한을 연결해야 한다. eksctl + cloudFormation 으로 자동 생성할 수도 있지만, aws 관리콘솔 + awscli + kubectl 을 사용하여 수동 설정했다.

 

 

IAM / ServiceAccount 설정

 

AWS 로드 밸런서 컨트롤러의 IAM 정책(사용자 대신 AWS API를 호출) 다운로드

- 버전 확인 : https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html

 

Installing the AWS Load Balancer Controller add-on - Amazon EKS

If you view the policy in the AWS Management Console, the console shows warnings for the ELB service, but not for the ELB v2 service. This happens because some of the actions in the policy exist for ELB v2, but not for ELB. You can ignore the warnings for

docs.aws.amazon.com

 

$ curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.3.0/docs/install/iam_policy.json

 

다운로드한 정책을 사용하여 IAM 정책 생성

 

$ aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy.json

 

IAM 자격증명 공급자 생성(AWS 관리콘솔)

 

  • 클러스터에서 OpenID Connect 공급자 URL 복사하여 지문/인증서 확인
  • 대상: sts.amazonaws.com

 

IAM 역할 생성(AWS 관리콘솔)

 

  • Web Identity > 생성한 자격증명 공급자 연결 > 정책 선택(AWSLoadBalancerControllerIAMPolicy) > 역할 이름 입력(AmazonEKSLoadBalancerControllerRole) 후 생성
  • 생성한 역할에서 [신뢰 관계] 편집

oidc.eks.ap-northeast-2.amazonaws.com/id/EXAMPLED123D4633E53DE1B716D3041E:aud /

sts.amazonaws.com.

   
oidc.eks.ap-northeast-2.amazonaws.com/id/EXAMPLED123D4633E53DE1B716D3041E:sub /

system:serviceaccount:kube-system:aws-load-balancer-controller

 

k8s ServiceAccount 추가

 

$ vi aws-load-balancer-controller-service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/name: aws-load-balancer-controller
  name: aws-load-balancer-controller
  namespace: kube-system
  annotations:
      eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKSLoadBalancerControllerRole

$ kubectl apply -f aws-load-balancer-controller-service-account.yaml
serviceaccount/aws-load-balancer-controller created

 

여기까지의 작업으로 쿠버네티스의 ServiceAccount 는 AWS 의 AmazonEKSLoadBalancerControllerRole 역할을 얻게 되었고, ingress 와 loadbalancer 에 대하여 AWS 에 ALB 와 NLB 를 각각 생성/관리할 수 있게 되었다.

 

 

Load Balancer Controller 설치

 

Fargate 에 컨트롤러를 배포할 때는 cert-manager 에 의존하지 않기 때문에 Helm 차트를 사용하여 설치한다. Helm 은 Kubernetes 클러스터에서 사용하는 패키지 관리자로 yum, apt 와 흡사하며, 흔히 나오는 차트라는 단어는 helm 패키지라고 이해하면 된다.

 

Helm 설치 - https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/helm.html

 

Amazon EKS에 Helm 사용 - Amazon EKS

Amazon EKS에 Helm 사용 Kubernetes용 Helm 패키지 관리자는 Kubernetes 클러스터에서 애플리케이션을 설치하고 관리하는 데 도움이 됩니다. 자세한 내용은 Helm 설명서를 참조하십시오. 이 주제에서는 Helm

docs.aws.amazon.com

 

eks 저장소 초기화 뒤 설치

 

$ helm repo add eks https://aws.github.io/eks-charts
"eks" has been added to your repositories

 

eks 저장소 차트 확인

 

$ helm repo update
$ helm search repo eks
...
eks/aws-load-balancer-controller
...

 

컨트롤러 설치

 

$ helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=cluster-name \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set region=region-code \
--set vpcId=vpc-xxxxxxxx \
--set image.repository=account.dkr.ecr.region-code.amazonaws.com/amazon/aws-load-balancer-controller

LAST DEPLOYED: Thu Dec  9 13:27:38 2021
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
AWS Load Balancer controller installed!

 

이미지 저장소 속성에서, 서울의 region-code 는 ap-northeast-2, account 는 602401143452 이다. 

image.repository=602401143452.dkr.ecr.ap-northeast-2.amazonaws.com/amazon/aws-load-balancer-controller

 

위 명령에서 install 후에 차트 업그레이드(upgrade)시 필요한 TargetGroupBinding 사용자 리소스를 설치한다. 

 

$ kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"

 

 

Fargate 프로파일 생성 : kube-system 에 선택기 매칭이 필요한 경우 추가.

  • app.kubernetes.io/instance = aws-load-balancer-controller
  • app.kubernetes.io/name = aws-load-balancer-controller

 

$ kubectl rollout restart -n kube-system deployment aws-load-balancer-controller

 

 

컨트롤러 설치 확인

 

$ kubectl get deployment -n kube-system aws-load-balancer-controller
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
aws-load-balancer-controller   2/2     2            2           84s

 

load-balancer-controller

 


 

삽질1. 리전별 ECR 주소 혼동

 

--set image.repository=account.dkr.ecr.region-code.amazonaws.com/amazon/aws-load-balancer-controller

 

컨트롤러 설치시 account 를 accountId 로 착각해 주소가 다르다는 오류를 발생시켰었다. AWS Load Balancer Controller, Amazon VPC CNI, kube-proxy, CoreDNS 등의 ECR 저장소를 이용할 때 주소가 리전마다 다르므로 주의한다.

 

리전별 ECR 주소 참고 : https://docs.aws.amazon.com/eks/latest/userguide/add-ons-images.html

 

Amazon EKS add-on container image addresses - Amazon EKS

Amazon EKS add-on container image addresses When you deploy Amazon EKS add-ons such as the AWS Load Balancer Controller, the Amazon VPC CNI, kube-proxy, CoreDNS, or storage drivers, you pull an image from an Amazon ECR repository. The image name and tag ar

docs.aws.amazon.com

 

 

삽질2. aws-load-balancer-controller 설치 에러

 

$ helm install aws-load-balancer-controller...
Error: INSTALLATION FAILED: rendered manifests contain a resource that already exists. Unable to continue with install: ClusterRole "aws-load-balancer-contro
ller-role" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; label validation error: missing key "app.kuber
netes.io/managed-by": must be set to "Helm"; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "aws-load-balancer-controll
er"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "kube-system"

 

Kubernetes manifest 를 적용하여 설치했다가 이미 필요한 설정값들이 달라 발생한 오류. 재설치 하면서 발생하는 기존 리소스들 전부 찾아서 삭제하고 OK 떨어질때까지 반복하면서 해결.

 

$ kubectl delete clusterrole aws-load-balancer-controller-role
$ kubectl delete clusterrolebinding aws-load-balancer-controller-rolebinding
$ kubectl delete service aws-load-balancer-webhook-service -n kube-system
$ kubectl delete MutatingWebhookConfiguration aws-load-balancer-webhook
$ kubectl delete ValidatingWebhookConfiguration aws-load-balancer-webhook

 

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,