[Kubernetes] Helm을 사용해 Service Account 기반 Ingress 구성하기

[Kubernetes] Helm을 사용해 Service Account 기반 Ingress 구성하기


AWS Load Balancer Controller 설치 준비

AWS Load Balancer Controller

  • k8s 클러스터의 Elastic Load Balancer를 관리하는 데 도움이 되는 [[Controller|컨트롤러]]
  • AWS LB Controller가 프로비저닝할 수 있는 리소스
    • Ingress: ALB
    • LoadBalancer: NLB

OIDC 제공자 설정 확인

> aws eks describe-cluster --name <cluster name> --query "cluster.identity.oidc.issuer" --output text
  • 제공자가 없다면 다음 명령어로 생성
> eksctl utils associate-iam-oidc-provider --region <region> --cluster <cluster name> --approve

IAM 역할 생성 및 Service Account 연결

  • [[Service Account에 대해|Service Account]]를 사용하는 애플리케이션(AWS Load Balancer Controller)이 IAM 역할로 직접 AWS 리소스에 접근

정책 생성

> curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json

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

IAM 역할 생성하며 k8s Service Account 연결

  • 롤 바인딩을 해줘야 ALB 등 리소스 생성할 권한이 SA에 들어감
> eksctl create iamserviceaccount \
--cluster <cluster name> \
--namespace kube-system \
--name aws-load-balancer-controller \
--attach-policy-arn arn:aws:iam::<account id>:policy/AWSLoadBalancerControllerIAMPolicy \
--approve

AWS Load Balancer Controller 설치

Helm 리포지토리 추가 및 업데이트

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

Helm으로 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>

Ingress 리소스 설정

k8s Service 생성

  • 예시: default 네임스페이스에 test-svc이라는 서비스 가정
apiVersion: v1
kind: Service
metadata:
  name: test-svc
  namespace: default
spec:
  ports:
    - port: 80
      targetPort: 8080
  selector:
    app: test-app

Ingress 리소스 생성

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  namespace: default
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: test-svc
                port:
                  number: 80
> kubectl apply -f test-ingress.yaml

  • ALB 프로비저닝 완료
© 2024 Seungwon Bae 🇰🇷