IT 127

[Docker] 도커 재시작 없이 CA 인증서만 업데이트하는 방법

Prologue 그동안 사내에서 Private Registry를 구축해서 사용하다보니, HTTPS 인증 때문에 인증서 파일을 업데이트하고 도커 데몬을 재시작해주어야 하는 경우가 종종 있었습니다. 만약에 도커 데몬을 재시작하지 않은 상태로 Login을 시도하면 아래와 같은 에러가 발생합니다. Error response from daemon: Get https://192.168.1.1/v1/users/: x509: certificate signed by unknown authority하지만 매우 중요한 프로세스가 운용되고 있는 노드에 대해선 도커 데몬을 재시작하는 것이 상당히 부담이 되었습니다. 경험상 도커를 재시작하고나서 정상적으로 실행되지 않는 프로세스들이 몇몇 있었기 때문입니다. 때문에 Private ..

IT/Docker 2021.05.28

[Go/Golang] 구조체 JSON 변환 시, omitempty가 적용되지 않는 경우

Prologue Go에서 오브젝트를 JSON으로 변환하려면, 해당 오브젝트를 기술하는 구조체가 선언되어 있어야 합니다. 예를 들자면 다음과 같습니다. type Score struct { Korean uint `json:"korean,omitempty"` Math uint `json:"math,omitempty"` English uint `json:"english,omitempty"` } type UserV1 struct { UserName string `json:"username"` Name string `json:"name"` Email string `json:"email"` Age uint64 `json:"age"` Score Score `json:"score,omitempty"` } 위 구조체의 필..

IT/Go 2021.05.27

[DevOps] Docker-Compose를 이용해 Harbor 배포하기(HTTPS 지원)

