IT 101

[DevOps] Jenkins Pipeline이 종료되지 않는 경우

Prologue 평화롭게 파이프라인 구성을 위한 테스팅을 진행하던 중, 갑자기 파이프라인이 종료되지 않는 문제가 발생했습니다. 스택 오버 플로우를 찾아보니, "Script Console"에서 명령줄을 넣어 실행하면 종료된다고 합니다. 하지만 그리 쉽게 문제가 해결되지 않았고, 좀 더 내려보다 보니, 직접 파이프라인 빌드 디렉터리를 삭제하고 Jenkins를 재시작하는 방법을 소개하는 답변이 있었습니다. 제 경우에는 이 해결 방법이 딱 맞아서, 이번 포스트에서는 이 내용을 소개하고자 합니다. 해결 방법 우선 Jenkins 서버에 SSH로 접속합니다. 만약 Docker 등으로 실행한 경우라면, docker exec 명령어 등을 사용해서 붙습니다. 만약 /bin/bash 또는 sh가 제공되지 않는다면, 아래 명..

IT/DevOps 2021.06.14

[Kubernetes] kubectx를 활용해서 멀티 클러스터를 관리하자

Prologue 사내에서 사용하던 클러스터가 1개라 그동안은 멀티 클러스터 관리에 그다지 관심을 두지 않았습니다. 하지만 개발용 클러스터와 실사용 클러스터를 분리하고 제 로컬에 있는 데스크탑 클러스터까지 사용하게 되다보니 이제는 멀티 클러스터 관리의 필요성을 절실히 느끼게 됐는데요. 로컬에서 작업을 할 때 빈번히 클러스터의 전환이 필요했고 더불어 네임스페이스의 전환도 필요했습니다. 매번 -n blahblahblah 를 타이핑하는 건 수고로운 일이니까요. 오늘 포스트에서는 kubectx를 이용한 클러스터 간 전환을 간편하게 만들어보는 작업을 해보겠습니다. kubectx kubectx는 클러스터 간의 전환을 쉽고 빠르게 할 수 있게 해주는 플러그인입니다. v0.9.0 이전까지는 bash를 이용해 구현되었고,..

IT/Kubernetes 2021.06.13

[DevOps] ArgoCD Best Practice

Prologue 최근 들어, 팀 내부의 CI/CD 파이프라인을 구축하기 위해 다양한 오픈 소스 툴을 살펴보고 있습니다. ArgoCD는 CD 쪽 파트를 담당하는 훌륭한 도구입니다. 하지만 이런 도구를 활용할 때 어떻게 하면 더 효율적으로 사용할 수 있는지는 좀 더 공부가 필요한 상황입니다. 특히 오늘 포스트에서 소개하는 내용이 그러한데요. 얼마전까지는 애플리케이션의 소스 코드 레포지토리에 ArgoCD가 이용할 매니페스트 파일도 함께 관리했습니다. 하지만, 경험적으로 알게 된 사실은, 이렇게 하게 되니 매니페스트 파일만 수정했을 뿐인데도 CI가 자동으로 발생하는 상황이 벌어졌습니다...🥲 이러한 상황을 막기 위해 ArgoCD 공식 문서에서도 매니페스트 파일과 소스 코드 레포지토리를 분리할 것을 권고하고 있는..

IT/DevOps 2021.06.12

[Kubernetes] Kubernetes 인증서가 만료되었을 때 해결 방법

Prologue 언제나처럼 kubectl 을 사용하려는데 다음과 같은 에러가 발생했습니다. '어이쿠 인증서 문제네...' 하면서 생각해보니, 이 클러스터를 구축해둔지 벌써 1년이라는 시간이 지났더군요. 갱신을 한 번은 해줬어야 했는데 깜빡하고 있던게 화근이었습니다. Unable to authenticate the request due to an error: x509: certificate has expired or is not yet valid 인증서 만료일 확인 $ cd /etc/kubernetes/pki $ openssl x509 -in apiserver.crt -noout -dates $ openssl x509 -in apiserver-kubelet-client.crt -noout -..

IT/Kubernetes 2021.06.07

[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

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

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

IT/Kubernetes 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
반응형