본문 바로가기

k8s

kubernetes awsLoadBalancerController 설치 및 환경변수 secret설정

728x90

최근 alb를 통해 그룹수준고정할당 60초동안 쿠키가 원래 왔던 서버로 돌아오게하기위한 설정을 하려고했지만

kubernetes를 awsLoadbalancercontroller가 없이 배포하게되면 classicLoadBalancer로 배포가 되게되어

그룹수준고정할당을 할 수 없었다.

 

이러한 문제를 해결하기위해 awsLoadBalancerController를 설치 해보려고한다.

 

1. Alb controller이란

 

EKS에서 kubernetes spec으로 aws nlb or alb를 생성하려고하면 aws allb controller를 설치해야한다.

alb controller가 설치되어 있지않다면 aws loadbalacner 생성단계가 pending에서 멈추게되는 문제가 발생한다.

 

2. 동작원리

ALB controller은 kubernetes API server를 감시(watch)하여 ALB 이벤트 발생을 인지합니다. 이벤트가 발생하면 AWS API를 사용하여 ALB 작업을 수행합니다.

3. 실행 전제조건

 

AWS subnet tags를 적절하게 설정해야합니다.

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/network-load-balancing.html

 

Amazon EKS의 네트워크 로드 밸런싱 - Amazon EKS

이전 버전과의 호환성을 위해 service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip" 주석이 여전히 지원됩니다. 그러나 service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip" 대신 새 로드 밸런서에 이전 주석을

docs.aws.amazon.com

위에 공식문서에 tag를 올바르게 설정하라고 나와있다.

 

  • private subnet: kubernetes.io/role/internal-elb = 1
  • public subnet: kubernetes.io/role/elb = 1

4 AWS 인증정보(EKS OIDC provider)

alb controler는 aws api를 사용하므로 aws 인증정보가 필요합니다.

그래서 pod별로 IAM ROLE을 할당하는 ISRA를 사용하여 임시로 사용하는 임시자격증명을 사용합니다.

임시자격증명을 생성할 때 EKS OIDC provider를 사용합니다.

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/aws-load-balancer-controller.html

 

AWS Load Balancer Controller 추가 기능 설치 - Amazon EKS

배포된 차트는 보안 업데이트를 자동으로 수신하지 않습니다. 새 차트가 사용 가능해지면 수동으로 업그레이드해야 합니다. 업그레이드 시 이전 명령에서 install을 upgrade로 변경하되, 이전 명령

docs.aws.amazon.com

위에 공식문서에서 EKS OIDC provider를 사용하여 alb controller 설치 메뉴얼을 설명해줍니다.

eksctl로 간단히 eks OIDC provider 를 설치할 수 있습니다.

CLUSTER_NAME="baisc-cluster"
eksctl utils associate-iam-oidc-provider --cluster ${CLUSTER_NAME} --approve

5. 설치방법

Helm Chart 를 사용하여 AWS ALB controller 를 손쉽게 설치해 볼 생각입니다.

 

ALB controller pod에서 사용할 IAM policy를 생성합니다. IAM policy는 EKS공식문서에서 제공한 policy를 다운로드 받았습니다.

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

 

AWS CLI 를 사용하여 IAM policy를 생성합니다.

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

eksctl명령어를 사용하여 ALB controller에 사용할 IAM role과 kubernetes serviceaccount를 생성합니다. 이전에 생성한 IAM policy arn이 필요합니다.

POLICY_ARN=$(aws iam list-policies --query 'Policies[?PolicyName==`AWSLoadBalancerControllerIAMPolicy`].Arn' --output text)
ROLE_NAME="AmazonEKSLoadBalancerControllerRole"
CLUSTER_NAME="${eks-cluster-name}"

eksctl create iamserviceaccount \
  --cluster ${CLUSTER_NAME} \
  --namespace=kube-system \
  --name=aws-load-balancer-controller \
  --role-name ${ROLE_NAME} \
  --attach-policy-arn=${POLICY_ARN} \
  --approve

