Terraform - EKS

jsbak·2023년 6월 30일
0

참고

목록 보기
11/13
post-custom-banner

EKS

eksctl 설치

  • eksctl 설치
    • Homebrew 를 사용하여 macOS에 eksctl 설치 또는 업그레이드
      • (선택) Homebrew 설치 - /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
      • eksctl 설치 여부 확인 - eksctl version
        • 설치 : brew install weaveworks/tap/eksctl
        • 업데이트 : brew upgrade eksctl & brew link --overwrite eksctl
        • 설치 또는 업데이트 작업 확인 : eksctl version

Amazon EKS 클러스터용 kubeconfig 파일 생성 또는 업데이트

자동으로 kubeconfig 파일 생성

  • AWS CLI 버전 2.11.26 이상 또는 1.27.15
  • region-codemy-cluster 부분을 변경한다.
    aws eks update-kubeconfig --region region-code --name my-cluster
    • kubectl get svc 으로 확인하기

로드밸런싱

AWS Load Balancer Controller

  • EKS Hands On Lab - 6. AWS Load Balancer Controller
  • Amazon EKS로 웹 애플리케이션 구축하기 - AWS Load Balancer 컨트롤러 만들기
  • Ingress Controller
    Ingress 는 반드시 Ingress Controller가 존재 해야하며, 외부에서 내부로 요청되는 트래픽을 읽고 서비스로 전달하는 역할을 합니다. 다른 컨트롤러와 다르게 목적에 맞게 수동으로 설치해야 합니다.
    AWS EKS 환경에서는 AWS Load Balancer Controller 를 별도로 설치하고, Ingress는 ALB를 통해 구성됩니다
    • NGINX Ingress Controller
    • HA Proxy
    • AWS Load Balancer Controller (이전 이름 : ALB Ingress Controller)
    • Kong
    • traefik
  • 구성 순서
    • IAM OIDC 공급자 생성
    • AWS Loadbalancer 컨트롤러에 대한 IAM 정책 다운로드
    • AWS LoadBalancerControllerIAMPolicy 이름의 IAM 정책 생성
    • AWS Load Balancer Controller에 대한 IAM 역할 및 Service Account 생성
    • EKS Cluster에 컨트롤러 추가

NLB Loadbalancer 서비스 기반 구성

Case3. 기존 배포된 ELB 및 TargetGroup 연결 (TargetGroupBinding, Multi Cluster)

클러스터 인증

eksctl 로 OIDC 공급자 생성

AWS IAM(Identity and Access Management)에서는 OpenID Connect(OIDC)를 사용해 연동 자격 증명을 지원하는 기능을 추가하였습니다. 이 기능을 사용하면 지원되는 자격 증명 공급자를 이용해 AWS API 호출을 인증하고 유효한 OIDC JWT(JSON WebToken)을 수신할 수 있습니다.
이 토큰을 AWS STS AssumeRoleWithWebIdentity API 작업에 전달하고 IAM 임시 역할 자격 증명을 수신할 수 있습니다. 이 자격 증명을 사용하여 AWS 서비스 자원들을 Kubernetes 자원들이 사용할 수 있습니다.
IAM OIDC Provider는 기본으로 활성화되어 있지 않습니다.

  • 공급자 생성
$ eksctl utils associate-iam-oidc-provider \
--region 사용하는_리전 \
--cluster 클러스터_이름 \
--approve
--------------------------------------------------------------------
2023-07-05 11:08:41 []  will create IAM Open ID Connect provider for cluster "test-eks-cluster" in "ap-northeast-2"
2023-07-05 11:08:42 []  created IAM Open ID Connect provider for cluster "test-eks-cluster" in "ap-northeast-2"
  • 공급자 생성 확인
$ aws eks describe-cluster --name ${CLUSTER_NAME} --query "cluster.identity.oidc.issuer" --output text
--------------------------------------------------------------------
https://oidc.eks.ap-northeast-2.amazonaws.com/id/4C197A577D76E061A9AA292AEBECF9AC
--------------------------------------------------------------------


