인프런 워밍업 클럽 4기 - DevOps 4주차 발자국
k8s 리소스를 직접 배포하는것 보다 heml Kustomize 등의 배포 패키지 툴을 사용하는게 더 좋다.
헬름은 Chart라는 패키지 형태로 앱을 관리하며, 템플릿 기반 manifest에, values-{stage}.yaml, Chart.yaml, _hepers.tpl, helm command --set option 등을 활용해 동적으로 값을 주입할 수 있다.
반면 Kustomize는 Base 설정에 Overlay 방식으로 특정 환경에 대한 설정들을 덮어서 환경별로 다른 설정을 적용한다.
overlay하는 dir에 있는 모든 리소스를 적용하느게 아니라 kustomization.yaml 에 설정된 config에 따라 부분 적용이 가능하다.
배포 파이프라인을 만들면서 드는 고민과 답변들
배포에 사용되는 여러 툴 인증정보를 어떻게 관리할 것인가 > 배포툴의 Credentials 에 한번 정보를 기입해두고, 각 스테이지 별로 Credential 의 데이터를 가져와 처리하도록 한다. (cicd 서버 디스크에 직접 저장 X)
젠킨스 Credential, docker-credential-helpers..)
컨테이너 이미지 용량 관리 > 이미지별 LC를 두고 제거
k8s 는 도커와 달리 이미지를 처리하는 gc 가 존재해, config 에 따로 설정하지 않으면 자동으로 안쓰는 이미지를 제거해준다.
네임 스페이스 관리 > 특히 여러 서비스가 존재하고 독립적으로 관리된다면, NS 설정은 리소스 배포와 독립적으로 두는게 낫다
배포 파드가 onService인지 확인 > helm --wait 옵션으로 배포 프로세스중 파드가 잘 뜬 다음 다음 단계로 진행시킬 수 있다.
배포시 파드가 업데이트 되지 않는 경우들 > deployments 는 내부 template 프로퍼티 하위값들이 바뀌어야 config에 맞춘 파드를 다시 띄운다.
template.spec.metadata에 배포를 위한 값을 넣음으로써, 배포를 강제할 수 있다.
이를테면 어플리케이션 컨테이너의 변경때 사용가능!
이미지별 태그 관리
개발 환경처럼 잦은 배포가 있는 경우 version이 무의미할 수 있다.
이 때 latest tag + Always pullPolicy 가 적합
그러나 배포 관리가 필요한 운영환경에는 version이 필수이다.
이 때 version tag + IfNotPresent pullpoilcy 가 적합
k8s 클러스터 내부에 이미지가 있다면 굳이 허브를 거칠 필요없이 바로 세팅 가능하다.
비슷하게 개발환경에도 롤백이 필요하다면 버전관리가 필요하고 해당 태그 정책을 가져가면 좋다.
Argo
k8s 워크플로우 및 배포 관리를 위한 오픈소스 프로젝트 모음으로, GitOps 방식으로 배포를 관리하며, CNCF 졸업 프로젝트이다.
ArgoCD: GitOps 기반 배포관리 툴
깃에 k8s manifest를 저장하고, ArgoCD가 이 레포를 모니터링하면서 diff 감지 및 동기화 (Sync) 해주는 툴
ImageUpdater: 도커 허브에서 특정 이미지를 모니터링하면서 diff 감지해 자동 배포하는 툴
Argo Wrokflow: Airflow, Kubeflow와 같은 워크플로우 매니지먼트 툴
Argo Events: 카프카와 같은 이벤트 버스 툴
Argo Rollouts: 블루그린, 카나리 배포등을 지원하는 툴
k8s 클러스터에 설치되는 Argo 컴포넌트들은 아래와 같다.
Server: API 서버와 대시보드 역할 (웹 UI 및 API(CLI) 서버 역할)
Repo Server: 깃 저장소와 연결해 배포할 yaml 가져오고 k8s 배포할 manifest 생성
Application Controller: 깃에서 가져온 Desired Manifest 와 k8s 실제 적용된 Manifest를 비교하는 역할 & 필요하면 동기화 작업 수행
KubeAPI: k8s 리소스에 명령을 날려주는 역할
Redis: argo 시스템내 캐시 처리
Dex: 외부 인증 시스템 연동
AgoCD로 배포
k8s 클러스터에 argoCD 배포
argoCD를 통해 배포 관련 레포를 받아 k8s 클러스터에 배포
Application이 배포하는 앱 단위이고, Poeject로 그룹핑 가능
Source: 깃헙 소스 정보 / Destination: k8s 클러스터 정보
General ~ 그룹명, 앱명, SyncPolicy (배포 정책 ~수동/자동), SyncOption(배포 상세 옵션) / PrunePolicy(리소스 삭제 정책)
Desired Manifest ~ diff ~ Live Manifest, 로 Git 소스 중심의 차이점 파악
IamgeUpdater
도커 허브 감지하다가 이미지 업데이트시 ArgoCD에 자동 배포 명령
Helm or Kustomize 를 활용해야 사용 가능하며 (내부에서 해당 패키지툴 명령어 사용)
argoCD 앱 정보와 도커 허브 연결정보를 IamgeUpdater에 넣어서 감지 및 반영(배포)를 자동화
Argo Rollout
ArgoCD 없이 사용 가능하며, CRD를 통해 k8s Deployments 리소스를 배포와 관련해 확장해 만듦
블루그린 배포시 preview 서비스를 만들고, 자동으로 Service를 붙였다 떼주며.
카나리 배포시 특정 조건에 따라 트래픽량 조정이 가능하며, steps를 통해 트래픽 주기 및 기타 설정을 단계별로 적용하며 배포프로세스를 유연하게 가져갈 수 있음
4주차 학습 후기
헬름 차트, Kustomize, Argo와 안면을 틀 수 있었던, 큰 그림을 이해해볼 수 있었던 시간!
특히 헬름차트와 더욱 친해지고 내것으로 만들기위해 더 노력해야겠다!
마지막 까지 다들 고생하셨습니다! & 좋은 강의 만들어주셔서 감사합니다 강사님!!
댓글을 작성해보세요.
끝까지 잘 따라와 주셔서 저도 감사드려요^^