분류 전체보기(118)
-
[Go] CDK8s (CDK for k8s)
기존 yaml 방식의 '선언적 프로그래밍' 장단점 - k8s manifest, Helm chart, kustomize 등 장점 - 사람이 읽기 쉬움 - 어디서든 사용가능 - 선언적 프로그래밍 형태 - 원하는 상태(Desired state)로 배포 가능 - static 한 파일 명세 단점 - 복잡성에 따라, 다수 환경일 경우 중복 부분 처리 필요(Helm chart, kustomize 등) - 즉, 공통부분에 대한 관리의 어려움이 있으며 별도 툴에 대한 학습 필요 개발자의 요구사항 yaml 방식의 선언적 프로그래밍 방식을 통해 쿠버네티스에 자원을 할당하고 관리하는 방식은 개발자에게 익숙하지 않았다. 즉, 개발자 친화적인 프로그래밍 언어(Go, Java, Python 등), 프레임워크, CLI 등의 형태를 ..
2023.02.18 -
Project Offer Reference
GitOps 기반의 CI/CD 환경 구성 1. Git Repository 1. 소스코드 및 Jenkinsfile 2. Rollout Manifest 2. 구축 경험 블로그 포스팅 1) ArgoCD 구축 2) Rollout 컨트롤러 기반 Canary 배포 3. 성능 테스트 및 설계 개선 1) 성능 테스트 구축 및 특정 조회성 API 성능 7.6배 개선 GitOps Architecture
2023.01.25 -
[GitOps] Jenkins 연동 및 컨테이너 이미지 버전 태그 자동 생성
이전 포스팅에서는 ArgoCD와 Argo Rollout 컨트롤러를 통한 CD 환경을 구축했다. 이번 포스팅에서는 GitOps 상에서 CI 툴인 Jenkins가 Rollout Manifest 파일을 변경시킴으로써 CD 과정이 자동으로 트리거 되는 시나리오를 구축한다. 최종 GitOps 아키텍처 1) 사용자가 Git에 소스코드를 커밋/푸시 2) Jenkins가 커밋 감지 및 Jenkins Pipeline 실행 2-1) gradle 등의 빌드 툴로 빌드 2-2) 컨테이너 이미지 빌드 2-3) 컨테이너 레지스트리 푸시 (신규 태그 생성) 2-4) Git의 Manifest 레포지토리에 Rollout Manifest 수정(보통 컨테이너 이미지 tag 수정) 3) ArgoCD가 Git의 Rollout Manifest..
2023.01.23 -
[GitOps] Argo Rollout 컨트롤러 기반 Canary 배포
순서 1. Argo Rollout이란 2. Argo Rollout 플러그인 설치 1) Argo Rollout 설치 스크립트 작성 2) 실행 확인 3. Argo Rollout으로 배포 1) Rollout(Canary) 배포 설정 2) Rollout Object 배포 및 확인 3) 애플리케이션 신규 배포 및 Canary 업데이트 확인 Argo Rollout이란 Argo Rollout은 Canary, Blue-Grean와 같은 고급 배포 기능을 위한 Argo의 CRD 및 Kubernetes 컨트롤러이다. 이를 통해 Kubernetes에선 제공되지 않는 다양한 배포 기법을 적용하고 자동화할 수 있다. Canary 업데이트란 cf. Canary 배포에 대한 포스팅: https://jh-labs.tistory.co..
2023.01.22 -
[GitOps] ArgoCD 구축 및 Application 기반 배포
이번 포스팅에서는 ArgoCD 기반의 GitOps 환경 구축 과정을 정리한다. GitOps 구축 순서 1. ArgoCD 환경 구축 0) 사전준비: k8s 클러스터 외부에서 ArgoCD 접속을 위해 사용할 NodePort 포트포워딩(또는 LoadBalancer 사용) 1) ArgoCD Manifest 파일 작성 (kustomize 기반) 2) ArgoCD 설치 쉘 스크립트 파일 작성 3) ArgoCD Web UI접속 및 로그인 2. Git 연동 1) SSH Key 발급 2) GitHub에 등록 3) ArgoCD에 등록 3. k8s 클러스터에 애플리케이션 Manifest 배포 1) k8s 클러스터에 애플리케이션 배포 2) GitOps 및 Desired State 검증 ArgoCD 구성 환경 k8s 클러스터 ..
2023.01.19 -
[GitOps] GitOps 개념 및 ArgoCD
Git을 활용한 쿠버네티스 배포 컨셉 GitOps는 2017년 OpenGitOps 단체에서 발표한 개념으로 Git을 통해 k8s Manifest 파일을 관리하여 seamless 하게 Time to market을 목표로 운영하자는 개념이다. k8s는 yaml 같이 Pod, Deployment 등 모든 리소스를 Manifest 기반의 '선언적 코드'를 명시해 배포한다는 특징이 있다. 또한 git은 파일들에 대해 형상관리를 해준다는 측면에서 Manifest 파일들에 대한 버전을 관리할 수 있다. 즉, k8s 오브젝트들은 모두 Manifest로 관리된다는 특징을 기반으로 Manifest 파일에 대한 생성, 삭제, 변경 등에 대한 형상 관리를 git과 함께 함으로써 변경이력을 관리하자는 컨셉이다. GitOps의 ..
2023.01.19 -
[test] nGrinder 기반의 API 성능 테스트
웹 서비스 가용성(Availability) 가용성이란 서버와 네트워크 등의 시스템이 정상적으로 사용 가능한 정도를 의미한다. 즉, 서비스가 다운되지 않고 정상적으로 유지할 수 있는 능력을 의미한다. cf. High Avaliability(HA) 고가용성 시스템을 위한 대표적인 방법으로 시스템 확장과 시스템 이중화가 있다. (Scale Up/Down, Scale Out/In) 성능테스트 (Performance Test) 성능테스트는 시스템의 '고가용성을 위해' 병목지점과 같은 성능 이슈를 찾는 테스트이며 성능테스트의 대표적인 유형으로 '부하테스트(load test)'와 '스트레스 테스트(stress test)'가 있다. 성능 테스트는 좀 더 추상적인 개념이다. 1) 부하테스트 (Load Test) - 부하..
2022.12.16 -
[k8s] Kustomize
Kustomize kustomize는 쿠버네티스에서 오브젝트들의 Manifest들을 사용자가 원하는 방식대로 변경해서 쿠버네티스 환경에 배포할 수 있도록 하기 위한 목적으로 사용되는 플러그인이다. 과거에는 바이너리 파일을 다운로드해서 kubectl과 연동했다고 한다. 하지만 쿠버네티스 1.13 버전부터는 kubectl 커맨드의 기본 플러그인으로 자리 잡았다. kustomize가 사용되는 대표적인 예시는 CI/CD 파이프라인 관리이다. (예를 들어, 애플리케이션의 Manifest 파일을 수정하여 GipOps 기반의 변경 사항을 발생시킬 때) 대표적인 기능 4가지 1) 리소스 집합을 구성하고 사용자 정의 - Manifest 파일들을 그룹으로 관리하고 한번에 실행, 삭제 등의 관리 기능 1) 원격에서 kust..
2022.12.05 -
[DB] Apache Commons DBCP 2.9 오픈소스 분석
Apache Commons DBCP 2.9 - 아파치의 커넥션 풀 오픈소스인 Commons DBCP는 BasicDataSource라는 타입으로 DataSource를 제공한다. - 커넥션 풀 및 DataSource의 기본 개념이 필요하다면 포스팅을 참고해 주시길 바란다. 커넥션 풀 자료구조: LinkedBlockingDeque DBCP2 기준으로 커넥션 풀은 LinkedBlockingDeque 타입의 객체로 관리된다. 아파치가 커넥션 풀 구현체는 덱 기반으로 한 이유는 'lifo' 설정 때문이다. 커넥션 풀 설정 값에 lifo라는 프로퍼티가 있는데, 이 값을 true로 할 경우 stack 기반으로, 그렇지 않을 경우엔 Queue 기반으로 동작한다. LinkedBlockingDeque의 요소는 Node 타입..
2022.11.23 -
[Go] 한 번에 정리하는 Golang 기본 개념 - 3편
배열 import ( "fmt" "time" ) func main() { var arr [5]string arr[0] = "el1" arr[1] = "el2" fmt.Println(arr[0]) // el1 fmt.Println(arr) // [el1 el2 ] var dates [3]time.Time dates[0] = time.Unix(1257894000, 0) fmt.Println(dates[0]) nums := [3]int{3, 9} fmt.Println(nums) // [3 9 0] fmt.Println(len(nums)) // 3 } - 고정 길이를 가지기 때문에 선언 시 크기를 할당해야 함 - 변수와 마찬가지로 := 키워드를 통해 선언 및 초기화를 하고 초기화값은 {}로 묶는다. (자바와 비..
2022.11.08