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과 같은 서비스와 함께 사용됩니다.

  1. 지속적 통합(CI) 및 지속적 배포(CD) 툴:

  • Jenkins: 매우 유연한 CI/CD 도구로, 다양한 플러그인을 통해 확장할 수 있습니다.

  • GitLab CI/CD: GitLab에서 제공하는 내장 CI/CD 도구로, 소스 코드 저장소와 밀접하게 통합되어 있습니다.

  • ArgoCD : 지속적 배포를 위한 툴, GitOps를 구현할 수 있음.

  • Tekton : Kubernetes 기반의 강력한 오픈 소스 프레임워크로, 지속적 통합(CI) 및 지속적 배포(CD) 솔루션

  1. 인프라스트럭처 자동화 (Infrastructure as Code):

  • Ansible: 구성 관리 및 애플리케이션 배포를 위한 간단하고 명료한 도구입니다.

  • Terraform: 인프라 구성을 코드로 작성하여 관리하는 데 사용되며, 여러 클라우드 제공업체에 걸쳐 작동합니다.

  1. 컨테이너화 및 오케스트레이션:

  • Docker: 애플리케이션을 컨테이너화하는 표준 방법을 제공합니다.

  • Kubernetes: 컨테이너 오케스트레이션을 위한 가장 인기 있는 플랫폼입니다.

  1. 모니터링 및 로깅:

  • Prometheus: 시스템 및 서비스 모니터링을 위한 강력한 도구입니다.

  • Grafana: 데이터 시각화 및 모니터링을 위한 인기 있는 대시보드 도구입니다.

  • ELK Stack (Elasticsearch, Logstash, Kibana): 로깅, 로그 분석, 데이터 시각화를 위한 종합적인 솔루션입니다.

DevOps 개념도

CI/CD 플로우

  • CI/CD를 구현하는 툴은 매우 다양한 툴이 있으나 본 교육 과정에서는 쿠버네티스 기반 CI/CD 위주의 툴 중심으로 교육할 예정

  • GitLab : Git & CI

  • ArgoCD : CD

  • Harbor : Container Registry

  • Nexus : Package & Library Registry

최근 SW 아키텍쳐와 CI/CD와의 연관성

  • 최근 엔터프라이즈 SW 아키텍쳐가 MSA 위주로 구성되고 있음

  • 수 많은 서비스들이 동시에 실행되면서 서비스간 통신이 중요해지고 있으로 정교한 CI/CD가 필요함.

  • Git에 의한 서비스 운영 개념인 GitOps도 대세갸 되어가고 있음.

머신러닝 & AI 와 CI/CD와의 연관성

  • 데이터가 변하므로 모델도 변해야 한다 !

  • 트레이닝 시스템과 예측 시스템간의 연동이 중요하므로 정교한 CI/CD 필요함.

CI/CD Pipelie 개발 교육

개요

  • 모든 빌드 맻 배포를 K8S 및 CI/CD 툴이 자동으로 진행하므로 개발자는 Dockerfile만 만들어 Project 루트에 넣어주면 됩니다.

  • 개발자는 최소한 Docker build를 통하여 빌드가 되는 것 까지는 학인해야 하고 가능하다면 .gitlab-ci.yml도 작성해 주는 것이 바람직.

  • 쿠버네티스상에서 빌드 및 배포하여 운영되므로 가급적 컨테이너 이미지를 최소화 하는 것이 중요.

  • 이미지가 클 경우 노드 장애시 Failover에 문제가 발생할 수 있음.

  • Gitlab 를 통해서 빌드하지 않고 K8S 클러스터 안에서 직접 Docker build하는 것은 지양해야 함.

Dockerfile 개발 가이드라인

  1. 베이스 이미지 선택

  • 가능한 가벼운 이미지 사용 : From alpine 추천

  • 공식이미지 사용 : 공식이미지는 보안취약점이 적고 최적화 되어 있으므로 가급적 공식이미지 사용

  1. 레이어 최적화

  • RUN 명령어 결합: RUN 명령어를 &&를 사용해 결합하여 불필요한 레이어 생성을 줄일 수 있음.

RUN apt-get update && apt-get install -y \
  &&  package1 \
  &&  package2 \
  &&  package3
  • 캐시 활용 : 변경이 적은 명령어를 상단에 배치. 상단 레이이어 변화가 있으면 하위 레이어도 재빌드 됨. wget이나 curl은 최하단에 배치 바람직.

  1. .dockerignore 파일사용

  2. 멀티스테이지 빌드

  • 빌드 단계와 실행 단계를 분리하여 최종 이미지의 크기를 줄일 수 있음. 빌드에만 필요한 도구는 최종 이미지에 포함하지 않도록 할 수 있음.

FROM golang:1.14 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

