31P by neo 2달전 | favorite | 댓글 1개

Kubernetes에 대한 비판적 안내서

  • Kubernetes는 일부 기술자들 사이에서 불필요하게 복잡하고 시간 낭비라는 평판을 얻었으며, 작은 팀에서 사용하는 것은 과잉 설계로 여겨짐.
  • Jamsocket에서는 몇 년간 Kubernetes를 생산 환경에서 운영하며, 필요한 기능만 사용하고 나머지는 무시하는 방식으로 효율적인 사용법을 찾음.

Kubernetes를 사용하는 이유

  • Kubernetes는 다음 세 가지를 모두 원할 때 가장 잘 다져진 길임:
    • 여러 프로세스/서버/예약된 작업을 실행하고자 할 때.
    • 이를 중복으로 실행하고 부하를 분산시키고자 할 때.
    • 코드로 이들의 설정과 상호 관계를 구성하고자 할 때.
  • Kubernetes는 컴퓨터 풀을 하나의 무두(headless) 컴퓨터처럼 다룰 수 있는 추상화 계층임.
  • Jamsocket은 하루에 여러 번 배포를 하며, 제품에 문제가 생기면 고객의 제품도 영향을 받으므로, 롤링 배포를 통해 자주 배포할 수 있는 자신감을 얻음.

Kubernetes 사용 방법

  • Jamsocket은 웹 앱과 통신할 수 있는 동적 프로세스를 생성하는 서비스로, AWS Lambda와 유사하지만 프로세스 수명이 단일 요청/응답이 아닌 WebSocket 연결에 종속됨.
  • Kubernetes는 API 서버, 컨테이너 레지스트리, 컨트롤러, 로그 수집기, 일부 DNS 서비스, 메트릭 수집 등 장기 실행 프로세스를 운영하는 데 사용됨.
  • Kubernetes를 사용하지 않는 것들: 일시적 프로세스, 정적/마케팅 사이트, 직접 데이터를 저장하는 것들.
  • Google Kubernetes Engine을 사용하여 Kubernetes 관리를 외부에 위임하고 있으며, 필요한 경우 Amazon EKS로의 이전이 비교적 간단함.

적극적으로 사용하는 Kubernetes 리소스

  • Deployments: 대부분의 파드는 배포를 통해 생성됨.
  • Services: 내부 서비스용 ClusterIP와 외부 서비스용 LoadBalancer 사용.
  • CronJobs: 정리 스크립트 등을 위해 사용.
  • ConfigMaps과 Secrets: 위 리소스에 데이터를 전달하기 위해 사용.

신중하게 사용하는 것들

  • StatefulSet과 PersistentVolumeClaim은 사용하고 있지만, 중요한 데이터는 Kubernetes 외부의 관리 서비스에 저장하는 것을 선호함.
  • RBAC은 복잡성을 추가하기 때문에 가능한 한 피함.

적극적으로 피하는 것들

  • 수작업으로 YAML 작성: TypeScript와 Pulumi를 사용하여 Kubernetes 리소스 정의 생성.
  • 비표준 리소스 및 오퍼레이터: 제3자 소프트웨어가 Kubernetes의 인프라를 사용할 수 있게 하지만, 실제로는 사용하기 까다로움.
  • Helm: 연산자 및 YAML 규칙 때문에 사용하지 않음.
  • "mesh"가 이름에 포함된 모든 것: 필요하지 않다고 판단함.
  • Ingress 리소스: 불필요한 간접성을 추가하는 것을 피함.
  • 전체 k8s 스택을 로컬에서 복제하기: Docker Compose나 자체 스크립트를 사용하여 필요한 시스템의 일부만 시작함.

사람이 Pod를 기다려서는 안 됨

  • Kubernetes는 컨테이너 시작 시간보다 견고함과 모듈성에 중점을 두고 설계되었으며, 사람이 Pod 시작을 기다리는 경우에는 적합하지 않음.
  • Jamsocket은 Plane이라는 MIT 라이선스의 Rust 오케스트레이터를 사용하여 대화형 워크로드를 위한 프로세스를 빠르게 예약하고 실행함.

상위 수준의 추상화

  • Kubernetes 대안 중 일부는 매우 좋으며, 특히 인프라를 코드로 지정할 필요가 없는 경우에 유용함.
  • Railway, Render, Flight Control과 같은 서비스를 사용하여 Kubernetes 대신 다른 솔루션을 선택할 수도 있음.
  • Kubernetes에 대한 접근 방식을 체계적으로 관리한다면, 누구도 너무 이르다고 말할 수 없음.

GN⁺의 의견

  • Kubernetes는 특히 대규모 시스템에서의 복잡성 관리와 자동화에 강력한 도구임에도 불구하고, 그 복잡성이 작은 규모의 프로젝트나 스타트업에게는 부담이 될 수 있음.
  • 이 글은 Kubernetes를 사용할 때 발생할 수 있는 과도한 복잡성을 피하는 방법을 제시함으로써, 초보자나 작은 팀도 Kubernetes의 이점을 활용할 수 있도록 도움을 줌.
  • Kubernetes를 사용하기 전에, 실제로 필요한 기능과 팀의 기술적 역량을 고려하여, 관리의 복잡성과 비용 대비 이점을 신중히 평가해야 함.
  • Kubernetes 대신 간단하고 관리가 용이한 서비스를 사용하는 것이 더 나을 수 있음. 예를 들어, Docker Swarm, Apache Mesos, Nomad 등이 있으며, 이들은 각각의 장단점을 가지고 있음.
  • Kubernetes를 도입할 때는 기존 인프라와의 통합, 보안, 관리 비용, 그리고 학습곡선 등을 고려해야 함.
  • Kubernetes를 선택함으로써 얻을 수 있는 이점은 확장성, 높은 가용성, 그리고 다양한 클라우드 환경에서의 일관된 배포 경험임. 그러나 이를 위해 필요한 리소스 관리와 오케스트레이션에 대한 이해가 필요함.
