📍 90DaysOfDevOps - MichaelCade를 공부한 내용
📍 What is DevOps?를 공부하고 정리
Dev와 Ops의 교집합이다!
여기서 드는 의문점!
전형적인 소프트웨어 배포 과정은 다음과 같다.
배포 후에도 유저들이 소프트웨어에 접근가능하고 사용할 수 있는지 확인해야 한다.
초기 배포 후에도 '개선'이 이루어지게 된다.
소프트웨어가 개선될 때마다 새로운 버전을 가지게 된다.
소프트웨어는 지속적으로 소프트웨어를 개선시키기 위해 다음 과정을 끊임없이 반복하게 된다.
소프트웨어는 지속적인 전달(Continuous Delivery)을 거친다.
DevOps는 이러한 CD 과정을 빠르고 버그 없이 이루어지도록 돕는다.
DevOps는 빠른 전달과 높은 품질을 보장한다.
이제 배포 프로세스의 속도를 저하시키는 방해물을 알아보고 해당 방해물을 DevOps가 어떻게 해결하는지 살펴보자.
애플리케이션을 배포하는 과정에서 주요한 두 부분은 애플리케이션 코드 작성
과 애플리케이션을 배포하고 동작시키는 것
이다.
그래서 배포 가이드는 충분히 문서화되지 않게 되고 운영자는 애플리케이션을 배포하기 위해 더 많은 시간을 낭비하게 된다.
명확히 정의된 자동화 프로세스를 거치지 않고 관료적인 프로세스를 거치게 된다.
개발자와 운영자는 서로 다른 지향점을 가지기 때문에 협업하기 어렵다! 높은 품질의 애플리케이션을 사용자에게 빠르게 전달하자
는 공통된 목표와 각자의 지향점이 충돌하게 된다.
보안팀과 운영팀은 보안을 바라보는 관점이 다르다.
이를 평가하기 위해 길고 관료적인 과정을 거치게 된다.
그러나 DevOps는 프로세스의 속도를 낮추는 방해물들을 제거한다. DevOps에게는 보안 역시 프로세스의 속도를 낮추는 방해물이다.
대신 보안의 중요성을 강조하는 DevSecOps가 등장했다.
애플리케이션을 배포하기 전에 다양한 수준의 테스트를 거치게 된다. 자동화된 테스트에 완전히 의존할 수 없기 때문에 종종 수동 테스트도 진행한다.
애플리케이션 테스트는 배포 과정에서 중요한 부분이지만 이 역시 프로세스의 속도를 낮추는 방해물이다.
배포 과정에서 수행되는 수동 작업은 프로세스의 속도를 낮추는 방해물이다.
이처럼 배포 과정의 속도를 저하시키는 다양한 방해물들이 존재한다.
DevOps는 다음 방식을 통해 모든 방해물들을 제거하고자 한다.
많은 회사들이 DevOps를 각각 다른 방식으로 구현하고 있다.
많은 회사들 사이에서 DevOps가 점차 견고한 형태를 띄게 되면서 DevOps는 실제 역할로 진화했다.
Dev와 관련해서 DevOps 엔지니어는
Ops와 관련해서 DevOps 엔지니어는
Networking & Security와 관련해서 DevOps 엔지니어는
DevOps 엔지니어는 dev와 ops의 '기본'만 알면 된다.
각 분야별로 전문가들이 존재한다.
DevOps 엔지니어는 기본 개념들을 이해하고 애플리케이션이 동작할 서버를 준비한다.
오늘날 컨테이너는 소프트웨어 패키징 모델의 표준이 되고 있다.
따라서 DevOps 엔지니어는 가상화와 컨테이너에 대해 이해하고 컨테이너를 다룰 수 있어야 한다.
DevOps 엔지니어들의 한쪽에는 코드를 작성하는 개발자들이, 다른 한 쪽에는 안정적인 시스템을 제공하는 운영자들이 있다.
DevOps 엔지니어는 개발자가 개선한 코드를 빠르게 새로운 버전으로 배포해야 한다. 이것이 DevOps 엔지니어의 기본 역할이자 책임이다.
DevOps 엔지니어는 어떻게 빠르고 효율적인 자동화된 CI/CD를 제공할 수 있을까?
배포 과정에 대해 이해하고 있어야 한다.
이는 순차적인 스탭이기 때문에 빌드 자동화 도구(ex. jenkins)를 이용해서 배포 과정을 자동화할 수 있다.
CI/CD 파이프라인은 DevOps 작업과 책임의 중심에 있기 때문에 DevOps 엔지니어는 애플리케이션을 위한 완전한 CI/CD 파이프라인을 구성할 수 있어야 하며 파이프라인은 연속적이어야 한다.
오늘날 회사들은 물리적인 인프라를 구성하는 대신에 클라우드에서 가상 인프라를 구성한다. 이는 비용 측면에서 이점을 가지기 때문이다.
따라서, 적어도 하나의 클라우드에 대해 배워야 한다.
이제 클라우드 위에서 컨테이너가 어떻게 관리되고 있는지를 알면 된다.
가장 인기 있는 컨테이너 오케스트레이션 도구는 kubernetes이다.
따라서, 쿠버네티스가 어떻게 동작하는지 이해해야 한다. 이로써, 쿠버네티스 클러스터를 관리할 수 있을 뿐만 아니라 클러스터에 애플리케이션을 배포할 수 있다.
수백개의 서버 위에서 수천개의 컨테이너가 실행되고 있다면 개별 애플리케이션의 성능을 어떻게 측정하고 쿠버네티스 클러스터의 문제점을 어떻게 발견할 수 있을까?
DevOps의 책임 중 하나는 실행 중인 애플리케이션와 쿠버네티스 클러스터의 서버가 잘 동작 중인지 모니터링하는 것이다.
production 환경 이외에도 테스트 환경이나 개발 환경 같이 다양한 환경들이 존재한다. 이 때 각 환경에서 수동으로 인프라를 구축하는 것은 에러 발생률을 높이고 많은 시간을 소모하기 때문에 비효율적이다.
두 가지 유형의 IaC 도구를 조합하여 사용한다면 인프라를 자동으로 구축하고 구축된 인프라 위에서 애플리케이션을 자동으로 배포할 수 있다.
DevOps 엔지니어는 하나 이상의 IaC 도구를 숙지하여 더 효율적이고 투명하고 쉽게 인프라를 구축해야 한다.
개발과 운영을 위해 자동화된 작업(ex. cronjob)을 수행할 필요가 있다.
따라서, DevOps 엔지니어는 적어도 하나 이상의 스크립트 언어(운영체제에 종속적, ex. bash, powershell) 또는 프로그래밍 언어(운영체제에 독립적, ex. python ruby, go)를 알아야 한다.
파이썬은 오늘날 가장 인기있고 요구되며 배우기 쉬운 언어이다. 파이썬은 데이터베이스와 클라우드를 위한 라이브러리도 제공한다.
IaC(Infrastructure as Code) 역시 애플리케이션 코드와 마찬가지로 버전 관리 시스템(ex. gitlab, github)을 사용하여 관리한다.
따라서, DevOps 엔지니어는 git도 알아야 한다.
👉 각 카테고리 별로 하나의 도구를 배워라
👉 기왕이면 가장 유명하고 가장 많이 사용되는 도구를 배워라
더하여, DevOps 엔지니어는 각각의 도구들을 익혀야할 뿐만 아니라 이러한 도구들을 '조합'해서 사용할 수 있어야 한다.
DevOps는 자동화되고 간소화된 배포 프로세스를 구성하기 위해 수행해야 하는 작업이라고 정의할 수 있다.
반면에, SRE(Site Reliablility Engineering)는 배포 프로세스를 정확히 구현하는 방법과 DevOps 원칙을 구현하는 구체적인 방법이라고 정의할 수 있다.
그래서 많은 이들이 SRE가 DevOps 개념의 특정 구현이라고 말한다. 그러나 DevOps는 DevOps 자체 역할로 구현되었다.
정리하자면 SRE와 DevOps는 공통된 지향점을 갖는다.
하지만 역할로 구현된 DevOps는 '실용성'을 지향하기 때문에 빠른 배포에 집중한다.
그러나 SRE는 이름에서 알 수 있듯이 '신뢰성'에 중점을 두고 빠른 변화를 허용하면서 시스템을 안정적으로 유지한다.
SRE에 대해 더 자세히 알고 싶다면 다음 비디오를 참고하자.