20170821

Kubernetes Ingress 도입기

지난번 k8s 이관 이후 쌓여있던 숙제. ingress를 제대로 도입함. 그동안은 서비스마다 type: LoadBalancer 로 띄워서 비용이 새고 있었음.

선택은 nginx-ingress-controller. traefik도 고려했는데 사내 nginx 경험 많아서 디버깅 편한 쪽으로.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/proxy-body-size: 20m
spec:
  tls:
  - hosts:
    - api.example.com
    secretName: api-tls
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /v1
        backend:
          serviceName: api-v1
          servicePort: 80
      - path: /v2
        backend:
          serviceName: api-v2
          servicePort: 80

인증서는 cert-manager 도입. Let's Encrypt로 자동 발급/갱신. ingress에 annotation 하나 달고 Issuer 만들면 끝. 수동 인증서 발급하던거랑 비교하면 정말 편함.

metadata:
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"

뻘짓한 포인트:

1. proxy-body-size 기본 1m. 업로드 API에서 413 뜸. annotation으로 늘려야 함. 이거 찾는데 한 시간.

2. rewrite-target. path: /v1 로 매칭했을때 백엔드에는 / 만 전달하려면 rewrite 필요. 아니면 백엔드가 /v1/* 를 받게 되어 라우팅 꼬임.

3. health check. ingress-controller 자체가 죽지 않게 PDB (PodDisruptionBudget) 걸어둠. 노드 drain 때 전체 다운 안 되도록.

4. sticky session. 세션 고정이 필요한 서비스는 annotation:

nginx.ingress.kubernetes.io/affinity: cookie
nginx.ingress.kubernetes.io/session-cookie-name: sticky

이관 후 LoadBalancer 인스턴스 개수 7개 → 1개 (ingress용). 비용 2/3 절감. 배포 유연성도 올라감. 도메인/경로 기반 라우팅을 Ingress 리소스로 선언적으로 관리하니 리뷰/기록이 깔끔.

다음 숙제는 external-dns로 Route53 레코드까지 자동화. 점점 GitOps 방향으로 가는 중.

댓글 없음: