이 글은 AWS에서 재직 중이신 SA님의 특강을 듣고 작성된 글이다. 좋은 기회가 있어서 특강을 듣게 되었고, 정리 되지 않았던 개념들을 한 번에 정리해 주셔서 그 부분을 기록하기 위해 글을 작성한다.
DevOps라는 말을 요즘들어 참 많이 듣는다. 내가 지금까지 느꼈던 DevOps는 FrontEnd, BackEnd처럼 하나의 개발 분야로 생각하고 그렇게 느껴왔다. 틀렸던 개념은 아니지만 맞는 개념은 아니였다.
위 문구가 DevOps의 개념이며 명확하게 알고 있어야 한다.
위에서 DevOps는 철학, 방식 및 도구의 조합이라는 정의를 내렸다. 이것들을 나타내기 위하여 세가지 영역을 정의한다.
위의 세가지 영역 중 Product는 기술적인 부분이다. 사실 나머지 두 부분은 혼자서 열심히 한다고 바뀌는 부분이 아니다. 팀의 가치와 협업 능력 등이 두 가지를 결정한다고 생각한다.
Cloud Native는 DevOps에서의 개발과 운영을 기술적인 측변에서 지원하는 것이다. 특징은 다음과 같다.
DevOps의 Product 개념을 설명하면서 Container의 필요성으로 넘어간다. 왜 사용하는지 먼저 생각을 해보아야 한다. 개발자들은 각자 다른 개발 환경에서 개발을 진행하고 배포를 하려고 한다. 하지만, 이는 협업을 진행할 때 Critical하게 작용할 수 도 있다. 또한, 환경세팅이라는 귀찮은 Process가 생기면서 개발 속도에 영향을 미칠 수도 있다. 이것만 해결하려고 Container라는 개념이 들어온 것은 아니지만, 이런 부분을 해결하기 위해 나왔다고 생각하면 된다.
위 사진은 컴퓨팅 유형의 변천사이다. 컨테이너 기술의 핵심은 호스트 OS에서 실행되는 컨테이너 런타임이라는 소프트웨어이다. 컨테이너 런타임은 네임스페이스 등의 OS 기능을 사용하여 애플리케이션과 리소스를 분리하고 컨테이너를 움직이는 역할을 한다. 컨테이너 런타임 위에서 여러 컨테이너를 실행할 수 있다.
Container를 사용하여 애플리케이션을 쉽고 빠르게 시작할 수 있다.
리소스를 절약하고 효율적으로 사용할 수 있다
애플리케이션을 패키징하여 어디서나 시작 가능하다
Container는 인프라를 의식하지 않고, 경량의 컨테이너를 신속하게 생성/삭제/이동할 수 있는 특징이 개발자에게 큰 이점을 가져다준다는게 큰 이점이다.
컨테이너는 위와 같이 많은 이점이 있지만 엔터프라이즈 환경에서 활용하려면 다양한 문제를 해결해야 한다. 문제들은 아래와 같다.
컨테이너가 외부 호스트 또는 외부 호스트의 컨테이너와 통신하려면 NAT를 거쳐야 함
컨테이너에 문제가 생기면 복구가 되어야 함
가용성 확보와 부하 분산 자동화 문제 발생
트래픽이 쇄도하면 자동 스케일링 매커니즘도 필요
보안, 가용성, 감시, 백업 등 다양한 점을 검토해야 함
리소스 여유가 있는 적합한 호스트에 컨테이너를 배포할 수 있어야 함
많은 문제들이 발생한다. 가장 큰 문제는 많은 컨테이너들이 존재하고, 각각의 컨테이너들에 문제가 생길 경우인 것 같다.
이를 해결하기 위해 Kubernetes가 필요하다
쿠버네티스는 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링 및 관리해주는 오픈 소스 시스템이다. 제공하는 기능은 다음과 같다.
서비스 디스커버리와 로드 밸런싱
스토리지 오케스트레이션
자동화된 롤아웃과 롤백
자동화된 빈 패킹
자동화된 복구
시크릿과 구성 관리
Kubernetes의 작동원리는 위와 같다. 개발자는 개개인의 docker에 직접 접근하는 것이 아니라 kubernets의 Control Plane, Master를 사용하여 컨테이너들을 제어한다.
IaC는 서버 등의 시스템 인프라의 구축 및 관리를 코드를 사용해서 하는 것이다. 자주 사용하던 언어를 사용해서 인프라 관리를 진행할 수 있다. AWS에서는 AWS CDK라는 소프트웨어 개발 프레임워크를 사용하여 친숙한 개발 언어로 클라우등 니프라를 정의하게 해준다.
하시코프에서 GO 언어로 개발한 오픈소스 IaC도구이다. AWS에서 Terraform을 사용하여 EKS를 구축할 수 있다.
애플리케이션을 출시하기까지의 과정은 크게 보면 아래 4가지의 과정을 거친다
Source, Build, Test, Production
이 과정을 거치면서 여러 사람들이 작업을 진행하기 때문에 이를 원활히 해결하지 못하면 문제가 발생할 수 있다. 또한, Prodcution을 마치고 나서 사용자들이 서비스를 이용하고 있는데, 그 상태에서 배포를 또 해버리면 사용자들이 서비스를 이용하지 못하게 된다. 이를 해결하기 위해서 CI/CD라는 것을 사용해야 한다.
보통 CI/CD는 github action을 통해 관리하지만, AWS에서도 이를 제공해준다. CI는 CodeCommit, CodePipeline으로 관리해줄 수 있고, CD는 AWS의 ArgoCD를 사용하여 관리해줄 수 있다.