eksctl명령어가 끝나면 kubernetes service account와 AWS IAM role이 생성됩니다.

 

IAM ROLE이 AmazonEKSLoadBalancerControllerRole이 정상적으로 생성되어야합니다.

 

ISSUE 발생

aws  loadbalacer controller 설치하는과정에서

eksctl create iamserviceaccount \   —cluster=my-cluster \   —namespace=kube-system \   —name=aws-load-balancer-controller \   —role-name AmazonEKSLoadBalancerControllerRole \   —attach-policy-arn=arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \   —approve
해당 명령어를 입력하게되면

2 existing iamserviceaccount(s) (kube-system/aws-load-balancer-controller,kube-system/aws-node) will be excluded
2023-11-12 08:17:25 [ℹ]  1 iamserviceaccount (kube-system/aws-load-balancer-controller) was excluded (based on the include/exclude rules)
2023-11-12 08:17:25 [!]  metadata of serviceaccounts that exist in Kubernetes will be updated, as —override-existing-serviceaccounts was set
2023-11-12 08:17:25 [ℹ]  no tasks

이렇게만 뜨고 serviceaccount가 생성이안되는문제가 있습니다.

발생한이유를 찾아보니 Ekscluster를 구성할 때 자동으로 cloudformation에 해당 aws-load-balancer-controller

가 생성되어 오류가 발생한 것이다. 

 

해결방안: cloudformation에 들어가서 aws-load-blanacer-controller serviceaccount를 삭제 후 다시 해당

명령어를 실행하여 다시 실행시켜준다.

 

6. helm 설치 및 aws controller 설치

Aws Alb controller를 설치할 준비가 모두 끝났습니다.helm chart를 사용하여 aws alb controlelr 를 설치합니다.

eks helm chart를 추가합니다.

helm repo add eks https://aws.github.io/eks-charts
helm repo update

helm install 또는 upgrade명령어로 helm chart를 릴리즈합니다. EKS클러스터 이름을 helm values에 꼭 설정해야 합니다. serviceaccount는 이미 생성했으므로 중복 생성하지 않기 위해 false로 설정했습니다.

CLUSTER_NAME="${your_eks_cluster_name}"
helm upgrade --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

alb controller pod가 실행 중인지 확인을 합니다.

kubectl -n kube-system get po

 

이렇게하게되면 annotation type을 alb로 설정하게되면 alb가 생성되게되고 그룹수준고정할당

stickey session을 설정하여 분산된환경에서도 왔던 서버로 다시 되돌아 갈 수 있도록 할 수 있습니다.

 

Secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: minwoo-secrets
  namespace: minwoo
data:
  SPRING_DATASOURCE_URL: base64 인코딩 값
  SPRING_DATASOURCE_USERNAME: base64 인코딩 값
  SPRING_DATASOURCE_PASSWORD: base64 인코딩 값
  SPRING_PROFILES_ACTIVE: base64 인코딩 값
  JASYPT_KEY: base64 인코딩 값
  jasypt.encryptor.password: base64 인코딩 값
  SPRING_REDIS_HOST: base64 인코딩 값
  SPRING_REDIS_PORT: base64 인코딩 값
  SPRING_REDIS_PASSWORD: base64 인코딩 값

 

deployment.yaml

 envFrom:
            - secretRef:
                name: minwoo-secrets

이렇게 설정하게되면 환경변수를 pod에 띄워서 관리하기때문에 안전하게 환경변수를 pod에서 가져다 쓸 수 있습니다.

 

 

TMI: 오류를 확인할 때 정말 유용하게 사용했던 명령어

 

kubectl describe,logs 를 통해 로그 및 이벤트를 확인하여 어디서 오류가 떳는지 바로바로 확인가능하다.

 

참고한블로그 :https://somaz.tistory.com/141,

                      https://malwareanalysis.tistory.com/597

728x90

'k8s' 카테고리의 다른 글

eks + argo cd +jenkins 로 ci/cd 구축하기  (1) 2023.10.24
쿠버네티스가 왜 필요할까 ?  (0) 2023.04.27