Hacker News 의견
  • 첫 번째 댓글 요약:

    • Kubernetes와 같은 복잡한 시스템을 도입하면, 그 복잡성이 계속 확장되어 다양한 컴포넌트가 서로를 강화하며 필수적으로 여겨지게 됨.
    • 클라우드가 처음 등장했을 때, 사람들은 로드 밸런서와 데이터베이스 관리의 복잡성을 줄이는 것에 매력을 느낌.
    • 상태가 없는(stateless) 앱 서버는 큰 유지 관리 문제가 아니었지만, 마이크로서비스를 전도함으로써 존재하지 않던 문제를 만들어냄.
    • 이제 이러한 문화가 정착되어 마이크로서비스가 필수라는 주장에 손을 흔들며 동의하기 어려워짐.
  • 두 번째 댓글 요약:

    • 중소기업에 Kubernetes를 도입하는 사람으로서, 불만을 가진 엔지니어들이 있었지만 대부분은 만족한다고 응답함.
    • Kubernetes는 복잡하지만, 복잡한 문제에 맞는 도구임.
    • 표준을 갖는 것은 문서화되지 않은 간단한 혼돈보다 낫고, "kubectl explain X"는 AWS 문서보다 훨씬 낫다고 주장함.
    • Kubernetes가 복잡하긴 하지만, 개발자들이 이전 직장에서 사용했던 방식과 동일하게 작동하며, 속도가 중요함.
  • 세 번째 댓글 요약:

    • Kubernetes에 대한 비판이 유행이지만, 여전히 최고의 솔루션임.
    • 인프라를 선언적으로 정의하고, 로드 밸런싱, 자동 복구 및 스케일링을 제공함.
    • 전체 스택에 대한 훌륭한 관찰 가능성을 제공하고, 많은 사전 패키지 소프트웨어를 사용할 수 있음.
    • 클라우드, 자체 서버, 로컬 환경에서 거의 동일한 인프라를 구축할 수 있어 특정 클라우드 제공업체에 종속되지 않음.
  • 네 번째 댓글 요약:

    • Kubernetes의 큰 이점은 Helm이나 Operators임.
    • 복잡성 비용을 지불하는 경우, 인프라 컴포넌트의 '앱 스토어'와 운영을 프로그래밍 방식으로 관리할 수 있는 이점을 얻어야 함.
    • 예를 들어 Ceph와 같은 복잡한 것을 설정하려면 Rook이 좋은 방법임.
    • Helm이나 Operators는 인프라를 관리형 '턴키' 어플라이언스로 만들지 않지만, 선언적 인터페이스는 일반적으로 관리하기 더 좋음.
  • 다섯 번째 댓글 요약:

    • Kubernetes는 좋은 기술이지만, 복잡성 때문에 유지 관리자들이 회사의 영웅이 되는 경향이 있음.
    • 많은 조정 사항과 레버가 프로젝트의 실제 목표에서 벗어나게 만들 수 있음.
  • 여섯 번째 댓글 요약:

    • 현재 회사는 Kubernetes와 Ansible 기반의 맞춤형 배포 시스템으로 나뉨.
    • Ansible 방식은 잘 작동하지만, Kubernetes로 이전하면 배포 시간을 몇 시간에서 몇 분으로 단축시키고, 더 빠르고 효율적으로 자동 스케일링할 수 있음.
    • Helm 배포 실패 원인 파악의 어려움과 새로운 운영 방식 학습 필요성 등이 이전 팀들로부터 들은 일관된 피드백임.
  • 일곱 번째 댓글 요약:

    • 전 구글 사이트 신뢰성 엔지니어와의 대화에서, 실제로 Kubernetes가 필요한 회사는 손에 꼽힌다고 함.
    • 많은 사람들이 유행을 따라 개발하는 경향이 있음.
  • 여덟 번째 댓글 요약:

    • Kubernetes가 올바른 도구일 수 있지만, 필요악으로 받아들여야 함.
    • 여러 당사자의 실패로 인해 협업에 실패할 가능성이 있는 소프트웨어는 자주 문제를 일으킬 수 있음.
  • 아홉 번째 댓글 요약:

    • YAML을 직접 작성하는 것은 문제가 될 수 있으므로, 대신 TypeScript와 Pulumi를 사용하여 Kubernetes 리소스 정의를 생성함.
    • YAML을 린팅하는 대신 전체 프로그래밍 언어 런타임과 서드파티 라이브러리를 도입하고, 버전 유지 관리, 프로젝트 컴파일 등의 추가적인 복잡성을 감수함.
  • 열 번째 댓글 요약:

    • Kubernetes에 대한 열정을 가졌던 사람으로서, Kubernetes의 좋은 부분은 기본 요소(배포, 서비스, configmaps)이며 나머지는 특별한 상황에만 사용해야 함.
    • 팀은 설정을 명확하고 분명하게 유지하기 위해 원시 YAML을 작성하고 kustomize를 사용하는 것을 선호함.