20170408

Docker Swarm 운영 vs K8s 이관

6개월 전 docker swarm mode (1.12 부터 통합된 그거)로 올려놨던 서비스 몇개. 이제 k8s로 이전하는 중. 왜 바꿨는지 정리.

swarm 좋았던 점:

  • docker compose 익숙하면 러닝커브 제로 수준. docker stack deploy -c docker-compose.yml mystack
  • 기본 세팅이 빠름. docker swarm init 한 줄
  • built-in routing mesh — 어느 노드로 요청 오든 해당 서비스 컨테이너로 라우팅

swarm 한계:

  • ingress controller / 복잡한 라우팅 규칙 제한적
  • configmap은 있는데 secret rotation 같은 운영 기능이 덜 무르익음
  • helm 같은 패키지 매니저 생태계 없음. 직접 stack 파일 관리
  • 커뮤니티 확장이 k8s 대비 훨씬 적음. 모니터링/로깅 도구 연동이 번거로움
  • 대규모 클러스터 (수백 노드) 운영 사례가 많지 않음

k8s 쪽에서 지금 쓰는 것들:

  • deployment / service / ingress
  • configmap / secret
  • helm chart (prometheus, grafana 등 기본 스택)
  • nginx-ingress-controller
  • cert-manager (let's encrypt 자동 발급)

마이그 진행방식: 서비스별로 helm chart 만들고, stage에서 동시에 swarm/k8s에 띄워놓고 비교 → k8s 쪽으로 DNS 스위치 → swarm 측 철수. 한번에 넘기지 않고 점진적으로.

빡셌던 건 ingress 쪽. swarm의 routing mesh처럼 암묵적 분배가 되는게 아니라 명시적 ingress 리소스 만들고 rule 정의 해야됨. 처음엔 귀찮은데 익숙해지면 강력함.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: web
          servicePort: 80

결론: 소규모 / 단순 케이스에서는 swarm이 여전히 간편하고 충분. 근데 조금만 요구사항 커져도 k8s로 가는게 장기적으로 덜 피곤. 커뮤니티 모멘텀이 k8s로 완전히 쏠린게 체감됨. 회사 표준도 k8s로 맞출 계획.