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 으로 줄어들었다.

teamsmiley's profile image

teamsmiley

2021-07-03 00:00

Read more posts by this author