$ aws iam list-open-id-connect-providers
--------------------------------------------------------------------
{
    "OpenIDConnectProviderList": [
        {
            "Arn": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/oidc.eks.ap-northeast-2.amazonaws.com/id/4C197A577D76E061A9AA292AEBECF9AC"
        }
    ]
}

AWS Load Balancer 컨트롤러에 대한 IAM 정책

  • 정책 다운로드
$ mkdir -p ~/workspace/eks/alb-controller && cd $_
$ curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.3.1/docs/install/iam_policy.json
  • 정책 생성
$ cd ~/workspace/eks/alb-controller
aws iam create-policy \
    --policy-name AWSLoadBalancerControllerIAMPolicy \
    --policy-document file://./iam_policy.json
--------------------------------------------------------------------    
{
    "Policy": {
        "PolicyName": "AWSLoadBalancerControllerIAMPolicy",
        "PolicyId": "ANPA4KSZIUM5GQJWVZJQI",
        "Arn": "arn:aws:iam::${AWS_ACCOUNT_ID}:policy/AWSLoadBalancerControllerIAMPolicy",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2023-07-05T02:20:34+00:00",
        "UpdateDate": "2023-07-05T02:20:34+00:00"
    }
}

AWS LoadBalancer Controller IAM 역할 및 Service Account 생성

  • AWS LoadBalancer Controller 에 대한 Service Account를 생성하고, 앞서 생성한 IAM Role을 연결
$ eksctl create iamserviceaccount \
--cluster=${CLUSTER_NAME} \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--attach-policy-arn=arn:aws:iam::${AWS_ACCOUNT_ID}:policy/AWSLoadBalancerControllerIAMPolicy \
--override-existing-serviceaccounts \
--region ${AWS_REGION} \
--approve
----------------------------------------------------------------------------------------------------------------------------------------
2023-07-05 11:30:14 []  1 iamserviceaccount (kube-system/aws-load-balancer-controller) was included (based on the include/exclude rules)
2023-07-05 11:30:14 [!]  metadata of serviceaccounts that exist in Kubernetes will be updated, as --override-existing-serviceaccounts was set
2023-07-05 11:30:14 []  1 task: { 
    2 sequential sub-tasks: { 
        create IAM role for serviceaccount "kube-system/aws-load-balancer-controller",
        create serviceaccount "kube-system/aws-load-balancer-controller",
    } }2023-07-05 11:30:14 []  building iamserviceaccount stack "eksctl-test-eks-cluster-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2023-07-05 11:30:15 []  deploying stack "eksctl-test-eks-cluster-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2023-07-05 11:30:15 []  waiting for CloudFormation stack "eksctl-test-eks-cluster-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2023-07-05 11:30:45 []  waiting for CloudFormation stack "eksctl-test-eks-cluster-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2023-07-05 11:30:46 []  created serviceaccount "kube-system/aws-load-balancer-controller"
$ kubectl get serviceaccounts -n kube-system aws-load-balancer-controller -o yaml
--------------------------------------------------------------------
apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::${AWS_ACCOUNT_ID}:role/eksctl-test-eks-cluster-addon-iamserviceacco-Role1-1QR59D9A8AEJ2
  creationTimestamp: "2023-07-05T02:30:46Z"
  labels:
    app.kubernetes.io/managed-by: eksctl
  name: aws-load-balancer-controller
  namespace: kube-system
  resourceVersion: "11843"
  uid: 1d8b3c1c-f2e1-4605-b532-4b305ed5880a

인증서 관리자 설치

$ export CERTMGR_VERSION=1.12.0 #1.9.1
$ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v${CERTMGR_VERSION}/cert-manager.yaml
$ kubectl -n cert-manager get pods

AWS Loadbalancer Controller Pod 설치

