[K8S] Kubernetes Overview

조성열·2025년 11월 20일

Kubernetes

목록 보기
1/3
post-thumbnail

시작

나는 현재 토스뱅크에서 진행하는 사이버 보안 엔지니어 부트캠프에서 교육을 받고 있다. 보안에 대해 이론 + 실습 형식으로 웹, 네트워크, OS 등 다양한 분야에 존재하는 취약점과 공격 방식들에 대해서 학습하고 최종 프로젝트를 하는 식으로 교육이 구성되어 있다.
현재 교육기간이 약 50% 정도 지난 시점이고 프로젝트 시작까지 약 한달 정도 남아 있어 프로젝트 주제에 대해 생각을 해보다가 나는 인프라쪽에 관심이 많아 쿠버네티스 런타임 환경에서 발생할 수 있는 위협들에 대해 프로젝트를 하고 싶어 스터디를 진행하려고 한다.

보안에 대해 생각하기 전 우선은 쿠버네티스를 통해 서비스를 하면 어떤 식으로 동작하는지 먼저 알아야겠다는 판단이 들었고 학교 자료와 공식 문서를 통해 공부해서 정리 해보려고 한다.

Reference

https://kubernetes.io/ko/docs/home/

이번 포스트에서는 쿠버네티스가 무엇이고 왜 쓰는지 공부한 내용을 정리하겠다!

Goal

쿠버네티스 톺아보기


쿠버네티스란 무엇인가?

쿠버네티스의 기술적 정의는 이렇다. 컨테이너 통합 관리 환경으로 컨테이너 배포, 네트워크, 정책 등을 명세하여 클러스터 운영이 가능토록 하는 Orchestration 도구이다.
이렇게만 말하면 뭐지 싶을거다. 하나씩 뜯어보도록 하자!

먼저 컨테이너는 애플리케이션(서비스)을 특정 환경에 종속되지 않고 실행하는 기술이다. 조금 더 정확하게는 운영체제 위에서 동작하는 프로세스를 격리해서 별도 환경을 제공하는 기술인거다. 컨테이너를 사용했을 때 장점은 기존에 가상머신에 OS iso 파일을 사용해서 환경을 구축하는 가상화보다 훨씬 가볍고 편하게 서비스를 운영할 수 있다는거다.
암튼 우리가 어떤 환경을 이용하던 컨테이너 기술을 이용하면 환경에 상관없이 동일하게 어떤 작업을 하거나 서비스를 운용할 수 있다는게 포인트!

정리하자면 '컨테이너 통합 관리'란, 서비스 운영에 필요한 수많은 컨테이너를 하나의 논리적인 단위로 묶어 다룬다는 뜻이다.
즉, 관리 환경을 구축할 때 '우리가 원하는 상태(Spec)'를 명세하는 것이다. 서비스를 어떻게 배포할지, 네트워크 통신은 어떻게 연결할지 미리 적어두면 도구가 알아서 관리해주는 것, 그게 바로 쿠버네티스다.

이제 쿠버네티스에서 제공하는 주요 기능에 대해 알아보자.

k8s? 쿠버네티스?

kubernetes 'k'와 's' 사이에 8개의 철자가 들어 있다해서 k8s라고 흔히 부른다.


k8s Function

k8s가 통합 관리를 위해 제공하는 대표 기능은 Load Balancing, Auto Scaling, Auto Healing, Auto Rolling Update, Persistence Volume으로 총 6가지이다. 자세한 내용은 따로 포스트를 작성할 예정이니 가볍게 알아보자.

1. Load Balancing

서비스에 너무 많은 트래픽이 발생하면 서비스 서버는 어떻게 될까? 흔히 티켓팅, 수강신청 할 때 튕기는 것을 한번쯤은 경험했을 것이다. 서비스에 원만하게 접속이 안되는거 자체가 사용성이 떨어지기 때문에 동일한 기능을 하는 서비스 구성 요소를 다중화 하고, 이 트래픽을 다중화 한 요소들에 적절하게 뿌리면 한 곳으로만 몰리지 않기 때문에 서비스 장애가 발생하지 않을 것이다.
k8s 환경에서 서비스 운영 요소(Pod)에 적절하게 트래픽을 분산 해주는 기능을 지원하는데 이를 "Load Balancing"이라고 한다.

그런데 만약 트래픽을 보냈는데 그 Pod가 고장 난 상태라면 어떻게 될까? 서비스는 제대로 동작하지 않을 것이다. 따라서 운영 요소가 제대로 동작하는지 주기적으로 시그널을 통해 서로 확인하는 "Health Check" 기능도 지원한다.

2. Auto Scaling

