본문 바로가기
728x90

DevOps57

kubebuilder를 사용하여 Custom Resource, Custom Controller 만들어보기 [3] 이전 시간에는 kubebuilder를 사용하여 ClusterJob이라는 Custom Controller의 일부를 구현하였고, 실제로 쿠버네티스에 배포하여 동작을 확인하였다. 이번 시간에는 ClusterJob Custom Controller의 나머지 기능들을 전부 구현해볼 예정이다. 2025.10.25 - [DevOps/Kubernetes] - kubebuilder를 사용하여 Custom Resource, Custom Controller 만들어보기 [1] kubebuilder를 사용하여 Custom Resource, Custom Controller 만들어보기 [1]이번 글에서는 kubebuilder를 사용하여 Custom Resource, Custom Controller를 직접 만들어보는 과정을 정리해보았.. 2025. 10. 26.
kubebuilder를 사용하여 Custom Resource, Custom Controller 만들어보기 [2] 이전 시간에는 kubebuilder를 사용하여 프로젝트를 구축하고, Custom Resource를 만들었다. 이번 시간에는 Custom Controller를 만들어서 ClusterJob의 기능을 직접 구현해볼 예정이다. 2025.10.25 - [DevOps/Kubernetes] - kubebuilder를 사용하여 Custom Resource, Custom Controller 만들어보기 [1] kubebuilder를 사용하여 Custom Resource, Custom Controller 만들어보기 [1]이번 글에서는 kubebuilder를 사용하여 Custom Resource, Custom Controller를 직접 만들어보는 과정을 정리해보았다.주제 정하기Custom Resource, Custom Con.. 2025. 10. 25.
kubebuilder를 사용하여 Custom Resource, Custom Controller 만들어보기 [1] 이번 글에서는 kubebuilder를 사용하여 Custom Resource, Custom Controller를 직접 만들어보는 과정을 정리해보았다.주제 정하기Custom Resource, Custom Controller 만들기 전에 가장 먼저 해야 할 것은 어떤 것을 만들어볼지 결정하는 것이다. 일단 쿠버네티스를 운영하면서 느꼈던 불편한 점은, 쿠버네티스 클러스터의 각 노드마다 어떤 작업을 해줘야 할 때가 있다. 워커노드에 저장된 시스템 로그를 백업한다거나, 아니면 각 워커노드에 특정 설정파일을 갱신한다거나 등이 있다. 여기서 각 노드마다 어떤 작업을 해줄 적절한 워크로드가 있으면 좋을 것 같다는 생각을 해봤는데, DaemonSet은 일회성 작업을 하기에 적당하지 않은 느낌이었다. 먼저 DaemonSet.. 2025. 10. 25.
Kubernetes Custom Resource와 Custom Controller 소개 쿠버네티스의 확장 기능인 커스텀 리소스와 커스텀 컨트롤러에 대해 알아보자.Controller와 선언형 리소스쿠버네티스의 모든 리소스는 선언형으로 관리된다. 그리고 모든 쿠버네티스 리소스는 다음의 형식을 띈다.apiVersion: apps/v1kind: Deploymentmetadata: name: account-service namespace: saga labels: ... annotations: ...spec: ...status ...apiVersion: 리소스 API 버전kind: 리소스 종류metadata: 리소스 메타데이터로, 특정 리소스를 식별하기위해 사용spec: 리소스의 의도한 상태status: 리소스의 현재 상태, 쿠버네티스는 리소스의 현재 상태를 의도한 상태로 변경하.. 2025. 10. 13.
Kubernetes Node ContainerGCFailed 트러블슈팅 어느날 쿠버네티스 워커노드에서 갑자기 ContainerGCFailed 이벤트가 발생하여 노드의 디스크에 문제가 발생했다.Events: Type Reason Age From Message ---- ---- ---- ---- ---- Warning ContainerGCFailed 3m2s (x151 over 152m) kubelet failed to read podLogRootDirectory "/var/log/pods": open /var/log/pods: input/output error 해당 이벤트가 발생한 노드에서 .. 2025. 9. 30.
CoreDNS DNS Resolve timedout과 ndots 쿠버네티스를 운영하다가 트래픽이 어느정도 된 이후에 간헐적으로 DNS Resolve timedout가 발생한 적이 있는데 관련해서 쿠버네티스에서 CoreDNS와 DNS 쿼리 관련하여 분석해보았다. 애플리케이션에서 찍힌 에러 로그는 다음과 유사하다.Failed to resolve 'api.test.com' [A(1)] after 2 queries CoreDNS와 서비스간 통신CoreDNS는 쿠버네티스에서 클러스터에서 DNS 서버역할을 하는 애드온이다. 클러스터 내에서 서비스를 생성하면 서비스에 대한 DNS 레코드가 생성되는데 이러한 DNS 레코드는 CoreDNS에서 관리한다. 예를 들어, saga 네임스페이스의 account-service가 생성되면 account-service.saga.svc.cluste.. 2025. 9. 27.
istio 503 UC upstream_reset_before_response_started{connection_termination} 트러블슈팅 istio를 운영하면서 503 UC upstream_reset_before_response_started{connection_termination} 겪은 이슈와 나름의 해결 방법에 대해 소개하고자 한다.이슈 상황 위 그림과 같이 특정 도메인(test.com) 으로 요청이 오는 경우, 쿠버네티스 바깥의 외부 서비스(external-service.com) 로 포워딩하도록 istio를 구성한 상황에서 간헐적으로 503 에러가 발생한 것을 확인하였다. 따져보자면 약 0.05% 내외의 비율로 200과 503에러가 각각 발생하는데, 큰 비율은 아니지만 서비스 안정성에 대해 좋지 않은 현상이 지속적으로 발생하는 것이기 때문에 원인을 파악하고 빠르게 조치를 하는 것이 필요하다.초기 구성초기 구성은 다음과 같다.apiV.. 2025. 9. 8.
OpenTelemetry 소개 마이크로서비스 아키텍처와 같이 여러 컴포넌트끼리 상호작용하는 시스템을 운영할 때, 특정 기능에서 에러가 발생하거나, 특정 조건에서 특정 기능의 처리량이 느리다거나 하는 이상 현상이 발생한다고 하자. 그러면 어떤 구간에서 에러가 발생했는지, 어떤 구간에서 병목현상이 발생했는지를 확인하고, 해결하는 과정이 필요한데 이를 분석할 환경이 따로 마련되어있지 않는다면 원인을 찾기 힘들 것이다. 이러한 복잡한 시스템을 운영하려면 시스템에 대한 상황을 종합적으로 확인할 수 있도록 돕는 도구가 반드시 필요하다. OpenTelemetry는 이러한 시스템을 관찰 가능하게 하도록 환경을 마련하는 데 돕는 오픈소스이다. OpenTelemetryOpenTelemetry는 분산 시스템의 관찰 가능성(Observability)을 .. 2025. 7. 29.
Prometheus 데이터 구조 및 PromQL 이번 시간에는 Prometheus에서 저장하는 데이터 구조에 대해 알아보고, PromQL에 대해 간략하게 알아보는 시간을 가져보자. Data modelPrometheus는 기본적으로 모든 데이터를 시계열 데이터로 저장한다. Prometheus가 저장하는 메트릭의 데이터 구조를 보면 크게 4가지로 나뉘게 된다.metric name: 메트릭 종류metric labels: 메트릭 종류에 대한 차원 데이터timestamp: 메트릭을 수집한 시점value: 수집된 메트릭 값  metric name metric name은 측정되는 시스템의 일반적인 가능을 지정한다. 위의 그림에서 container_memory_rss 라는 것이 metric name인데, 해당 메트릭은 컨테이너의 실제 사용 메모리 바이트가 얼마인지를.. 2025. 4. 6.
728x90