본문 바로가기

전체 글

(51)
정리 서비스 지연이 확인되었을 때, 확인할 점 Kubernetes Layer 1. Pod/Node 리소스 상태 확인 CPU throttling 발생 여부 (1순위)Memory Pressure / OOMKillNode saturation # CPUThrottlingHigh 이벤트 여부kubectl describe pod 2. Pod scheduling / Node 상태 # Node condition 확인kubectl get nodes -o widekubectl describe node DiskPressureMemoryPressureNetworkUnavailableKubelet restart 흔적 3. 네트워크 경로 (k8s 내부)Service mesh / CNI kubectl exec -it -- pin..
NFS provisioner와 PV 볼륨 마운트 방식 (feat. PVC troubleshooting) 현재 회사에선 DB같이 영구 볼륨이 필요한 경우, kubernetes-sigs/nfs-subdir-external-provisioner 를 이용하여 NFS에 데이터를 저장하고, PVC를 통해 볼륨 마운트하여 사용을 하고 있다. 그러다 개발환경 클러스터에 배포되어 있는 내부서비스 audit로그를 저장하는 postgres DB 파드가 동시다발적으로 죽어있는 것을 확인하였다. 해당 파드 메인컨테이너 로그는 다음과 같았다.PostgreSQL Database directory appears to contain a database; Skipping initialization ..
kube-apiserver, kube-controller, scheduler 문제 복구 요약/etc/kubernetes/manifests 위치에 존재하는 쿠버네티스 핵심 컴포넌트 매니페스트 파일을 일시적으로 다른 경로로 옮겼다가 다시 재위치시켜라. 다양한 문제로 kube-apiserver나 kube-controller-manager, etcd, scheduler 파드가 제대로 동작하지 않을 수 있습니다. 물론 대부분의 오류는 해당 파드의 컨테이너에서 출력되는 로그를 보고 정확한 원인에 대해 대처를 해야 하는데요. 대처하기 어렵거나, 정확한 원인을 파악할 수 없는 경우 한번쯤 시도해 볼만한 방법입니다. # 핵심 manifest 파일들을 인식할 수 있도록 임시로 옮겼다가 다시 재위치시킨다.# 재생성이 안되면, kube-apiserver.yaml 파일 수정 후에 아래의 내용을 다시 시도sudo..
kubernetes ingress What is Ingress?인그레스는 클러스터 외부에서 클러스터 내 서비스로의 HTTP 및 HTTPS 경로를 노출합니다. 트래픽 라우팅은 인그레스 리소스에 정의된 규칙에 의해 제어됩니다. 왜 사용할까?접근하려는 엔드포인트마다, 로드밸런서를 붙이기에는 현실적으로 어렵기에,ingress의 URI기반 라우팅을 이용하여 로드밸런서 수를 최소화할 수 있습니다. 그림과 같이 path 기반으로 각각 다른 서비스로의 라우팅이 일어나고 있습니다.아래는 해당 그림에 대한 Ingress.yaml 파일입니다. apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: simple-fanout-examplespec: rules: - host: foo.bar.com ..
사이드카 활용 패턴과 namespace 활용 전략 sidecar pattern - Adapter주 컨테이너가 출력하는 데이터를 외부 시스템이 이해할 수 있도록 변환해주는 역할 주 컨테이너는 로그나 데이터를 자체 포맷으로 출력 / 외부 시스템 (모니터링 툴, 로깅 시스템)은 특정 포맷(JSON 등)을 요구하는 경우기존 시스템을 바꾸기 어려울 때 중간에서 변환기로서 사용Metrics data를 Prometheus가 이해할 수 있도록 변환하는 Exporter도  adapter로 볼 수 있음주 컨테이너가 단순 text로 로그를 출력 -> 로그 수집기인 Fluentd 형식(JSON)으로 변환하여 전달하는 경우Pod├── main-container (앱: 로그를 plain text로 출력)└── adapter-container (텍스트를 JSON으로 변환해서 lo..
kubernetes - service, namespace, configmap, secret service여러 개의 파드에 쉽게 접근할 수 있도록 고유한 도메인 이름 부여여러 개의 파드에 접근할 때, 요청을 분산하는 로드 밸런서 기능클라우드 플랫폼의 로드밸런서, 노드 포트 등을 이용해 파드를 외부로 노출 service 종류clusterIP : 쿠버네티스 내부에서만 파드들에 접근할 때 사용NodePort : 파드에 접근할 수 있는 포트를 클러스터의 모든 노드에 동일하게 개방 / ${nodeIP}:${NodePort}로 외부에서 접근LoadBalancer : 클라우드 플랫폼에서 제공하는 로드 밸런서를 동적으로 프로비저닝 하여 파드에 연결 / 외부에서 접근할 수 있는 서비스 타입 (GCP, AWS 와 같읕 클라우드 프로바이더 제공) clusterIP typeapiVersion: v1kind: Serv..
쿠버네티스 설치 및 기본 개념 (pod, replicaset, deployment) 쿠버네티스 설치 쿠버네티스 설치부분은 이전에 포스팅한 글로 대체하겠습니다.  kubeadm을 이용한 설치 - 온 프레미스https://wath1457.tistory.com/23 우분투 쿠버네티스 1.31 클러스터 생성하기OS : Ubuntu 22.04 kubeadm을 이용하여 쿠버네티스 클러스터를 구축해 보겠습니다.  공통) 모든 노드에서 진행 1. swap 비활성화# swap 활성화 되어있는지 확인free -h# 해당 파일을 수정하여 swap 부분을wath1457.tistory.com  kind (kubernetes in docker) - 로컬 환경에서 쉽게 쿠버네티스 환경 구성하기해당 방법은 로컬 컴퓨터에 미리 정의한 yaml파일을 가지고 쿠버네티스의 한 노드가 하나의 컨테이너로 띄워지는 환경입니다...
도커 컴포즈 (설치 및 개념) 본 포스팅은 시작하세요! 도커/쿠버네티스 서적 기반으로 작성한 포스팅입니다. 도커 컴포즈가 필요한 이유도커커를 이용하여 웹 서버 컨테이너와 데이터베이스 컨테이너를 이용하여 웹 애플리케이션을 구동하려는 경우# 여러 컨테이너로 구성된 애플리케이션을 구동하기 위해선 여러 개의 run 명령어가 요구됨docker run --name mysql -d alicek106/composetest:mysql muysqlddocker run -d -p 80:80 \--link mysql:db --name web \alicek106/composetest:mysql:web apachectl -DFOREGROUND 따라서 여러 개의 컨테이너를 하나의 서비스로 정의해 컨테이너 묶음으로 관리하기 위한 도커 컴포즈가 나오게 되었음. 여..