지속적 통합(Continuous Integration)및 지속적 제공/배포(Continous Delivery/Deployment)를 의미하며, 소프트웨어 개발 라이프사이클을 간소화하고 가속화하는 것을 목표로 합니다.
CI: Continuous Integration(지속적 통합)은 코드 변경 사항을 공유 소스 코드 레포지토리에 자동으로 자주 통합하는 사례를 나타낸다.
CD: Continuous Delivery/Deployment(지속적 제공/배포)는 코드 변경 사항의 통합, 테스트, 제공을 나타내는 프로세스로, 두 가지 부분으로 구성됩니다. 지속적 제공에는 자동 프로덕션 배포 기능이 없는 반면, 지속적 배포에는 업데이트를 프로덕션 환경에 자동으로 릴리스합니다.

위와 같이 연결된 사례를 일반적으로 “CI/CD파이프라인”이라고 부르며 DevOps 또는 SRE(Site Reliability Engineer: SRE, 사이트 신뢰성 엔지니어) 를 통해 애자일 방식으로 협력하여 이를 지원합니다.
참고
개발자가 셀프 서비스로 운영을 하려면 그 플랫폼이 자동화되어 있어야 한다.
애플리케이션을 빌드하고 유연하게 배포하고, 이를 모니터링할 수 있는 플랫폼이 필요한데, SRE의
역할은 이러한 플랫폼을 개발하고, 이 플랫폼 위에서 개발자들이 스스로 배포,운영을 하는 것이 목표이다.

:docker, k8s, Jenkins, argoCD

Docker란 Go언어로 작성된 리눅스 컨테이너 기반으로하는 오픈소스 가상화 플랫폼이다.


컨테이너는 가상화 기술 중 하나로 대표적으로 LXC(LInux Container)가 있습니다. 기존 OS까지 가상화 시키던 것과 달리 컨테이너는 OS레벨에서 어플리케이션 실행 환경을 격리함으로써 마치 다른 OS에서 동작하는 것과 같은 가상 실행 환경을 제공하는 기술이다.
OS가상화의 경우에는 Host OS와 완전히 분리된다는 장점은 있지만 OS위에 OS를 올리기 때문에 무겁고 느릴 수 밖에 없다. 하지만 컨테이너 기반 가상화는 Host OS 그리고 Docker 엔진 위에서 바로 동작하며 Host의 커널을 공유 하여 I/O처리가 쉽워 성능 효율을 높일 수 있다.
즉, 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것이다.
해당 블로그에서는 Docker가 무조건 좋은 것은 아니라고 한다. OS가상화가 더 높은 격리 레벨을 지원하므로 보안적인 측면이 좋고 커널을 공유하지 않기 때문에 멀티 OS가 가능하다고 한다. 하지만 그럼에도 쓰는 이유는 성능향상, 뛰어난 이식성, 쉽게 Scale Out을 할 수 있는 유연성이라고 한다.

Docker Image란 컨테이너를 실행할 수 있는 실행 파일, 설정 값들을 가지고 있는 것이다.

Docker Image들을 저장하고 배포하는 Docker Hub는 정말 잘 활성화 되어 있다. 이미 여러 회사들은 소프트웨어를 Docker hub에서 image를 pull하여 간단하게 컨테이너에 넣어 사용할 수 있습니다. 하지만 이는 무엇인가 부족해 보이죠. 만약 배포판이 없거나 보완하고 싶다면 그럴 때 사용 할 수 있는 것이 Docker File이다.
Docker File은 이미지 생성 출발점으로 이미지를 구성하기 위한 명령어들을 작성하여 이미지를 구성할 수 있다.

도커의 등장으로 컨테이너 기반 배포 방식이 보편화 되고, 많은 서비스들이 도커라이징 되어 이미지로 관리되기 시작했다.
점점 이미지가 많아지면서, 관리해야할 컨테이너와 서버들이 많아지게 되면서, 엔지니어의 일이 많아지게 되었다.
컨테이너를 배포할 서버, 죽은 컨테이너 살리기 등등 잡스러운 일이 많아져 역시나 자동화 시키고 싶은 개발들,,,
컨테이너들 의 관리를 자동화할 도구(컨테이너 오케스트레이션 툴)의 필요성이 대두되었다.

젠킨스란 소프트웨어 개발시 지속적인 통합(Continuous integration)을 제공해주는 도구이다. 더불어 지속적인 배포환경(Continuous Delivery/Deployment)까지 구축할 수 있다.
Jenkins는 빌드, 테스트, 배포 프로세스를 자동화하여 개발자의 시간 절약과 개발 생산성을 높일 수 있다. 추가적으로 SVN, GIT과 같은 버전 관리 시스템과 연동하여 Commit을 감지하면 빌드가 작동되도록 설정할 수 있다.
Jenkins에서 CI프로세스를 정의하는 2가지 방법
- Freestyle project라고는 하지만 Jenkins에서 기본 틀을
정해주고 안에 빈칸을 채우는 형식으로 프로세스 흐름을 정의하는 방식이다.
- 장점
- 진입장벽 낮다.
- 참고자료 많다
- 단점
- 커스터마이징 제한적
- 테스트 혹은 빌드등의 작업에 병렬처리 미지원
- 다수의 형상관리 Repository와 연계 불가
- Pipeline이란 한 단계의 추력 결과물이 다음 단계의 입력으로
사용되는 일련의 데이터 처리구조이다.
- Jenkins의 Pipeline도 비슷한 의미로 한 곳에서부터 작업을 시작해서 일렬 혹은 여러갈래로
뻗어져 나갔다가 다시 모이면서 마무리되는 방식의 작업 흐름이다.
따지고 보면 Freestyle Project도 일렬로 처리되는 Pipeline Project이다.
- 장점
- 커스터마이징 폭이 넓다.
- 테스트 혹은 빌드 등의 작업에서 병렬처리 지원
- 다수의 형상관리 Repository와 연계하여 사용가능
- 단점
- 진입장벽이 비교적 높다
- 참고자료가 적다
- 결론
Freestyle Project는 기능적으로 제한이 많으니 특별한 이유가 없으면 무조건 Pipeline Project으로 생성하라고 한다.


GitOps는 DevOps의 실천 방법 중 하나로, 애플리케이션의 배포와 운영에 관련된 모든 요소들이 Git에서 관리한다는 뜻.
GitOps는 Git Pull 요청을 사용하여 인프라 프로비저닝 및 배포를 자동으로 관리한다.
Git 레포지토리에는 전체 시스템 상태가 포함되어 있어 시스템 상태의 변화 추이를 확인, 감시 할 수 있다.

ArgoCD는 GitOps 방식으로 관리되는 Manifest(yaml)파일의 변경사항을 감시하며, 현재 배포된 환경의 상태와 Github Manifest파일에 정의된 상태를 동일하게 유지하는 역할을 수행한다.(ArgoCD는 CD과정을 진행하는데 k8s로 배포한다고 보면 편하다.)

공부내용을 바탕으로 여러 diagram을 참고하여 그려봤다.

https://www.redhat.com/ko/topics/devops/what-is-ci-cd
https://colevelup.tistory.com/30
https://khj93.tistory.com/entry/Docker-Docker-개념
https://velog.io/@holicme7/K8s-쿠버네티스란-무엇인가
https://velog.io/@rnqhstlr2297/Jenkins-개념과-사용
https://l-sanghyeup.medium.com/jenkins에서-ci-프로세스를-정의하는-2가지-방법-22bf0fb1e608