# CI/CD 교육 목표 - DevOps 문화 및 기술에 대한 심도있는 이해를 한다. - 효율적인 Dockefile을 작성할 수 있다. - Giltab CI Pipeline을 작성하여 직접 빌드할 수 있다. - ArgoCD를 CD Pipeline 작성을 통해 직접 배포할수 있다. - Nexus 환경설정 및 넥서스를 활용하는 CI/CD 파이프라인을 작성할 수 있다. # CI/CD 교육 자료 ## What is DevOps ? ### 등장 배경 및 역사 - DevOps는 개발(Development)과 운영(Operations)의 합성어로, 소프트웨어 개발의 아이디어에서부터 고객에게 제품을 배포하는 과정까지 모든 사이클을 통합하여 협력과 통신을 강화하는 문화, 움직임 또는 관행입니다. 이는 기술과 프로세스의 변화를 포함하여, 더 빠르고, 더 안정적이며, 더 질 높은 소프트웨어 배포를 가능하게 하기 위해 고안되었습니다. - DevOps의 뿌리는 Agile 개발 방법론에서 찾을 수 있습니다. Agile은 소프트웨어 개발 프로세스를 빠르게 반복하며 고객의 피드백을 신속하게 통합하는 것을 목표로 합니다. DevOps는 Agile의 이러한 원칙을 더욱 확장하여 운영에까지 적용한 것입니다. - DevOps는 지속적 통합(CI)과 지속적 배포(CD)를 중심 개념으로 삼습니다. CI/CD는 코드 변경사항을 자동으로 통합, 테스트, 배포하여 제품 출시 속도를 높이고, 품질을 개선하며, 고객에게 지속적으로 가치를 제공하는 프로세스입니다. - DevOps는 다양한 자동화 도구와 관행을 채택하여 개발 및 운영 프로세스를 최적화합니다. 이는 팀 간의 협력을 촉진하고, 수동 작업을 줄이며, 오류를 감소시키는 데 도움이 됩니다. - DevOps는 단순한 기술이나 도구의 집합이 아닌 문화적 변화를 추구합니다. 이는 개발팀과 운영팀 간의 협력과 소통을 강조하며, 실패에 대한 두려움을 줄이고, 실험과 혁신을 장려하는 환경을 조성합니다. - DevOps는 지난 수년 동안 IT 산업에 큰 영향을 미쳤으며, 많은 조직이 이를 채택하여 더 빠르고 효율적인 소프트웨어 개발과 운영 프로세스를 구현하고 있습니다. - ** 최근 유행하는 MSA 아키텍쳐를 성공적으로 완성하기 위해서는 쿠버네티스와 정교한 CI/CD가 동작하는 것이 필수가 되어가고 있습니다.** ### DevOps를 위한 도구 1. 버전 관리 시스템: - Git: 소스 코드 관리에 가장 널리 사용되는 도구입니다. GitHub, GitLab, Bitbucket과 같은 서비스와 함께 사용됩니다. 2. 지속적 통합(CI) 및 지속적 배포(CD) 툴: - Jenkins: 매우 유연한 CI/CD 도구로, 다양한 플러그인을 통해 확장할 수 있습니다. - GitLab CI/CD: GitLab에서 제공하는 내장 CI/CD 도구로, 소스 코드 저장소와 밀접하게 통합되어 있습니다. - ArgoCD : 지속적 배포를 위한 툴, GitOps를 구현할 수 있음. - Tekton : Kubernetes 기반의 강력한 오픈 소스 프레임워크로, 지속적 통합(CI) 및 지속적 배포(CD) 솔루션 3. 인프라스트럭처 자동화 (Infrastructure as Code): - Ansible: 구성 관리 및 애플리케이션 배포를 위한 간단하고 명료한 도구입니다. - Terraform: 인프라 구성을 코드로 작성하여 관리하는 데 사용되며, 여러 클라우드 제공업체에 걸쳐 작동합니다. 4. 컨테이너화 및 오케스트레이션: - Docker: 애플리케이션을 컨테이너화하는 표준 방법을 제공합니다. - Kubernetes: 컨테이너 오케스트레이션을 위한 가장 인기 있는 플랫폼입니다. 5. 모니터링 및 로깅: - Prometheus: 시스템 및 서비스 모니터링을 위한 강력한 도구입니다. - Grafana: 데이터 시각화 및 모니터링을 위한 인기 있는 대시보드 도구입니다. - ELK Stack (Elasticsearch, Logstash, Kibana): 로깅, 로그 분석, 데이터 시각화를 위한 종합적인 솔루션입니다. ### DevOps 개념도 ![](/images/1_devops_concept.png) ### CI/CD 플로우 ![](/images/2-cicd-flow.png) - CI/CD를 구현하는 툴은 매우 다양한 툴이 있으나 본 교육 과정에서는 쿠버네티스 기반 CI/CD 위주의 툴 중심으로 교육할 예정 - GitLab : Git & CI - ArgoCD : CD - Harbor : Container Registry - Nexus : Package & Library Registry ### 최근 SW 아키텍쳐와 CI/CD와의 연관성 ![](/images/2-msa-platform.png) - 최근 엔터프라이즈 SW 아키텍쳐가 MSA 위주로 구성되고 있음 - 수 많은 서비스들이 동시에 실행되면서 서비스간 통신이 중요해지고 있으로 정교한 CI/CD가 필요함. - Git에 의한 서비스 운영 개념인 GitOps도 대세갸 되어가고 있음. ### 머신러닝 & AI 와 CI/CD와의 연관성 ![](/images/3-ml-cicd.png) - 데이터가 변하므로 모델도 변해야 한다 ! - 트레이닝 시스템과 예측 시스템간의 연동이 중요하므로 정교한 CI/CD 필요함. ## CI/CD Pipelie 개발 교육 ### 개요 - 모든 빌드 맻 배포를 K8S 및 CI/CD 툴이 자동으로 진행하므로 개발자는 Dockerfile만 만들어 Project 루트에 넣어주면 됩니다. - 개발자는 최소한 Docker build를 통하여 빌드가 되는 것 까지는 학인해야 하고 가능하다면 .gitlab-ci.yml도 작성해 주는 것이 바람직. - 쿠버네티스상에서 빌드 및 배포하여 운영되므로 가급적 컨테이너 이미지를 최소화 하는 것이 중요. - 이미지가 클 경우 노드 장애시 Failover에 문제가 발생할 수 있음. - Gitlab 를 통해서 빌드하지 않고 K8S 클러스터 안에서 직접 Docker build하는 것은 지양해야 함. ### Dockerfile 개발 가이드라인 1. 베이스 이미지 선택 - 가능한 가벼운 이미지 사용 : From alpine 추천 - 공식이미지 사용 : 공식이미지는 보안취약점이 적고 최적화 되어 있으므로 가급적 공식이미지 사용 2. 레이어 최적화 - RUN 명령어 결합: RUN 명령어를 &&를 사용해 결합하여 불필요한 레이어 생성을 줄일 수 있음. ``` RUN apt-get update && apt-get install -y \ && package1 \ && package2 \ && package3 ``` - 캐시 활용 : 변경이 적은 명령어를 상단에 배치. 상단 레이이어 변화가 있으면 하위 레이어도 재빌드 됨. wget이나 curl은 최하단에 배치 바람직. 3. .dockerignore 파일사용 4. 멀티스테이지 빌드 - 빌드 단계와 실행 단계를 분리하여 최종 이미지의 크기를 줄일 수 있음. 빌드에만 필요한 도구는 최종 이미지에 포함하지 않도록 할 수 있음. ``` FROM golang:1.14 AS builder WORKDIR /app COPY . . RUN go build -o myapp . FROM alpine:latest COPY --from=builder /app/myapp . ENTRYPOINT ["./myapp"] ``` 5. 명시적인 태그 사용 ( 중요 ) - 버전이 지정되지 않은 경우 빌드 시점에 따라 다른 이미지가 만들어 질 수 있음. 6. 최소 권한 원칙 - USER 지시어를 사용하여 루트 사용자가 아닌 사용자료 실행하는 것이 보안에 바람직 ### Gitlab CI Pipeline 개발 가이드라인 1. Gitlab CI는 기본적으로 프로젝트 루트에 .gilab-ci.yml이 있으면 자동으로 CI/CD 진행함. 2. 파이프라인 구조 정의 - Stages : 파이프라인의 단계를 정의합니다. 예를 들어, build, test, deploy와 같은 스테이지를 정의할 수 있습니다. 명시된 Stage 순서대로 빌드가 진행됩니다. - Jobs : 각 스테이지에 속하는 작업을 정의 합니다. 동시 실행이 기본입니다. - 동일 Job안에서도 지정어(needs:)를 통하여 순서대로 빌드할수도 있음. > 하나의 스테이지 안에서 동시 수행하는 예제 ``` stages: - test job1: stage: test script: - echo "Running job1" tags: - your-runner-tag job2: stage: test script: - echo "Running job2" tags: - your-runner-tag ``` > 스테이지별 순서대로 수행하는 예제 ``` stages: - build - test build_job: stage: build script: - echo "Building the application..." tags: - your-runner-tag test_job: stage: test script: - echo "Testing the application..." tags: - your-runner-tag ``` ### ArgoCD CD Pipeline 개발 - ArgoCD 구성 요소 : Repositories / Clusters / Apps - Kustomization / Helm 방식 지원 - 여러 K8S 클러스터에 배포 가능 - K8S Manifest를 Git에서 불러오고 저장하는 방식으로 GitOps 구현 - argcod cli와 웹 UI를 통해 관리 가능 - 작업 순서 ( Kustomization 방식 ) 1. 배포용 Manifest 관리용 GitOps Repository를 만들고 Manifests파일을 작성한후 저장한다. 1. 위에서 만든 GitOps Repository를 ArgoCD에 등록한다. 1. 앱을 등록할때 미리 등록한 GitOps Repository에서 kustomization.yaml이 있는 폴더를 불러온다. 1. 앱을 생성 후 싱크한다. - 앱 등록후 업데이트 동기화 방법 1. 수동 동기화 : Gitlab pipeline을 통해 GitOps Repository에 푸시된 걸 확인한 후 ArgoCD 웹 UI를 통해 동기화 1. 자동 동기화 : 등록한 App에서 Enable Auto Sync 활성화 혀면 자동 동기화 됨, 단 폴링 방식 ( 3분 마다 폴링 ) 1. 즉각 동기화 : GitOps에 푸시되면 Webhook을 통한 동기화 ( Gitlab과 별도 연동 필요 ) 1. 필오에 따라 선택 : 초기 개발시에는 수동 , 안정화 되면 자동으로 배포. - 롤백 기능 제공하므로 필요시 롤백 가능 - 주의사항 : GitOps Reoository 우선 하므로 수동으로 kubectl edit 으로 작업했을 때는 반드시 GitOps Repositry에 동기화 할 것. > .gitlab-ci.yml 에서 kustomization 파일 수정 예제 ``` deploy: stage: deploy image: registry.smg.quantumcns.io/builder/deploy:v1.1 before_script: - git config --global user.name "$GITLAB_USER_NAME" - git config --global user.email "$CI_COMMIT_AUTHOR" - git config pull.rebase true script: - git clone https://ci.smg.quantumcns.io/devops/cicd/kustom/board.git - cd board/frontend - kustomize edit set image registry.smg.quantumcns.io/qms/board/frontend-v1:$CI_COMMIT_SHORT_SHA - cd ../backend - kustomize edit set image registry.smg.quantumcns.io/qms/board/backend-v1:$CI_COMMIT_SHORT_SHA - kustomize edit set image registry.smg.quantumcns.io/qms/board/db:$CI_COMMIT_SHORT_SHA - git commit -am "$CI_COMMIT_SHORT_SHA | $CI_COMMIT_MESSAGE" - git pull origin main - git push origin main ``` ## CI/CD Pipeline 종합 개발 실습 ### MSA 게시판 구축을 통한 MSA 파이프라인 개발 실습 - 사전 준비 사항 1. 실습할 수 있는 Gitalb/ArgoCD/Harbor 계정이 있어야 한다. 1. Kubectl 명령어로 배포할 K8S 노드를 관리할수 있어야 한다 - 실습용 MSA Board git : https://ci.smg.quantumcns.io/devops/cicd/codes/board.git - 실습용 GitOps git : https://ci.smg.quantumcns.io/devops/cicd/kustom/board.git - 실습 순서 : 1. 두개의 Git을 Clone하여 자신의 gitlab으로 푸시한다. 1. 개인용 namespace를 만든다. 1. 배포용 Manifest 파일 구성 방법 교육 1. 각자 네임스페이스에 배포되도록 배포용 파일을 수정한다. ingress 주소 / namespace 등 1. Dockerfile 수정해 본다. 1. .gitlab-ci.yml 수정 실습한다. 1. ArgoCD에 앱을 등록한다. 1. 소스 수정후 자동으로 배포되도록 한다. ``` apiVersion: v1 clusters: - cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJVDV0RFNSWlFhY2d3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TkRBek1USXdNekU0TXpsYUZ3MHpOREF6TVRBd016SXpNemxhTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUURIYzRRaXl2VGk5T0hLdlhFQmFJRmQ5VGhuTkhBRmtyeWw3cy91QmE1cDRoTEJMUE05eUx2OXNaay8KVGxPaCtwcndtWi9LUVlkWk0yTWhpc24ySTZaMjVDZ244dzN5bDE3UzNOMUl4RHFuNThJdWlqU0srcUJ5NE5yeQpyeVBYMXFwMXRrN1JuMW9mdkFtSmZ6NFlMQUhDc2p1NUZtamorcHpKSUhGRTc0SkUxTU5DWERINEpJVUlac2h3ClVrbWY5elNLR1hFR25td3grVC9GUU1mSVVldmFoVHFsMmcrVDdkemFRa2tQUFFZVTVqVloxZEJVYlJ1OERLVzAKQVlVZVYwb3hNZ0kwTWxJOTkzL2thWkFCT0R0aUgyejN5QzBBTHVjRmJWYlY1WG05OFFhTUR3VDJ2QklaekRVQwoxQzFSakg1TEVDV1k4bEZVTkpDbVVCVXJrbHVGQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSNmlvTkdxazc2ZkdsTmN4VjNjc1Zuc29NNk5qQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQmZQdUpVejVVLwpISzJ3N0NKTElwTXF6MGNJTndjZmh6M2poUHdPVmd1R051U1R1bGZGUzNsbUdsOCtIckNZZHAxYnRiRU1iSTVSCjNBNVdQeFNOUThZN2tSYjloTEYwSUVkdmpEdzAxVnJvbnZxakV5RXptdW4wdjR1QzV0bERvejRYZlJLOXRNcEcKbGE2eXQ3UUg0TzFXVXRWRlo4UEdITEo4UDdDNFlFVXRGTDVWbm9XZGVGSXJCcDNnM0sxYVdhVUNVYTNvTXdKSgphNzlaaXJuejRaZGxOVXdCelQ4VHNpMEE5Y3Jxa1prRW8yYjhUSzVscW9NVThwK1IrSCt2UUFsakpZTnhFK0xLCkFzZWF2NGRqOXZYd1N0M0FMV3J1S2pGdytzT3c0aEh0OVNzcklmUjlpUjY1N0JaRWV0Zi94U3Z1dTlYWnQzMWgKSEFhei9EbkhMVmpNCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K server: https://k8s.smg.quantumcns.io:8443 name: kubernetes contexts: - context: cluster: kubernetes user: kubernetes-admin namespace: qms name: SMG current-context: SMG kind: Config preferences: {} users: - name: kubernetes-admin user: client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLVENDQWhHZ0F3SUJBZ0lJV3puUnM1aTVSNDh3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TkRBek1USXdNekU0TXpsYUZ3MHlOVEF6TVRJd05EVTFNVEphTUR3eApIekFkQmdOVkJBb1RGbXQxWW1WaFpHMDZZMngxYzNSbGNpMWhaRzFwYm5NeEdUQVhCZ05WQkFNVEVHdDFZbVZ5CmJtVjBaWE10WVdSdGFXNHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFERXR0Y2wKZFo0eHB2UkE3UzhIOEx1bzMvNkI0WUZ5eFRSWm1oOGZlUTlLQ2l2MEIyZ2NMMzZoRG8zVHB1QnZja1AycEhFUwptaHBLQnhSODRCanVlakE0OUtwVDUrNnpMY2ZUYkJSSFVUbS9WUjJoODhvU1c1YWsva3QzUWZZRkcySmtNV3Z2CkFpK1owcnMzdld1S0NOaHR4NWtuNlZIYXVqaVlTb3J3NlVJSGNYV0VlQkNYZndHMEk0cTlYdVVoYkpVTGpvL1oKc2w4bU5hYTdBN3J2Q3RQVUhYcGt2ZFp3MWFmWmI4cm9TcXFFNllRUStXQjA5QWlQUTU0Yk5lRU9yTWFScnRrNAo0eWYxOHZObnhabFdyeWpkRDc1dGIzN2hnQ003RkJJWW1jeFd6OFRPMzFQOTRkWFdHT3pydy9maGRUVTViblJJClU2WDBKQytndTBCYnQzaG5BZ01CQUFHalZqQlVNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUsKQmdnckJnRUZCUWNEQWpBTUJnTlZIUk1CQWY4RUFqQUFNQjhHQTFVZEl3UVlNQmFBRkhxS2cwYXFUdnA4YVUxegpGWGR5eFdleWd6bzJNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNsMFMyT2VpcFV3Rm9rcFBPWmIwcHNTT3JECmR3SGFMUDlVbVd3WENFeFkvR1I1eDZmZWtOc2M0TXg3ZkFnWXVLZ0xYem9nU3N4SmY2TXllMXpyOEtDYmpOZkwKc1JtQ2xobE9HbUFydmJFS3gwcUZLbVRwRUxLWmtFbW1qVG5pV2lEWEZoN3ViMlNpc1N5V2Z6S2VQOVRHMXZxYwpibUFFalZ2MmYrVTg0SXVUUGxiRTRjTmN1enNoalNRQkRLOGpQcW9Bb2ZBU3pDb1VIK28yNGhpQ3FIdHE2SEs3Cm5odDhZS3dObFUxVG1jcFZQQ2JkbTZ1NHRGWC9iM2tIU01lTllERDhzTG02eTRZWFBHOW9VMC8ybktOQmhXSDIKVHhGdUNWYVpHY290eFRhNGhxT3FNOTN0NzE5S05DcTRiM3hzQnE5VVhxcHY2T2c2Snd4dHNSVXdLMHltCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBeExiWEpYV2VNYWIwUU8wdkIvQzdxTi8rZ2VHQmNzVTBXWm9mSDNrUFNnb3I5QWRvCkhDOStvUTZOMDZiZ2IzSkQ5cVJ4RXBvYVNnY1VmT0FZN25vd09QU3FVK2Z1c3kzSDAyd1VSMUU1djFVZG9mUEsKRWx1V3BQNUxkMEgyQlJ0aVpERnI3d0l2bWRLN043MXJpZ2pZYmNlWkorbFIycm80bUVxSzhPbENCM0YxaEhnUQpsMzhCdENPS3ZWN2xJV3lWQzQ2UDJiSmZKaldtdXdPNjd3clQxQjE2WkwzV2NOV24yVy9LNkVxcWhPbUVFUGxnCmRQUUlqME9lR3pYaERxekdrYTdaT09NbjlmTHpaOFdaVnE4bzNRKytiVzkrNFlBak94UVNHSm5NVnMvRXp0OVQKL2VIVjFoanM2OFAzNFhVMU9XNTBTRk9sOUNRdm9MdEFXN2Q0WndJREFRQUJBb0lCQVFDQTlhek43ZkdyYzF3bApSRmpVeDhqK3lQbThnKzJ0SkFOUnltd2s0ZVJZRVpzRysrUVF0a0k1cTZUbTREdTZWQnFpRXVQZDRoRGgvd283ClkxNTAyTDNNV1BsZzBHZjRKMGNkSDNtYjEzQVlNdUNlVDRobHlJMVYxUy84R3M0Q1F4V1p3WnlVcjhZcy9hMm0KdVJOTEJzbDhEcUlsUEJ4aFhEdkYrdmhqUDBmK1FBZTAvZkErQklMRHNoNis4Z3ZVOVBMWWladjRqQXFvcGxNRwplcnRWVThlWjdOOUZHK3VTdU8yMHpIbklENnE1OTFZTEhWSUtOUWs2VmdwSVM0bngzN1ZMdEpZbHVxbDRXYzJNCmNycTB3NGlpQzhXNVVnVW9wcW5td2grOG9MeHlUQmhmR29BWWVIOUN1dTNNTldRbFV4QmR0RVFTK0VDVjR4TzMKMVhRaUxsaGhBb0dCQVBla1haVFVVOUR3L1diT3hsdllFc1BLdEJmMnBhU24xdkRhelh5andrNjQyODViSkFIWgpLSW9EZjJQZXRZa0RFMEdpSGVDYkdmZ1VER2E2Z3lXNDNkbzdQWklQcDJTUWhLMlVaM3h2K0FJaFRxdGl5Y3lWCnMrUk9mcnpqUGVjTVA4M29QQUlMZ3lYL3VZNmxRWnMvcjg2L1RaYjBXeUt4aUsyNTgvNnhGRkE5QW9HQkFNdGEKZFBrelU1dXVFeFVmODM1bWZyeS9VRHFHak4xRFlBd044RTNKSjhwYmpyNW0wZlNKdXZ3K1VZN1dQRlU5cU9FegpMbHp2NTFmZUcxL253UXJvZndOWFEvVnJ1YWlpK1dkZTBYTkJKdG85c2JvS0RZekQva2dqcitxbmkxM05Id3dlCkxYMXpKQlMxQkE2eSsyK2NnaTI1VlFiQmdtc2FpMjhPS3pkVEp2RnpBb0dBUGt4OE9sKzhBamxPRmxuNGJzeUoKMC9XZm50T3UwaUJqSTA1NEdWMzlHTjdLZFR4YWI1aVk2VGQrQ2JyU1FuaWlsSVZiTE5ENEZIKytxdTFLNXVkOQo4Rk9zNXB6SGlMWU9tcmhWM0dreXBCNks4dlMwUGFKL2tmVHBUMDEvbWl0cnRib3h0blg4OVVkREFBNjAxWUNOCkV0N3Zmd1ZVRkFORGxpak1xQXNXU0NVQ2dZRUFsQ0FOK01BVWRPQTE4anRWNklyTVlyeVF1akRzUnZnZTdHankKMUJaa3I1aEZ3QmV4ZEFrbmRUb0h1cDMvVUxBYlpmOGNGSUtENTVOWUtXSHRVZjdORmlmb3pzcHJjSlZXU3AvYwp2YkdGbFk4KytKNytBNzE0YWgva3NtN2NxN1VRbW9rWTVicUxXN0lIaEpXSFpXT0J4OENxV01ONE5vQWRkUVhECklRZW01RlVDZ1lCcE1MM2xvSFkwTzhLTjZPVVFwOElhdE4xNGlWMXlhZFltTHM3OTdwWUdKYktvRUVORHorWDQKc1NWQUY2NXZuY2lvSnVwYUhXNTBFNHFFalJOZWhBTFFRR2ZBSkRnK2hrdXVIRUM4bVVPSE9vTG9vc3BPYlVIeAo5OGJNd2Z1Uk9oYUVsU0JVUlJUdm92UlhIa0FWbDR0aCtuc2RTMVlaZjRXVnZhTGZaQkpQZEE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= ``` ## 넥서스를 활용한 MLOps 파이프라인 개발 실습 ### Nexus Repository Manager 소개: #### 중앙집중식 아티팩트 관리 - 모든 유형의 아티팩트와 의존성을 한 곳에서 관리할 수 있는 강력한 도구입니다. 여러 언어와 기술 스택에 걸쳐 아티팩트를 저장, 검색, 및 공유할 수 있으며, 이는 코드 재사용성을 증가시키고, 개발 프로세스를 효율화합니다. ![](/images/nexus4.jpeg) - 제공하는 아티펙트 유형 1. Docker Image Repository 1. APT/YUM Repository 1. Maven Repository 1. Pypi Repository 1. R Repository 1. Conda Repository 1. Raw Repository : 일반 파일 저장소, wget, curl 등으로 다운로드 가능 #### 빠르고 안정적인 빌드 프로세스 - 외부 저장소로부터 아티팩트를 프록시하고 캐싱함으로써, Nexus는 의존성 해결 속도를 높이고, 외부 저장소가 다운되었을 때의 영향을 최소화합니다. 이는 빌드 시간을 단축시키고, 빌드 프로세스의 신뢰성을 높입니다. - 인터엣이 되지 않는 환경에서 효율적인 개발에 도움이 되는 도구 입니다. - 특히 외부에서 도커 이미지를 빈번히 다운로드 해야 하는 경우 Pull Limit 제한에 걸리지 않습니다. - MLOps의 경우 다운로드해야하는 이미지나 파일 사이즈가 커서 시간이 많이 걸리는 경우가 많은데 넥서스를 활용하면 내부 네트웍을 쓰기 때문에 다운로드 속도 향상에 도움이 됩니다. #### 향상된 협업 - 팀 내에서 생성한 아티팩트를 호스트하고 공유함으로써, 팀원들 간의 협업을 촉진하고, 공통 코드 및 컴포넌트의 재사용을 용이하게 합니다. - 외부 인원과 협업할때도 유용합니다. 공개할 수 없는 필수 소스는 라이브러이화 햐여 넥서스에 업로드 후 다운로드 하는 방식으로 협업이 가능합니다. #### CI/CD 통합 Nexus는 Jenkins, Gitlab 등 다양한 CI/CD 도구와 통합되어, 자동화된 빌드 및 배포 파이프라인에 쉽게 통합될 수 있습니다. 이는 개발 및 배포 프로세스의 자동화와 지속적인 통합 및 배포를 간소화합니다. ### 넥서스 활용 구성도 ![](/images/nexus3.png) - Maven 빌드로 만들어진 아티팩트를 넥서스에 업로드 및 다운로드 - 구성 방법 참고 : https://nextshds.tistory.com/63 ### MLOps 개발을 위한 넥서스 환경 설정 - Pypi Repository 구성 1. Pypi Proxy 설정 : https://pypi.org와 연결하는 프록시를 설정한다. 1. Pypi Hosted 설정 : 로컬에서 업로드하는 용도로 pypi-local 을 만든다. 1. Pypi Group 설정 : 위의 두개를 통합하여 pypi-repos를 만든다. 1. Dockerfile 등에서는 Nexus_host/repositories/pypi-repos를 사용한다. - Docker Repository 구성 1. 외부 Docker URL을 연결하는 Proxy를 만든다. 1. 로컬 업로드용 docker-local 을 만든다. 1. 위에서 만든 프록시와 로컬을 통합하여 docker-repos를 만든다. - APT Repositry 1. APT는 Proxy만 제공한다. 1. 설정 방법은 실습 참고 - Conda Repository 1. Proxy 기능만 제공함 1. 소스내에서는 활용할 경우 별도 추가 설정 필요 - RAw Repoistory 1. Wget 이나 Curl을 이용해야 하는 경우 설정한다. ### MLOps 개발 실습. - MLOps 파이프라인 구성 - 인터넷을 화용한 빌드와 넥서스르 활용한 빌드 동시 구성 방법 - iris.csv를 활용한 심플 모델 빌드 및 배포 실습 - 소스 : [Iris-model](https://ci.smg.quantumcns.io/devops/cicd/codes/mlops/-/tree/main/iris?ref_type%253Dheads) - Custom Jupyter Notebook 만들기 - 다양한 Nexus Reposiotry를 활용하여 Jupyter Noteebook을 빌드 및 배포하는 실습 - 자신만의 Jupyter Notebook을 만들어 본다. - 소스 : [Jupyter](https://ci.smg.quantumcns.io/devops/cicd/codes/mlops/-/tree/main/jupyter?ref_type%253Dheads)