
이번에는 서비스라는 쿠버네티스 리소스가 어떤 식으로 네트워크를 돕는지 알아보자. 쿠버네티스 공식문서에서 서비스에 대한 내용을 살펴보자 서비스 파드 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법 쿠버네티스를 사용하면 익숙하지 않은 서비스 디스커버리 메커니즘을 사용하기 위해 애플리케이션을 수정할 필요가 없다. 쿠버네티스는 파드에게 고유한 IP 주소와 파드 집합에 대한 단일 DNS 명을 부여하고, 그것들 간에 로드-밸런스를 수행할 수 있다. 동기 쿠버네티스 파드는 클러스터 목표 상태(desired state)와 일치하도록 생성되고 삭제된다. 파드는 비영구적 리소스이다. 만약 앱을 실행하기 위해 디플로이먼트를 사용한다면, 동적으로 파드를 생성하고 제거할 수 있다. 각 파드는 고유한 IP..

쿠버네티스의 네트워크는 클러스터 내부 요소들에 대해서 물리적인 위치에 구애받지 않고 통신할 수 있다. 하지만 이러한 네트워킹 요소에는 Pod 네트워크, Service, Cluster IP, container ports, host ports, node ports 등 고려해야 할 요소가 너무 많다. 그래서 쿠버네티스의 네트워킹 방식에 대해 알아보자. 도커 네트워크 일단 쿠버네티스를 알아보기 위해서는 항상 먼저 도커를 이해하는 것이 도움이 되는 것 같다. 도커를 통해 컨테이너와 도커 호스트는 어떻게 통신하는 지 알아보자. 도커를 설치하면 docker0라는 인터페이스가 생긴 것을 볼 수 있다. 이 인터페이스는 가상 인터페이스이며, 특별한 설정 없이는 디폴트 대역대를 부여 받는다. 이 docker0는 컨테이너가 ..

DooD, DinD K8S에서 CI/CD를 통해 Docker 이미지를 빌드해봤다면 한번 쯤 마주쳤을 키워드이다. Docker는 Client와 Daemon으로 나누어진다. CI 도구를 사용하여 agent를 통해 docker와 관련된 task를 수행하기 때문에 container에서 agent가 호스트 머신의 docker daemon에 어떻게 명령을 전달할지 고민해야한다. Docker는 docker 위에서 docker를 사용하지 않는 것을 권장한다. 그래서 컨테이너 환경에서 Docker Daemon을 사용하기 위한 방법으로 주로 DinD와 DooD와 사용된다. Docker in Docker (DinD) DinD는 컨테이너 내에서 Docker 데몬을 실행하여 컨테이너 내에서 Docker를 실행하는 방식이다. 이..
구성한 클러스터를 기반으로 여러가지 오브젝트를 사용해보고자 한다. 모든 오브젝트를 다룰수는 없으니 Deployment와 각종 Service 들을 사용해보고자 한다. 사전 준비 Flask 파드가 생성 되었을 때 어떤 노드에 스케쥴링 되는지 확인해보기 위해 접근 시 호스트네임을 리턴하는 Flask를 준비했다. 추후 배포 과정과 URL 기반 트래픽 분산 등의 확장과 K8S 이상의 확장까지 고려하고 있다. Image FROM python:3.9.4 RUN mkdir -p /root/k8s-web WORKDIR /root/k8s-web COPY . . RUN python -m pip install --upgrade pip RUN pip install -r ./requirements.txt EXPOSE 5000 C..
etcd는 Kubernetes의 기반 스토리지(backing storage)로 모든 데이터가 etcd에 보관된다. 클러스터에 어떤 노드가 몇 개나 있고 어떤 파드가 어떤 노드에서 동작하고 있는지가 etcd에 기록된다. 만약 동작 중인 클러스터의 etcd 데이터베이스가 유실된다면 컨테이너뿐만 아니라 클러스터가 사용하는 모든 리소스를 잃어버린다. etcd는 key:value 형태의 데이터를 저장하는 스토리지이며, etcd가 죽으면 Kubernetes 클러스터는 제대로 동작하지 못하게 되므로 높은 신뢰성을 제공해야 한다. etcd는 Raft 알고리즘을 사용해 리더 선출, 로그 복제, 런타임 재구성등의 기능을 한다. K8S etcd 토폴로지 Kubernetes에서는 HA 구성을 위해 두가지 etcd 토폴로지를 ..
HAproxy와 kubeadm을 활용해 쿠버네티스 고가용성 클러스터를 구성하자. 쿠버네티스의 마스터 노드는 단일 실패 지점이 될 가능성이 크다. 마스터 노드가 실패하면 워커 노드를 컨트롤할 방법이 없기 때문에 반드시 마스터 노드의 고가용성을 위해 다수의 마스터 노드를 배치한다. 여기서는 etcd를 마스터 노드에 포함한 형태의 마스터 노드를 구성한다. 구성 1대의 haproxy 서버와 3대의 마스터 노드, 워커 노드를 구성한다. 10.138.0.26 haproxy 10.138.0.22 master-1 10.138.0.27 master-2 10.138.0.28 master-3 10.138.0.23 node-1 10.138.0.24 node-2 10.138.0.25 node-3 해당 도메인을 /etc/host..
NHN Cloud 인턴십에서 NHN Cloud의 k8s 서비스를 이용해보았고, 다른 CSP에도 이런 k8s 서비스가 있다는 것은 알고 있다. 하지만 이 서비스는 굉장히 비싼 서비스이며, k8s를 구축하게 될 때 이런 서비스를 사용한다는 보장이 없기 때문에 직접 구축 해보도록 한다. GCP를 선택한 이유는 무료 크레딧이 잘되있기 때문. GCP의 인스턴스 생성 과정은 생략하도록 한다. VM 준비 Ubuntu 18.08, Disk 10GB, Master 노드 1개(vCPU 2, MEM 4), Worker 노드 3개(vCPU 2, MEM 2) 를 준비 사전 준비 이 부분은 Master와 Worker 모두 일괄적으로 진행하는 과정이다. SWAP 메모리 해제 컨테이너 환경이란, 호스트의 물리 리소스를 할당받아 사용..
JSONPath 기본 문법 요소 JSON의 데이터는 키-값 쌍으로 이루어진 요소들을 객체(object; {}로 표현) 또는 배열(array; []로 표현)로 묶어놓은 형태를 가진다. 자주 쓰이는 문법 요소들은 다음과 같다. $ : 루트 노드. JSONPath의 모든 표현식은 이것으로 시작된다. @ : 현재 노드. 아래에서 소개할 조건부 필터 표현식에서 사용된다. . : 하위 노드 .. : 중첩된 전체 하위 요소들(nested descendants) [] : 배열 인덱스 `` : 모든 요소와 매칭되는 와일드 카드 ?(boolean expression) : 조건부 필터 표현식 { "apiVersion": "v1", "kind": "Pod", "metadata": { "name": "nginx-pod", "n..