EKS에서 ALB를 사용하기 위한 공식 링크들을 먼저 다음과 같습니다.
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/alb-ingress.html
kubernetes-sigs.github.io/aws-load-balancer-controller/guide/ingress/annotations/#annotations
위의 두 페이지를 참고하면 다른 기능들도 금방 파악할 수 있습니다.
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를 구성하는 방법을 알아보도록 하겠습니다.
'EKS > LoadBalancer & EXT DNS' 카테고리의 다른 글
EKS LoadBalancer - 4. Nginx Ingress (NLB) (0) | 2020.10.12 |
---|---|
EKS LoadBalancer - 3. Network LoadBalancer (0) | 2020.02.05 |
EKS LoadBalancer - 1. Classic LoadBalancer, External DNS (0) | 2020.02.04 |