어떤 서비스를 운영한다고 할 때, 초기에 설정한 자원이 상황에 따라 남을 수도, 부족할 수도 있다. 자원이 남으면 돈 낭비고, 부족하면 서비스가 버벅거리거나 뻗어버릴 수 있다.

서비스는 항상 일정한 품질을 유지해야 하는데, 레거시한 환경에선 사실상 불가능 할거다. 갑자기 트래픽 많아졌다고 서버를 한대 더 구입할건가? 말도 안된다.
그래서 k8s에서는 서비스 안정성을 위해 트래픽이 많을 때는 운영 요소를 추가하여 전체적인 스펙을 늘리고 트래픽이 잠잠할 때는 다시 줄이고를 자동으로 지원하는데 이를 "Auto Scaling"이라고 한다.

3. Auto Rolling Update

즐겨 하는 게임 또는 서비스가 업데이트한다고 "현재 접속이 불가능합니다"라는 공지를 띄우고 몇 시간 동안 막혀있던 경험 한번쯤은 있을 것이다. 운영자 입장에서 업데이트는 필수지만, 사용자 입장에서 서비스 중단은 곧 사용성 저하로 이어진다.

이런 딜레마를 해결하는 기술이 바로 무중단 배포, 즉 Rolling Update다. 쿠버네티스 기능의 꽃이라 할 수 있다.

원리는 간단하다. 서비스를 업데이트할 때 한꺼번에 껐다 켜는 게 아니다. 신규 버전의 운영 요소(Pod)를 하나 생성해서 트래픽을 받고, 잘 돌아가면 기존 버전 요소를 하나 줄이는 식으로 '점진적 교체'를 진행한다.

물론 업데이트 도중에는 구버전과 신버전이 공존하는 구간이 생기므로 호환성에 주의해야 하지만, 사용자 입장에선 "언제 바뀌었지?" 싶을 정도로 서비스 다운 타임이 없다는 것이 가장 강력한 장점이다.

배포 방식이 궁금하다면
진짜 보고 기립 박수쳤다. Toss slash 개발자 컨퍼런스 영상인데 시간 괜찮으면 한번쯤 보는거 추천 👍
https://www.youtube.com/watch?v=ApNj9MZU7Ak&t=323s

4. Auto Healing

Load Balancing에서 Health Check는 Pod의 상태를 체크하는 기능이라고 했다. 그럼 제대로 동작하지 않은 Pod는 어떻게 될까?
k8s는 사용자가 명세한 대로 움직인다. 즉, 서비스를 운용하는 Pod의 개수를 무조건 맞춘다는 얘기다. 만약 Pod 하나가 프로그램 오류로 인해 장애가 발생했다면 k8s 시스템은 즉시 이를 감지하고 해당 Pod를 폐기한 뒤 동일한 기능을 하는 새로운 Pod를 새로 생성하여 그 자리를 채워 서비스가 정상 동작 할 수 있게 해주는데 이 기능이 Auto Healing이다.

5. Persistent Volume (PV)

Pod는 하나의 서비스를 운용하는 컨테이너의 집합이다. 앞서 설명했듯이 서비스를 운용하는데 핵심이기 때문에 장애가 발생하지 않게 여러 기능이 존재하는 것이다.
앞에서 Pod에 장애가 발생하면 폐기 후 새로운 Pod를 생성한다고 했다. 그럼 여기서 한가지 의문이 든다. Pod에 담겨져 있는 데이터는 어떻게 하지?Pod가 폐기되면 그 데이터도 함께 날아갈텐데 말이다.

이러한 문제를 해결 해주는 것이 Persistent Volume이다. 만약 데이터도 함께 폐기된다면 서비스 지속성을 보장하지 못 할 것이다. 따라서 Persistente Volume은 Pod 외부에서 데이터를 어디에 어떻게 저장하고 관리할건지 명세하고, 기존 Pod가 폐기되고 새로운 Pod가 생성되어도 기존 데이터를 가져와 Mount할 수 있는 API를 제공하는 기능을 한다.


결론

지금까지 k8s가 뭔지 어떤 기능을 지원하는지 알아봤다. 서비스에 트래픽을 분산시키고, 상황에 맞춰 기능 요소의 리소스를 조절하고, 멈춤없이 업데이트 하고, 문제가 생기면 복구하고, 서비스 데이터까지 지킨다.
이 모든 기능을 관통하는 개념이 초반에 말한 Container Orchestration이다. 지휘자가 여러 연주자들을 지휘해 하나의 곡을 만들어 내듯이 서비스를 운용하고, 여러 요소들이 엮여 있는 환경을 명세를 통해 관리하고 이를 자동화 하는 것, 쿠버네티스다.

다음 포스트에서는 쿠버네티스 환경의 구조와 구성요소 대해 알아보도록 하자!

0개의 댓글