# 2023.07.05 일자 버전 v.2.5.3
$ wget https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.5.3/v2_5_3_full.yaml

# k8s 공식 문서에서 IngressClass 를 권장한다고 하니 참고 해볼것
$ wget https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.5.3/v2_5_3_ingclass.yaml
  • v2_5_3_full.yaml 파일에서 클러스터 이름 변경
apiVersion: apps/v1
kind: Deployment
. . .
name: aws-load-balancer-controller
namespace: kube-system
spec:
    . . .
    template:
        spec:
            containers:
                - args:
                    - --cluster-name=<INSERT_CLUSTER_NAME>
  • 적용
$ cd ~/workspace/eks/alb-controller
$ kubectl apply -f v2_5_3_full.yaml
$ kubectl -n kube-system get pods | grep balancer

# IngressClass / 이게 있어야지 ALB 설정 가능
$ kubectl apply -f v2_5_3_ingclass.yaml
$ kubectl get deployment -n kube-system aws-load-balancer-controller
  • 확인
$ kubectl get deployment -n kube-system aws-load-balancer-controller

Service Account 확인
$ kubectl get sa aws-load-balancer-controller -n kube-system -o yaml

클러스터 내부에서 필요한 기능들을 위해 실행되는 파드들을 애드온(Addon) 이라고 합니다. 
애드온에 사용되는 파드들은 디플로이먼트, 리플리케이션 컨트롤러 등에 의해 관리됩니다. 
그리고 이 애드온이 사용하는 네임스페이스가 kube-system입니다. 
Yaml 파일에서 네임스페이스를 kube-system으로 명시했기에 위의 명령어로 파드 이름이 도출되면 정상적으로 배포된 것입니다. 
또한, 아래의 명령어로 관련 로그를 확인할 수 있습니다.
$ kubectl logs -n kube-system $(kubectl get po -n kube-system | egrep -o "aws-load-balancer[a-zA-Z0-9-]+")

또는 자세히 확인
$ ALBPOD=$(kubectl get pod -n kube-system | egrep -o "aws-load-balancer[a-zA-Z0-9-]+")

kubectl describe pod -n kube-system ${ALBPOD}

배포 테스트 해보기

OIDC 설정

  • 전제 조건
    • 발급자 URL — API 서버가 토큰을 확인하기 위한 퍼블릭 서명 키를 검색할 수 있도록 허용하는 OIDC 자격 증명 공급자의 URL
    • 클라이언트 ID(대상이라고도 함) — OIDC 자격 증명 공급자에게 인증을 요청하는 클라이언트 애플리케이션의 ID

제거

$ kubectl delete -f v2_5_3_full.yaml
$ eksctl delete iamserviceaccount --cluster ${CLUSTER_NAME} --name aws-load-balancer-controller --namespace kube-system --wait
$ aws iam delete-policy --policy-arn arn:aws:iam::${AWS_ACCOUNT_ID}:policy/AWSLoadBalancerControllerIAMPolicy

서비스와 인그레스

OIDC 테라폼??

모니터링

Fargate

선행 조건

  • kubeconfig 설정으로 apiserver에 접근할 때 사용할 인증 정보
  • 공급자 생성확인
  • IAM 설정 및 서비스어카운트 설정
  • etc...

Fargate로 사용하기 위한 CoreDNS 패치

$ kubectl patch deployment coredns -n kube-system --type=json -p='[{"op": "remove", "path": "/spec/template/metadata/annotations", "value": "eks.amazonaws.com/compute-type"}]'
$ kubectl rollout restart -n kube-system deployment coredns

# 확인
$ kubectl -n kube-system get po

Fargate 에서 ALB 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=$AWS_REGION \
  --set vpcId=$VPC_ID
  
$ kubectl patch deployment aws-load-balancer-controller -n kube-system --type=json -p='[{"op": "add", "path": "/spec/template/metadata/annotations/eks.amazonaws.com~1fargate-profile", "value":"kube-system"}]'

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

