AWS Bill
개인 프로젝트를 aws에 eks에 올려두었는데 비용이 많이 나와버렷다. 1200불/month 이다.
너무 비싸서 줄여보기를 시작햇다.
지금 확인한것은 application load balance를 도메인당 하나를 만들어두었는데 이게 가격이 하나당 한달에 30불 정도 나온다. 총 staing/prod 까지 10개만 되도 300불이 나온다.
이걸 줄이기 위한 방법을 고민해보았다
옵션 1: alb -> ingress-nginx -> service 로 보내서 한개의 alb만 사용하는 방법 옵션 2: alb를 가지고 뭔가를 해보는 방법.
옵션 1로는 할수는 있으나 가급적이면 alb로 처리해보고 싶어졌다.
확인해보자.
일단 기존에 도메인 별로 되있던 인그레스를 다음처럼 변경하였다.
기존
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api
namespace: xgrid-prod
annotations:
kubernetes.io/ingress.class: 'alb'
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS":443}]'
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-1:xxxxxxx:certificate/8627eabd-9fb4-4952-9835-7955fbbb
alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
spec:
rules:
- host: api.aaa.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ssl-redirect
port:
name: use-annotation
- path: /
pathType: Prefix
backend:
service:
name: api
port:
number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: id-server
namespace: xgrid-prod
annotations:
kubernetes.io/ingress.class: 'alb'
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS":443}]'
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-1:xxxxxxx:certificate/8627eabd-9fb4-4952-9835-7955fbbb
alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
spec:
rules:
- host: auth.aaa.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ssl-redirect
port:
name: use-annotation
- path: /
pathType: Prefix
backend:
service:
name: id-server
port:
number: 80
변경후
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: xgrid-prod
namespace: xgrid-prod
annotations:
kubernetes.io/ingress.class: 'alb'
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS":443}]'
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-1:xxxxxx:certificate/8627eabd-9fb4-4952-9835-xxxxba
alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
spec:
rules:
- host: api.aaa.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ssl-redirect
port:
name: use-annotation
- path: /
pathType: Prefix
backend:
service:
name: api
port:
number: 80
- host: auth.aaa.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ssl-redirect
port:
name: use-annotation
- path: /
pathType: Prefix
backend:
service:
name: id-server
port:
number: 80
- host: www.aaa.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ssl-redirect
port:
name: use-annotation
- path: /
pathType: Prefix
backend:
service:
name: www
port:
number: 80
로드발란스가 3개에서 1개로 줄었다. 비용이 1/3줄어 들었다. 해보고 나니 구지 도메인당 하나로 할 필요는 없어 보인다.
현재 ssl이 한개여서 이렇게 적용이 가능햇으나 aaa.com에는 적용을 하지 못햇다. 왜나면 ssl이 다르기 때문이다.
여러개의 도메인에 ssl을 적용하기
certificate manager에서 ssl을 만든다.
기존 ssl 설정에 arn을 추가해준다.
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-1:xxxxxxx:certificate/8627eabd-9fb4-4952-9835-xxxxxxxc2ddfba,arn:aws:acm:us-west-1:xxxxxxx:certificate/a35a9d31-073d-4785-942f-xxxc22b30 #comma로 구분후 연결한다.
.....
- host: xgridcolo.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: www
port:
number: 80
www를 추가 했고 ssl만 추가해두면 sni를 구분해서 자동으로 매치를 해주는듯 보인다.
가격이 1/3으로 줄어들었다.
1개로 줄이기
namespace가 다른데 하나의 인그레스로 설정해서 쓰고 싶어졌다.
alb.ingress.kubernetes.io/group.name: shared-ingress
이걸 추가하면 로드발란스가 shared-ingress로 만들어지고 다른 모든것들이 이 로드발란스를 사용한다.
Ingress가 다 각각의 name space에 생기는것은 맞다.
그리고 그것들이 하나의 로드발란스를 사용한다.
가격이 1/10 으로 줄어들었다.