Prologue 사내에서 자체적으로 운용할 Private Container Registry가 필요해서 초기에는 간단하게 Docker에 docker-registry 이미지를 이용해 아주 간단한 형태로 배포해서 사용하고 있었는데요. UI를 붙여보았지만, 너무 심하게 단순한 정보만을 제공하고 있었고, 무엇보다도 유저 관리가 불가능했습니다. 이렇다 보니, 외부 개발자 분들과 소통할 때, Registry 접근을 위해 사내에서만 사용하는 계정 정보가 쉽게 노출되는 등의 문제가 많았습니다. 이런 불편함을 해소하기 위해 이것 저것 조사하다, 가장 활발하게 발전하고 있는 이 프로젝트를 발견했습니다. Harbor Harbor는 기존 docker-registry와는 달리 policy와 role 기반으로 access를 제어(..

IT/DevOps 2021.05.27

[containerd] 인증서 등록에도 불구하고 private registry로부터 image pull이 안 될 경우

문제 상황 새로운 Private Registry (Harbor)를 구축하고 CA 인증서를 호스트에 등록 및 config.toml 파일까지 업데이트 해주었음에도 불구하고 Image Pull 작업을 요청하면 401 에러가 발생하였습니다. config.toml 파일을 어떻게 업데이트하여야 하는지는 추후 포스트에서 다루겠습니다. 임시 해결 방법 아래 명령어처럼 image를 가져올 때 --user USERID:PASSWORD 인자를 추가로 넘겨 주면, 정상적으로 이미지를 가져옵니다. 하지만 근본적인 해결책은 될 수 없으므로 해당 문제를 완전히 해결할 수 있는 방법을 찾으면 업데이트 하도록 하겠습니다. $ sudo ctr images pull --user USERID:PASSWORD IMAGE_PATH 마무리 여기..

IT/containerd 2021.05.26

[Go/Golang] bufio.Scanner를 이용할 때 주의 사항

bufio.Scanner bufio.Scanner는 bufio.Reader를 대신하여 줄 바꿈 등으로 구분되는 텍스트 파일 등의 데이터를 읽는 편리한 인터페이스를 제공합니다. bufio.Reader와 눈에 띄는 가장 큰 차이점이라면, 입력을 받았을 때, 읽어 들인 값이 \n 을 포함하지 않는다는 점입니다. 이 덕분에 strings.TrimSuffix(_, "\n") 등의 작업을 추가로 해줄 필요가 없습니다. bufio.Scanner와 bufio.Reader의 더 많은 비교는 다음 포스트를 참조해주세요. https://wookiist.dev/102 문제 발견 어제 PS를 하다 정상적으로 푼 문제가 Runtime Error (Index out of range)가 발생하였습니다. 같은 코드를 Python으로 ..

IT/Go 2021.05.22

[Go/Golang] 정수형 자료를 입력 받을 때, Scanner 사용하기

[Go/Golang] 정수형 자료를 입력 받을 때, Scanner 사용하기 일반적으로 PS할 때, 저는 bufio 패키지를 사용합니다. 보통 사용하는 fmt.Scanf() 또는 fmt.Printf()는 버퍼링을 수행하지 않아 많은 양의 입력을 받는 경우 매우 느려집니다. 실행 시간이 매우 중요한 PS에 있어선 더더욱 피하게 되는 내장 함수입니다. 한 줄에 여러 개의 입력을 받는 경우, (*bufio.Reader).ReadString('\n)을 이용해 받고, 끝에 들어오는 \n을 Trim하고 Fields()를 이용해 배열로 쪼갭니다. 그리고 나서 strconv.Atoi()로 숫자 변환을 해줍니다. 만약 한 줄에 셀 수 있을 정도의 입력을 받는다면, fmt.Fscanf((*bufio.Reader), ..

IT/Go 2021.05.13

[Kubernetes] Helm으로 Statefulset의 spec upgrade가 안 되는 경우

[Kubernetes] Helm으로 Statefulset의 spec upgrade가 안 되는 경우 Helm으로 배포한 패키지에 statefulset이 있으면, helm upgrade 명령을 사용했을 때 오류가 날 가능성이 있습니다. 특정 파드의 리소스 제한을 걸지 않아서, 배포 이후에 제한을 걸기 위해 values.yaml을 업데이트 하고 helm upgrade를 수행했는데, statefulset이 지원하지 않는 업데이트라는 에러를 뿜뿜하더군요. 분명 자원은 spec.template.containers.resources에 있으니까, 이걸 수정한다고 해서 statefulset이 업데이트 할 수 없다고 나오는 건 분명히 버그였습니다. 수소문 해보니 저와 같은 현상을 겪었던 분들이 많이들 계셨고, 찾아낸 해법..

IT/Kubernetes 2021.05.12

[Go/Golang] Zap과 시간 기반 파일 로테이션 로깅 수행하기

본 포스트는 'dhwaneetbhatt'의 Time based log file rotation with zap 글을 번역한 것임을 밝힙니다. Zap과 시간 기반의 파일 로테이션 로깅 zap은 현재까지도 잘 개발되어오고 있고, 성능 측면에서도 훌륭한 Go의 오픈소스 로깅 라이브러리입니다. 유감스럽게도, 원 글쓴이(이하, 필자)의 조직에서 제공하는 모든 앱들이 12-factor 애플리케이션으로 구성되지 않았으며, 이로인해 물리적으로 파일에 로그를 남기는 작업이 여전히 필요했습니다. 이와 같은 이유로 zap을 사용함과 동시에 파일을 로테이션 할 수 있도록 하는 방법이 필요했습니다. 필자는 Java 진영에서 넘어왔기 때문에 log4j의 매우 다양한 파일 로테이션 옵션을 제공하고 있는 것을 알고 있..

IT/Go 2021.03.29

[Linux/Unix] Shell Script에서 날짜/시간 변수 사용하기

Date Format 리눅스 또는 유닉스 계열에서 날짜를 표시하는 문법은 다음과 같습니다. date +FORMAT date +"%FORMAT" date +"%FORMAT%FORMAT" date +"%FORMAT-%FORMAT" 위 문법에서 + 기호는 이 문법이 사용자가 정의한 형식을 따르고 있음을 나타냅니다. 또한 중간에 들어간 -도 사용자가 원하는 문자로 변환하여 사용할 수 있습니다. 만약 출력의 형식이 연&월&일 의 형태라면 - 대신 &를 넣어 포매팅할 수 있는 구조입니다. yy-mm-dd 형식으로 출력하기 터미널을 열어서 다음 명령을 입력해봅시다. $ date +"%y-%m-%d" 출력은 이렇습니다. 21-03-22만약 연도 데이터를 4자리로 출력하고 싶다면 %y를 %Y로 치환해주면 됩니다. $ d..

IT/OS 2021.03.22

[Go/Golang] Go Application에 Prometheus Exporter 연동하기

Prometheus Prometheus는 CNCF의 오픈 소스 프로젝트로 System과 Service 모니터링 시스템입니다. 특정 주기를 기준으로 사용자가 구성한 target으로부터 metric을 수집합니다. 또한 사용자가 정의한 rule expression을 계산하여 해당 결과를 보여주고 특정 조건을 만족하는 상황에 도달하면 알람을 울리는 등의 기능을 수행합니다. Prometheus는 시계열(time-series) 데이터를 처리하는 데에 특화되어 있습니다. Prometheus Exporter Prometheus는 여러 방법으로 metric을 수집합니다. 특히 Exporter라는 구성 요소를 통해 target 시스템 및 서비스의 Expose된 metric을 수집해올 수 있습니다. Prometheus Ex..

IT/Go 2021.03.16