제거

$ helm delete aws-load-balancer-controller -n kube-system

오류

Subnet Auto Discovery

자격 증명 기반 정책은 elasticloadbalancing:AddTags를 허용하지 않습니다.

AWS 리소스 생성한 사용자와 EKS 클러스터에 접속하려는 사용자가 다른경우

Amazon EKS API 서버에 연결할 때 무단 서버 오류 문제를 해결하려면 어떻게 해야 하나요?
최종 업데이트 날짜: 2022년 8월 17일

kubectl 명령을 사용하여 Amazon Elastic Kubernetes Service(Amazon EKS) API 서버에 연결하는데, 'error: You must be logged in to the server (Unauthorized)' 메시지를 수신했습니다. 이 문제를 해결하려면 어떻게 해야 하나요?

간략한 설명

  • 클러스터 관리자는 다음 섹션 중 하나의 단계를 완료해야 합니다.

    • 클러스터 생성자인 경우
    • 클러스터 생성자가 아닌 경우

그런 다음, 오류 메시지를 받은 사람이 You're the user or role that received the error(오류를 수신한 사용자 또는 역할) 섹션의 단계를 완료해야 합니다.

해결 방법

클러스터 생성자인 경우

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생할 경우 AWS CLI의 최신 버전을 사용하고 있는지 확인하세요.

  1. AWS CLI 사용자 또는 역할의 구성을 보려면 다음 명령을 실행합니다.

$ aws sts get-caller-identity
출력은 AWS Identity and Access Management(IAM) 사용자 또는 역할의 Amazon 리소스 이름(ARN)을 반환합니다. 예를 들면 다음과 같습니다.

{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
}
  1. ARN이 클러스터 생성자와 일치하는지 확인합니다.

  2. 다음 명령 중 하나를 사용하여 kubeconfig 파일을 업데이트하거나 생성합니다.

IAM 사용자로서 다음 명령을 실행합니다.

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region
참고: eks-cluster-name을 사용자의 클러스터 이름으로 교체합니다. aws-region을 사용자의 AWS 리전으로 교체합니다.

IAM 역할로 다음 명령을 실행합니다.

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region --role-arn arn:aws:iam::XXXXXXXXXXXX:role/testrole
참고: eks-cluster-name을 사용자의 클러스터 이름으로 교체합니다. aws-region을 사용자의 AWS 리전으로 교체합니다.

  1. kubeconfig 파일이 업데이트되었는지 확인하려면 다음 명령을 실행합니다.

$ kubectl config view --minify
5. IAM 사용자 또는 역할이 인증되었는지 확인하려면 다음 명령을 실행합니다.

$ kubectl get svc
예시 출력

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.100.0.1     <none>        443/TCP   77d

참고: EKS는 컨트롤 플레인 측의 클러스터 생성자 IAM 역할을 kubernetes-admin으로 매핑합니다. 클러스터가 생성될 때 API 서버 로깅이 활성화된 경우 엔터티 생성자를 쿼리할 수 있습니다. Amazon CloudWatch Application Insights에서 다음 명령을 실행합니다.

fields @logStream, @timestamp, @message
| sort @timestamp desc
| filter @logStream like /authenticator/
| filter @message like "username=kubernetes-admin"
| limit 50

이 쿼리는 클러스터 생성자로 매핑된 IAM 엔터티를 반환합니다. 출력에서 수신하는 IAM 엔터티 역할을 수임한 다음, 클러스터에 kubectl을 다시 호출합니다.

클러스터 생성자가 아닌 경우

  1. AWS CLI 사용자 또는 역할의 구성을 가져오려면 다음 명령을 실행합니다.

$ aws sts get-caller-identity
출력은 IAM 사용자 또는 역할의 ARN을 반환합니다.

  1. 클러스터 소유자 또는 관리자에게 IAM 사용자 또는 역할을 aws-auth ConfigMap에 추가하도록 요청합니다.

