본문 바로가기

EKS/LoadBalancer & EXT DNS

EKS LoadBalancer - 2. Application LoadBalancer

EKS에서 ALB를 사용하기 위한 공식 링크들을 먼저 다음과 같습니다.

 

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/alb-ingress.html

 

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/alb-ingress.html

Amazon EKS의 ALB 수신 컨트롤러

docs.aws.amazon.com

 

kubernetes-sigs.github.io/aws-load-balancer-controller/guide/ingress/annotations/#annotations

 

Annotations - AWS LoadBalancer Controller

Ingress annotations You can add annotations to kubernetes Ingress and Service objects to customize their behavior. Annotation keys and values can only be strings. Advanced format should be encoded as below: boolean: 'true' integer: '42' stringList: s1,s2,s

kubernetes-sigs.github.io

 

위의 두 페이지를 참고하면 다른 기능들도 금방 파악할 수 있습니다.

 

ALB가 생성되는 과정을 먼저 설명드리면,

alb ingress controller가 알맞은 Role을 가지고 배포된 후, ingress에 대한 모니터링을 계속 합니다.

그러다가 ingress 배포가 생성되거나 변경이 생기면, 이에 대한 작업을 ingress controller에 설정했던 AWS인프라에 반영하게 됩니다.

 

이때, 먼저 subent에 태그를 바라보고 ALB를 생성하기 때문에

해당 태그를 달지 않을 경우 eks가 어디에 생성할지 인식을 못해 alb가 생성이 안 되며,

태그를 하지 않을 경우에는 yaml파일에 subnet annotation을 추가해주셔야 합니다.

 

지금 만들 ALB의 경우, 인터넷망을 타고 들어올 것이기 때문에 Public Subnet에 아래와 같이 태그값을 추가해주시면 됩니다.

 

 

먼저 그럼 alb ingress에 role을 부여해주겠습니다.

아래 파일을 만든 후, kubectl apply를 해주세요.

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    app.kubernetes.io/name: alb-ingress-controller
  name: alb-ingress-controller
rules:
  - apiGroups:
      - ""
      - extensions
    resources:
      - configmaps
      - endpoints
      - events
      - ingresses
      - ingresses/status
      - services
    verbs:
      - create
      - get
      - list
      - update
      - watch
      - patch
  - apiGroups:
      - ""
      - extensions
    resources:
      - nodes
      - pods
      - secrets
      - services
      - namespaces
    verbs:
      - get
      - list
      - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    app.kubernetes.io/name: alb-ingress-controller
  name: alb-ingress-controller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: alb-ingress-controller
subjects:
  - kind: ServiceAccount
    name: alb-ingress-controller
    namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/name: alb-ingress-controller
  name: alb-ingress-controller
  namespace: kube-system
...

 

이제 alb ingress controller를 배포해주겠습니다.

cluster name과 vpc id, regrion을 알맞게 적어주세요

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: alb-ingress-controller
  name: alb-ingress-controller
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: alb-ingress-controller
  template:
    metadata:
      labels:
        app.kubernetes.io/name: alb-ingress-controller
    spec:
      containers:
        - name: alb-ingress-controller
          args:
            - --ingress-class=alb
            - --cluster-name=
            - --aws-vpc-id=
            - --aws-region=ap-northeast-2
          image: docker.io/amazon/aws-alb-ingress-controller:v1.1.3
      serviceAccountName: alb-ingress-controller

 

아래 명령어를 통해 제대로 배포되었는지 먼저 확인해주겠습니다.

그리고, 실시간으로 로그를 계속 확인할 수 있도록 하겠습니다.

kubectl get all -n kube-system
kubectl logs -f deployments.app/alb-ingress-contoller -n kube-system

 

 

자 그러면 이제 alb ingress controller가 배포되었고 ingress가 배포되면 alb를 생성하게 됩니다.

service를 아래와 같이 수정하고, ingress를 배포해주겠습니다.

apiVersion: v1
kind: Service
metadata:
  name: cb-test-api
  namespace: prd-api
spec:
  ports:
    - port: 443
      targetPort: 9000
      protocol: TCP
  type: NodePort
  selector:
    app: cb-test-api

 

alb-ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: service-api
  namespace: prd-api
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-2:{account-number}:certificate/{id}
    alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-2016-08
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80,"HTTPS": 443}]'
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
    external-dns.alpha.kubernetes.io/hostname: cb-test-api.domain.shop
spec:
  rules:
    - http:
        paths:
          - backend:
              serviceName: ssl-redirect
              servicePort: use-annotation
    - host: cb-test-api.domain.shop
      http:
        paths:
          - backend:
              serviceName: cb-test-api
              servicePort: 443

 

위 두개를 모두 배포하게  되면 alb-ingress-controller가 바로 반응하는 것을 볼 수 있습니다.

 

 

 

또한 External DNS도 변경에 대한 부분을 1분마다 체크해서 수정하는데 ALB가 모두 구성된 다음 수정되는 것을 볼 수 있습니다.

 

 

Redirect에 대한 부분도 잘 구성되긴 하지만, 실제 손으로 구축하는것 만큼 리스너 롤이 깔끔하게 구성되지는 않습니다.

이에 대한 부분에 대해서 깔끔하게 구성가능한 방법을 아시는 분이 계시면 꼭 알려주세요오오오!!!

 

 

 

 

마지막으로 해당 도메인으로 접속 시 제대로 Redirect 및 접속이 이뤄지는 것을 볼 수 있습니다.

 

 

다음 포스트에서는 NLB를 구성하는 방법을 알아보도록 하겠습니다.