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를 위한 도구
버전 관리 시스템:
Git: 소스 코드 관리에 가장 널리 사용되는 도구입니다. GitHub, GitLab, Bitbucket과 같은 서비스와 함께 사용됩니다.
지속적 통합(CI) 및 지속적 배포(CD) 툴:
Jenkins: 매우 유연한 CI/CD 도구로, 다양한 플러그인을 통해 확장할 수 있습니다.
GitLab CI/CD: GitLab에서 제공하는 내장 CI/CD 도구로, 소스 코드 저장소와 밀접하게 통합되어 있습니다.
ArgoCD : 지속적 배포를 위한 툴, GitOps를 구현할 수 있음.
Tekton : Kubernetes 기반의 강력한 오픈 소스 프레임워크로, 지속적 통합(CI) 및 지속적 배포(CD) 솔루션
인프라스트럭처 자동화 (Infrastructure as Code):
Ansible: 구성 관리 및 애플리케이션 배포를 위한 간단하고 명료한 도구입니다.
Terraform: 인프라 구성을 코드로 작성하여 관리하는 데 사용되며, 여러 클라우드 제공업체에 걸쳐 작동합니다.
컨테이너화 및 오케스트레이션:
Docker: 애플리케이션을 컨테이너화하는 표준 방법을 제공합니다.
Kubernetes: 컨테이너 오케스트레이션을 위한 가장 인기 있는 플랫폼입니다.
모니터링 및 로깅:
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 개발 가이드라인
베이스 이미지 선택
가능한 가벼운 이미지 사용 : From alpine 추천
공식이미지 사용 : 공식이미지는 보안취약점이 적고 최적화 되어 있으므로 가급적 공식이미지 사용
레이어 최적화
RUN 명령어 결합: RUN 명령어를 &&를 사용해 결합하여 불필요한 레이어 생성을 줄일 수 있음.
RUN apt-get update && apt-get install -y \
&& package1 \
&& package2 \
&& package3
캐시 활용 : 변경이 적은 명령어를 상단에 배치. 상단 레이이어 변화가 있으면 하위 레이어도 재빌드 됨. wget이나 curl은 최하단에 배치 바람직.
.dockerignore 파일사용
멀티스테이지 빌드
빌드 단계와 실행 단계를 분리하여 최종 이미지의 크기를 줄일 수 있음. 빌드에만 필요한 도구는 최종 이미지에 포함하지 않도록 할 수 있음.
FROM golang:1.14 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
FROM alpine:latest
COPY --from=builder /app/myapp .
ENTRYPOINT ["./myapp"]
명시적인 태그 사용 ( 중요 )
버전이 지정되지 않은 경우 빌드 시점에 따라 다른 이미지가 만들어 질 수 있음.
최소 권한 원칙
USER 지시어를 사용하여 루트 사용자가 아닌 사용자료 실행하는 것이 보안에 바람직
Gitlab CI Pipeline 개발 가이드라인
Gitlab CI는 기본적으로 프로젝트 루트에 .gilab-ci.yml이 있으면 자동으로 CI/CD 진행함.
파이프라인 구조 정의
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 방식 )
배포용 Manifest 관리용 GitOps Repository를 만들고 Manifests파일을 작성한후 저장한다.
위에서 만든 GitOps Repository를 ArgoCD에 등록한다.
앱을 등록할때 미리 등록한 GitOps Repository에서 kustomization.yaml이 있는 폴더를 불러온다.
앱을 생성 후 싱크한다.
앱 등록후 업데이트 동기화 방법
수동 동기화 : Gitlab pipeline을 통해 GitOps Repository에 푸시된 걸 확인한 후 ArgoCD 웹 UI를 통해 동기화
자동 동기화 : 등록한 App에서 Enable Auto Sync 활성화 혀면 자동 동기화 됨, 단 폴링 방식 ( 3분 마다 폴링 )
즉각 동기화 : GitOps에 푸시되면 Webhook을 통한 동기화 ( Gitlab과 별도 연동 필요 )
필오에 따라 선택 : 초기 개발시에는 수동 , 안정화 되면 자동으로 배포.
롤백 기능 제공하므로 필요시 롤백 가능
주의사항 : 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 파이프라인 개발 실습
사전 준비 사항
실습할 수 있는 Gitalb/ArgoCD/Harbor 계정이 있어야 한다.
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
실습 순서 :
두개의 Git을 Clone하여 자신의 gitlab으로 푸시한다.
개인용 namespace를 만든다.
배포용 Manifest 파일 구성 방법 교육
각자 네임스페이스에 배포되도록 배포용 파일을 수정한다. ingress 주소 / namespace 등
Dockerfile 수정해 본다.
.gitlab-ci.yml 수정 실습한다.
ArgoCD에 앱을 등록한다.
소스 수정후 자동으로 배포되도록 한다.
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 소개:
중앙집중식 아티팩트 관리
모든 유형의 아티팩트와 의존성을 한 곳에서 관리할 수 있는 강력한 도구입니다. 여러 언어와 기술 스택에 걸쳐 아티팩트를 저장, 검색, 및 공유할 수 있으며, 이는 코드 재사용성을 증가시키고, 개발 프로세스를 효율화합니다.
제공하는 아티펙트 유형
Docker Image Repository
APT/YUM Repository
Maven Repository
Pypi Repository
R Repository
Conda Repository
Raw Repository : 일반 파일 저장소, wget, curl 등으로 다운로드 가능
빠르고 안정적인 빌드 프로세스
외부 저장소로부터 아티팩트를 프록시하고 캐싱함으로써, Nexus는 의존성 해결 속도를 높이고, 외부 저장소가 다운되었을 때의 영향을 최소화합니다. 이는 빌드 시간을 단축시키고, 빌드 프로세스의 신뢰성을 높입니다.
인터엣이 되지 않는 환경에서 효율적인 개발에 도움이 되는 도구 입니다.
특히 외부에서 도커 이미지를 빈번히 다운로드 해야 하는 경우 Pull Limit 제한에 걸리지 않습니다.
MLOps의 경우 다운로드해야하는 이미지나 파일 사이즈가 커서 시간이 많이 걸리는 경우가 많은데 넥서스를 활용하면 내부 네트웍을 쓰기 때문에 다운로드 속도 향상에 도움이 됩니다.
향상된 협업
팀 내에서 생성한 아티팩트를 호스트하고 공유함으로써, 팀원들 간의 협업을 촉진하고, 공통 코드 및 컴포넌트의 재사용을 용이하게 합니다.
외부 인원과 협업할때도 유용합니다. 공개할 수 없는 필수 소스는 라이브러이화 햐여 넥서스에 업로드 후 다운로드 하는 방식으로 협업이 가능합니다.
CI/CD 통합
Nexus는 Jenkins, Gitlab 등 다양한 CI/CD 도구와 통합되어, 자동화된 빌드 및 배포 파이프라인에 쉽게 통합될 수 있습니다. 이는 개발 및 배포 프로세스의 자동화와 지속적인 통합 및 배포를 간소화합니다.
넥서스 활용 구성도
Maven 빌드로 만들어진 아티팩트를 넥서스에 업로드 및 다운로드
구성 방법 참고 : https://nextshds.tistory.com/63
MLOps 개발을 위한 넥서스 환경 설정
Pypi Repository 구성
Pypi Proxy 설정 : https://pypi.org와 연결하는 프록시를 설정한다.
Pypi Hosted 설정 : 로컬에서 업로드하는 용도로 pypi-local 을 만든다.
Pypi Group 설정 : 위의 두개를 통합하여 pypi-repos를 만든다.
Dockerfile 등에서는 Nexus_host/repositories/pypi-repos를 사용한다.
Docker Repository 구성
외부 Docker URL을 연결하는 Proxy를 만든다.
로컬 업로드용 docker-local 을 만든다.
위에서 만든 프록시와 로컬을 통합하여 docker-repos를 만든다.
APT Repositry
APT는 Proxy만 제공한다.
설정 방법은 실습 참고
Conda Repository
Proxy 기능만 제공함
소스내에서는 활용할 경우 별도 추가 설정 필요
RAw Repoistory
Wget 이나 Curl을 이용해야 하는 경우 설정한다.
MLOps 개발 실습.
MLOps 파이프라인 구성
인터넷을 화용한 빌드와 넥서스르 활용한 빌드 동시 구성 방법
iris.csv를 활용한 심플 모델 빌드 및 배포 실습
소스 : Iris-model
Custom Jupyter Notebook 만들기
다양한 Nexus Reposiotry를 활용하여 Jupyter Noteebook을 빌드 및 배포하는 실습
자신만의 Jupyter Notebook을 만들어 본다.
소스 : Jupyter