참고: 올바른 IAM 권한이 있으면 AssumeRole을 사용하여 클러스터 생성자로 로그인할 수 있습니다.

  1. 텍스트 편집기에서 aws-auth ConfigMap을 편집하려면 클러스터 소유자 또는 관리자가 다음 명령을 실행해야 합니다.

$ kubectl edit configmap aws-auth --namespace kube-system
참고: 'Error from server (NotFound): configmaps 'aws-auth' not found' 오류가 발생하면 aws-authConfigMap을 클러스터에 적용하는 지침을 따르세요.

  1. IAM 사용자 또는 IAM 역할을 추가하려면 다음 단계 중 하나를 완료하십시오.

IAM 사용자를 mapUsers에 추가합니다. 예를 들면 다음과 같습니다.

mapUsers: |
  - userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
    username: testuser
    groups:
      - system:masters

참고: testuser를 사용자 이름으로 바꿉니다.

IAM 역할을 mapRoles에 추가합니다. 예를 들면 다음과 같습니다.

mapRoles: |
  - rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
    username: testrole
    groups:
      - system:masters

참고: testrole을 역할로 바꿉니다.

mapRoles 섹션의 username 값은 소문자만 사용할 수 있습니다. IAM 역할은 경로 없이 매핑되어야 합니다. rolearn 경로 요구 사항에 대해 자세히 알아보려면 IAM 문제 해결에서 aws-auth ConfigMap에서 클러스터에 대한 액세스 권한을 부여하지 않음 섹션을 펼치세요.

AWS IAM Identity Center(AWS Single Sign-On 후속) IAM 역할에 rolearn을 지정하려면 역할 ARN에서 '/aws-reserved/sso.amazonaws.com/REGION' 경로를 제거합니다. 그렇지 않으면 ConfigMap의 항목이 사용자를 유효한 사용자로 인증할 수 없습니다.

system:masters 그룹은 슈퍼 사용자 액세스를 통해 모든 리소스에 대한 모든 작업을 수행할 수 있습니다. 자세한 내용은 기본 역할 및 역할 바인딩을 참조하세요. 이 사용자에 대한 액세스를 제한하려면 Amazon EKS 역할 및 역할 바인딩 리소스를 생성할 수 있습니다. Amazon EKS 콘솔에서 리소스를 보는 사용자의 액세스 권한을 제한하는 예시의 경우, 필수 권한의 2단계 및 3단계를 수행하세요.

오류를 수신한 사용자 또는 역할인 경우
1. aws-auth ConfigMap이 업데이트된 후 kubeconfig 파일을 업데이트하거나 생성하려면 다음 명령 중 하나를 실행합니다.

IAM 사용자로서 다음 명령을 실행합니다.

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region
참고: eks-cluster-name을 사용자의 클러스터 이름으로 교체합니다. aws-region을 사용자의 AWS 리전으로 교체합니다.

  1. IAM 역할로 다음 명령을 실행합니다.

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region --role-arn arn:aws:iam::XXXXXXXXXXXX:role/testrole
참고: eks-cluster-name을 사용자의 클러스터 이름으로 교체합니다. aws-region을 사용자의 AWS 리전으로 교체합니다.

  1. kubeconfig 파일이 업데이트되었는지 확인하려면 다음 명령을 실행합니다.

$ kubectl config view --minify
4. IAM 사용자 또는 역할이 인증되었는지 확인하려면 다음 명령을 실행합니다.

$ kubectl get svc
예시 출력

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.100.0.1     <none>        443/TCP   77d

참고: 오류를 계속 수신하는 경우, 문제 해결 가이드라인 RBAC 권한 부여를 참조하세요.

Back-off restarting failed container aws-load-balancer-controller in pod ...

profile
끄적끄적 쓰는곳
post-custom-banner

0개의 댓글