FROM alpine:latest
COPY --from=builder /app/myapp .
ENTRYPOINT ["./myapp"]

  1. 명시적인 태그 사용 ( 중요 )

  • 버전이 지정되지 않은 경우 빌드 시점에 따라 다른 이미지가 만들어 질 수 있음.

  1. 최소 권한 원칙

  • 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파일을 작성한후 저장한다.

    2. 위에서 만든 GitOps Repository를 ArgoCD에 등록한다.

    3. 앱을 등록할때 미리 등록한 GitOps Repository에서 kustomization.yaml이 있는 폴더를 불러온다.

    4. 앱을 생성 후 싱크한다.

  • 앱 등록후 업데이트 동기화 방법

    1. 수동 동기화 : Gitlab pipeline을 통해 GitOps Repository에 푸시된 걸 확인한 후 ArgoCD 웹 UI를 통해 동기화

    2. 자동 동기화 : 등록한 App에서 Enable Auto Sync 활성화 혀면 자동 동기화 됨, 단 폴링 방식 ( 3분 마다 폴링 )

    3. 즉각 동기화 : GitOps에 푸시되면 Webhook을 통한 동기화 ( Gitlab과 별도 연동 필요 )

    4. 필오에 따라 선택 : 초기 개발시에는 수동 , 안정화 되면 자동으로 배포.

  • 롤백 기능 제공하므로 필요시 롤백 가능

  • 주의사항 : 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 계정이 있어야 한다.

    2. 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으로 푸시한다.

    2. 개인용 namespace를 만든다.

    3. 배포용 Manifest 파일 구성 방법 교육

    4. 각자 네임스페이스에 배포되도록 배포용 파일을 수정한다. ingress 주소 / namespace 등

    5. Dockerfile 수정해 본다.

    6. .gitlab-ci.yml 수정 실습한다.

    7. ArgoCD에 앱을 등록한다.

    8. 소스 수정후 자동으로 배포되도록 한다.

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 소개:

중앙집중식 아티팩트 관리

  • 모든 유형의 아티팩트와 의존성을 한 곳에서 관리할 수 있는 강력한 도구입니다. 여러 언어와 기술 스택에 걸쳐 아티팩트를 저장, 검색, 및 공유할 수 있으며, 이는 코드 재사용성을 증가시키고, 개발 프로세스를 효율화합니다.

  • 제공하는 아티펙트 유형

    1. Docker Image Repository

    2. APT/YUM Repository

    3. Maven Repository

    4. Pypi Repository

    5. R Repository

    6. Conda Repository

    7. Raw Repository : 일반 파일 저장소, wget, curl 등으로 다운로드 가능

빠르고 안정적인 빌드 프로세스

  • 외부 저장소로부터 아티팩트를 프록시하고 캐싱함으로써, Nexus는 의존성 해결 속도를 높이고, 외부 저장소가 다운되었을 때의 영향을 최소화합니다. 이는 빌드 시간을 단축시키고, 빌드 프로세스의 신뢰성을 높입니다.

  • 인터엣이 되지 않는 환경에서 효율적인 개발에 도움이 되는 도구 입니다.

  • 특히 외부에서 도커 이미지를 빈번히 다운로드 해야 하는 경우 Pull Limit 제한에 걸리지 않습니다.

  • MLOps의 경우 다운로드해야하는 이미지나 파일 사이즈가 커서 시간이 많이 걸리는 경우가 많은데 넥서스를 활용하면 내부 네트웍을 쓰기 때문에 다운로드 속도 향상에 도움이 됩니다.

향상된 협업

  • 팀 내에서 생성한 아티팩트를 호스트하고 공유함으로써, 팀원들 간의 협업을 촉진하고, 공통 코드 및 컴포넌트의 재사용을 용이하게 합니다.

  • 외부 인원과 협업할때도 유용합니다. 공개할 수 없는 필수 소스는 라이브러이화 햐여 넥서스에 업로드 후 다운로드 하는 방식으로 협업이 가능합니다.

CI/CD 통합

Nexus는 Jenkins, Gitlab 등 다양한 CI/CD 도구와 통합되어, 자동화된 빌드 및 배포 파이프라인에 쉽게 통합될 수 있습니다. 이는 개발 및 배포 프로세스의 자동화와 지속적인 통합 및 배포를 간소화합니다.

넥서스 활용 구성도

MLOps 개발을 위한 넥서스 환경 설정

  • Pypi Repository 구성

    1. Pypi Proxy 설정 : https://pypi.org와 연결하는 프록시를 설정한다.

    2. Pypi Hosted 설정 : 로컬에서 업로드하는 용도로 pypi-local 을 만든다.

    3. Pypi Group 설정 : 위의 두개를 통합하여 pypi-repos를 만든다.

    4. Dockerfile 등에서는 Nexus_host/repositories/pypi-repos를 사용한다.

  • Docker Repository 구성

    1. 외부 Docker URL을 연결하는 Proxy를 만든다.

    2. 로컬 업로드용 docker-local 을 만든다.

    3. 위에서 만든 프록시와 로컬을 통합하여 docker-repos를 만든다.

  • APT Repositry

    1. APT는 Proxy만 제공한다.

    2. 설정 방법은 실습 참고

  • Conda Repository

    1. Proxy 기능만 제공함

    2. 소스내에서는 활용할 경우 별도 추가 설정 필요

  • RAw Repoistory

    1. Wget 이나 Curl을 이용해야 하는 경우 설정한다.

MLOps 개발 실습.

  • MLOps 파이프라인 구성

    • 인터넷을 화용한 빌드와 넥서스르 활용한 빌드 동시 구성 방법

    • iris.csv를 활용한 심플 모델 빌드 및 배포 실습

    • 소스 : Iris-model

  • Custom Jupyter Notebook 만들기

    • 다양한 Nexus Reposiotry를 활용하여 Jupyter Noteebook을 빌드 및 배포하는 실습

    • 자신만의 Jupyter Notebook을 만들어 본다.

    • 소스 : Jupyter