DevOps
[클라우드 네이티브 패턴] 2. 안정성 패턴
안정성 패턴이란? 분산 애플리케이션이 자신의 안정성이나 자신이 속한 시스템의 안정성을 높이는 데 사용되는 패턴이다. 서킷 브레이커(Circuit Breaker) 개요 직역하면 회로 차단기라고 할 수 있다. 퓨즈와 같이 과부하, 누전 등으로 전기 회로를 보호하는 안전장치다. 분산 컴퓨팅 시스템에서의 서킷 브레이커도 동일한 기능을 의미하는 패턴이다. 앞으로도 계속 언급되겠지만 분산된 클라우드 네이티브 시스템은 에러와 실패를 피해갈 수 없다. 서비스는 잘못 설정될 수 있고, 데이터베이스는 망가질 수 있으며 네트워크는 끊어질 수 있다. 내가 만든 애플리케이션에서 사용하는 의존성이 언제든 망가질 수 있다는 가정하에서 서비스를 디자인해야 한다. 그래서 의존성이 망가지는 상황에서 실패를 감지하고 '서킷'을 임시로 개..
[클라우드 네이티브 패턴] 1. Context 패키지
Go를 이용한 클라우드 네이티브 애플리케이션 레이어 구현과 패턴을 정리하는 시리즈의 시작 앞으로 다룰 많은 예제들은 Go언어에서 제공하는 Context 패키지를 사용하게 되므로 가장 먼저 정리해보려 한다. Go 1.7 버전에서 처음 소개된 이 패키지는 프로세스 간 종료 시점, 취소 신호 및 요청 범위 값을 전달하기 위한 관용적인 수단을 제공한다. 1. Context 구성 type Context interface { // Done 메서드는 Context가 취소되었을 때 닫힌 채널을 반환합니다. Done()
[Docker] m1 mac에서 image build 후 Linux에서 실행하는 방법
Docker : exec /usr/bin/sh: exec format error 최근 진행중인 프로젝트의 서버를 배포하는 과정에서 생긴 이슈이다. 상황 m1 맥북에서 Spring 이미지를 빌드했다. 내 dockerhub 레지스트리로 푸시했다. 우분투 리눅스 서버에서 내가 만든 이미지를 받아서 컨테이너로 실행했다. ! 에러 ! 도커 컨테이너를 실행하면 내가 지정해준 entrypoint -> command 순으로 명령어가 실행된다. 그런데 명령어 실행이 전혀 안되고 위와 같은 에러만 내뿜었다. Dockerfile의 CMD나 docker-compose 파일의 entrypoint를 수정해봤지만 여전히 같은 에러가 났다. 문제점 m1 맥북은 ARM 아키텍처를 사용한다. 그래서 m1에서 도커 이미지를 빌드하면 ar..
Kubernetes, GitHub Actions, ArgoCD를 사용한 자동화 CI/CD 파이프라인 구축기
Summary 졸업과제 프로젝트를 진행하면서 Kubernetes를 사용해 CI/CD 파이프라인을 구축했던 과정을 정리한 글이다. 쿠버네티스를 어떻게 구축했는지, 어떤 서비스를 구축했는지를 볼 수 있다. main branch로의 merge 한번으로 테스트, 애플리케이션 빌드, 도커 이미지 빌드, 배포를 진행할 수 있는 파이프라인을 볼 수 있다. 추가로 그 과정에서 필요한 Secret Key들에 관한 관리 방법까지 다뤘다. 개발자는 main branch로 pull request 및 merge를 수행한다. Github Actions의 workflow가 트리거되면서 애플리케이션의 테스트 및 빌드가 수행된다. 빌드가 완료되면 docker image를 빌드하고 docker hub repository에 push가 일..
Kubeadm 으로 K8s 설치하기 with 자동화 스크립트
새로운 클러스터를 생성할 때마다 쿠버네티스를 처음부터 구축하는건 상당히 귀찮다. 중간에 설정이 꼬여서 서버를 날리고 새로 구축하는 경우가 종종 있는데 .. 그럴 때마다 공식문서나 블로그를 참고해 처음부터 설치하려니 시간이 정말 아까웠다. 그래서 그냥 스크립트로 만들어서 반 자동화 설치 루틴을 만들었다. 테스트 완료 Linux 서버 Ubuntu 18.04 LTS Ubuntu 20.04 LTS 직접 만든 스크립트 입니다. 피드백은 감사히 받고 적극 반영 하겠습니다! GitHub - hyun98/kubernetes-install-helper: This project can speed up Kubernetes installation time Maybe.. This project can speed up Kuber..
[Git] 의미있는 commit 메시지와 깔끔한 history
의미있는 커밋 메시지 작성 방법과 깔끔한 history 유지하기 Github Repository의 커밋 내역만으로 프로젝트의 전체 흐름을 파악할 수 있다. 의미있는 커밋 메시지 작성 방법 merge 전략 3가지 Commit 메시지 구조 type(타입) : title(제목) body(본문, 생략 가능) Resolves : #issue, ...(해결한 이슈 , 생략 가능) See also : #issue, ...(참고 이슈, 생략 가능) Commit 메시지 규칙 1. 커밋 타입 지정 FEAT : 새로운 기능 추가 FIX : 버그 수정 DOCS : 문서 수정 및 추가 STYLE : 코드 스타일 관련 변경(코드 포매팅, 세미콜론 누락 등) REFACTOR : 코드 리팩토링 TEST : 테스트 코드, 리팩토링 테..
[Git] 협업을 위한 git branch 전략
Git branch 전략 Git branch 전략으로 불리는 git flow을 사용해 협업을 원활히 할 수 있다. git flow에 사용되는 branch 의 종류와 특징 Git branch 전략 (Git Flow) Git Flow master와 develop이라는 항상 존재하는 메인 브랜치(Main branch)가 있다. master 브랜치 배포 가능한 상태만을 관리하는 브랜치. develop 브랜치 다음에 배포할 것을 개발하는 브랜치. 통합 브랜치 역할을 하며, 평소에는 이 브랜치를 기반으로 개발을 한다. feature-* 기능을 개발하는 브랜치. develop 브랜치에서 feature를 checkout해서 작업한다. feature 브랜치를 사용한다면 feature/#이슈번호 와 같은 형태로 브랜치를 ..
[Linux] 웹사이트 동작 체크 명령어는?
제목을 보고 ping 이라고 생각했다면..?! curl을 사용해 보았나요? 어떤 상황에서 어떤 옵션들을 사용해 보았나요? cURL curl은 CLI 기반의 웹 요청 도구이다. Linux, MacOS, Windows 등의 대부분의 OS에서 사용 가능하며, HTTP, HTTPS, FTP, TELNET, SMTP, IMAP, POP3등의 프로토콜과 소켓 통신까지 지원한다. 포맷 curl [option] 한 번 curl https://www.google.com 을 실행해 보자. 아마 자바스크립트 코드와 바이너리 코드들로 터미널이 꽉 찰 것이다. curl 은 기본적으로 GET 방식으로 url을 호출한다. curl 요청에 임의의 header를 넣을 수 있고, JSON 형식의 데이터도 넣어서 보낼 수 있다. 다양한 ..
[kubernetes] ubuntu에 kubeadm으로 K8s 설치하기 (cgroup, coredns 해결)
1. Docker 설치 [Docker] Ubuntu 도커 설치 Ubuntu와 Docker 이 글에서는 Ubuntu 도커 설치와 관련된 내용을 다룬다. Docker는 리눅스를 기반으로 하기 때문에 리눅스 운영체제 위에서 돌아가야한다. Ubuntu는 Linux계열 운영체제로 바로 설치가 가능 myjamong.tistory.com 위 블로그 따라서 Docker를 먼저 설치한다. 설치가 끝났다면 docker ps 명령어를 입력해 보자. 위와 같은 에러가 날 수 있다. 해당 문제는 사용자가 /var/run/docker.sock 에 접근하려고 했지만 권한이 없어 발생하는 문제로, 사용자가 root:docker 권한을 가지고 있어야 한다. root 권한을 가지고 실행하는 것은 권장되지 않으므로, 사용자를 docker..
[kubernetes] Helm으로 nginx ingress controller 설치하기
일반적으로 사용하는 helm의 stable repo가 업데이트를 중단했고, k8s는 빠르게 업데이트 되는 중이다. stable/nginx-ingress는 사용하기엔 너무 옛날 버전이라서, k8s에서 따로 배포하는 ingress-nginx repo를 사용해 ingress-controller를 설정해 보았다. nginx pod와 service 생성 # mynginx.yaml apiVersion: v1 kind: Pod metadata: labels: run: mynginx name: mynginx spec: containers: - image: nginx:1.16 name: mynginx resources: {} restartPolicy: Always --- apiVersion: v1 kind: Servic..