✔️ Kubernetes 구성
쿠버네티스는 크게 오브젝트(Object)와 오브젝트를 관리하는 컨트롤러(Controller)로 나눠져 있다.
쿠버네티스 오브젝트는 쿠버네티스 시스템에서 영속성을 가진다. 오브젝트를 생성하면 쿠버네티스는 원하는 상태를 보장하기 위해 지속적으로 작동한다.
쿠버네티스는 클러스터의 상태(Status)를 나타내기 위해 이 오브젝트를 이용한다.
거의 모든 쿠버네티스 오브젝트는 오브젝트 구성을 결정해주는 두개의 중첩된 오브젝트 필드인 status와 spec을 포함한다.
- status : 쿠버네티스 시스템과 컴포넌트에 의해 제공되고 업데이트된 오브젝트의 현재 상태를 설명
- spec : 오브젝트의 특성으로 추구하는(Desired) 상태를 설명
컨트롤러는 status가 spec과 일치하도록 오브젝트를 생성/삭제한다.
쿠버네티스에는 쿠버네티스에 의해 배포, 관리되는 가장 기본적인 4가지의 오브젝트가 존재한다.
Pod
Service
Volume
Namespace
이해를 돕기위해 시각화된 이미지로 다시 한번 설명해본다.
Pod를 띄우기 위해서는,
1. Deployment를 먼저 생성 → 그러면 Deployment가
2. ReplicaSet을 자동으로 생성하고 → 그럼 ReplicaSet이
3. Pod를 자동으로 생성하는 구조를 갖는다.
그리고 이 오브젝트를 외부에 노출할 때는
1. Service(Cluster IP)를 하나 붙이고
2. 거기에 Ingress를 붙인다. → Ingress를 붙이면
3. NodePort와 LoadBalancer가 자동으로 생성된다.
즉, 클라이언트가 도메인을 통해 접속하면 로드밸런서를 거치고 노드 포트를 거치고 클러스터IP를 거쳐서 Pod로 연결되는 것이다.
이제 각각의 오브젝트에 대해 좀 더 자세히 알아보자
Pod
Pod는 쿠버네티스에서 가장 작은 배포 단위이며, 각 Pod마다 고유한 IP를 할당받는다. 여러개의 컨테이너가 하나의 Pod에 속할 수 있다.
Service (ClusterIP)
쿠버네티스는 네트워크도 Service라는 별도의 오브젝트로 관리한다.
서비스 중에서도 ClusterIP는 클러스터 내부에서 사용하는 프록시(Proxy) 서비스이다.
ClusterIP에 요청을 보내면 여러개의 Pod 중 하나로 자동으로 요청이 가는 것이다.
이렇게 ClusterIP를 사용하는 이유는 Pod의 IP는 동적이기 때문이다. (Deployment를 통해 Pod가 업데이트 될 때 IP를 유지한 상태로 업데이트 되는 것이 아니라 그냥 Pod는 죽고 새로운 Pod가 생성되는 개념이다.)
따라서 Pod의 IP와는 상관없이 액세스할 수 있도록 하는 고유 IP를 가진 Service가 필요한 것이다.
클러스터 내부에서의 서비스 연결은 DNS를 이용한다.
Service (NodePort)
그러나 ClusterIP는 클러스터의 내부에서만 통신할 수 있다.
외부 브라우저에서도 접근할 수 있도록 NodePort라는 개념이 등장한다.
NodePort는 노드(host)에 노출되어 외부에서도 접근이 가능한 서비스이다.
다만 노드/VM IP가 변경된 경우 처리를 해줘야하기 때문에 실 서비스에서도 노드 포트만으로 외부 클라이언트를 노출하는 방식은 권장되지 않는다.
"로드 밸런싱"을 사용한다.
NodePort에는 중요한 특징이 있는데, 노드가 여러개일 때 NodePort를 생성하면 모든 노드에 노드포트가 생성된다.
이때 어떤 노드에 요청을 보내도 내부의 원하는 ClusterIP로 자동으로 연결되도록 작동한다.
Service (LoadBalancer)
모든 노드에 외부 접속 분산 요청을 처리하기 위해서는 NodePort보다는 LoadBalancer를 사용하는 것이 적절하다.
NodePort 앞에 LB가 붙어있는 것을 볼 수 있는데 이는 단 1개의 IP만을 외부에 노출하게 하며 해당 IP로 모든 트래픽을 부하 분산하기 위한 것이다.
HTTP, TCP, UDP 등 우리가 아주 흔히 사용하는 네트워크 프로토콜과 통신할 수 있다.
Ingrees
Ingress는 도메인 이름, 도메인 Path에 따라 내부에 있는 ClusterIP에도 같은 이름으로 연결할 수 있도록 해준다.
Ingress 하나만 만들어도 여러개의 LB를 만들어 자원을 낭비하는 것을 방지할 수 있다.
🔗참고
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Service Discovery (0) | 2022.03.17 |
---|---|
[Kubernetes] Object - Service (0) | 2022.03.17 |
[Kubernetes] Workload Resources (0) | 2022.03.16 |
[Kubernetes] Pod란 ? (0) | 2022.03.16 |
쿠버네티스(Kubernetes)란 ? (0) | 2022.03.14 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!