mingming

EKS AWS Load Balancer Controller (helm) 본문

kubernetes

EKS AWS Load Balancer Controller (helm)

mingming_96 2023. 8. 25. 01:28

AWS Load Balancer Controller 

Kubernetes Ingress 오브젝트를 트리거로 ALB를 동적으로 관리해주는 컨트롤러 입니다. 이전 이름은 AWS ALB Ingress Controller로 Github에서 관리되는 오픈소스 프로젝트 입니다.

 

EKS Cluster provisioning

eksctl 명령어를 통해 eks cluster를 생성해줍니다.

프로비저닝 될 때까지 10~15 분 정도 걸립니다.

eksctl create cluster --name <cluster_name> --version 1.24 \
	--region ap-northeast-2 \
	--nodegroup-name linux-noded \
	--nodes 2 --nodes-min 1 --nodes-max 4 \
	--ssh-access --ssh-public-key <Key_name> --node-type t3.small --managed

 

IAM Policy 생성 

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

해당 페이지를 참고해 정책을 다운로드 합니다. 

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

다운받은 정책으로 Iam 정책을 생성해줍니다.

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

 

Service Account 생성 및 정책 연결

IAM OIDC Provider 매핑 

eksctl utils associate-iam-oidc-provider --cluster <cluster_name> --approve

 

ServiceAccount

eksctl create iamserviceaccount \
  --cluster=<cluster_name> \
  --namespace=kube-system \
  --name=aws-load-balancer-controller \
  --attach-policy-arn=arn:aws:iam::<Account_ID>:policy/AWSLoadBalancerControllerIAMPolicy \
  --override-existing-serviceaccounts \
  --approve

 

AWS Laod Balancer Controller 설치

helm 설치하기

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

helm repo 추가하기 

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

 

컨트롤러 설치하기

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=ap-northeast-2 \

ServiceAccount는 미리 생성했기 때문에 false로 해줍니다.

컨트롤러가 정상적으로 작동하는 것을 확인하실 수 있습니다.

 

Sample Service, Ingress , Deployment

Service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  annotations:
    alb.ingress.kubernetes.io/healthcheck-path: "/"
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP

 

Deployments.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

 

Ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: "nginx-ingress"
  namespace: default
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/group.name: nginx
    alb.ingress.kubernetes.io/group.order: '1'
spec:
  rules:
  - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: "nginx-service"
                port:
                  number: 80

작성한 매니페스트 파일을 배포해줍니다.

kubectl apply -f Service.yaml
kubectl apply -f Deployments.yaml
kubectl apply -f Ingress.yaml

 

로드밸런서가 프로비저닝 되고, 외부 아이피가 할당된 것을 확인하실 수 있습니다.

로드밸런서는 Ingress 배포 후 프로비저닝 됩니다.

 

provisioning 된 LoadBalancer

 

TargetGroup

 

NodePort 타입의 서비스와  Ingress를 통해 LoadBalncer를 생성하여 외부에서 접근 가능하도록 설정했습니다.  

App 접속

 

생성한 오브젝트 삭제

kubectl delete -f Service.yaml
kubectl delete -f Deployments.yaml
kubectl delete -f Ingress.yaml

클러스터 삭제

eksctl delete -f cluster --name <cluster_name> --region ap-northeast-2

 

'kubernetes' 카테고리의 다른 글

kubernetes livenessProve  (1) 2023.08.27
EKS Amazon EFS CSI Driver (helm)  (1) 2023.08.25
Kubernetes 컴포넌트  (0) 2023.08.14
kubernetes 동작원리  (1) 2023.08.13
kubernetes 연습장  (0) 2023.08.13