쿠버네티스 클러스터 네트워크
쿠버네티스 포드에서 설명했듯이 같은 포드의 컨테이너는 localhost로 서로 통신을 할 수 있다. 하지만 다른 포드에 있는 컨테이너와 통시하려면 포드의 IP주소로 통신한다.
쿠버네티스 클러스터는 클러스터를 생성하면 노드상에 포드를 위한 내부 네트워크가 자동으로 구성된다. 내부 네트워크 구성은 사용할 CNI(Container Network Interface)라는 플러그형 모듈 구현에 따라 다르지만 기본적으로 노드별로 다른 네트워크 세그먼트를 구성하여 노드 간 통신이 가능하게 구성한다.
이러한 내부 네트워크가 자동으로 구성되기 때문에 파드는 서비스를 사용하지 않고도 포드 간 통신이 가능한다. 하지만 서비스를 사용하게 되면 포드에 트래픽을 로드 밸런싱 시킬 수 있고 서비스 디스커버리의 용이성 획득과 클러스터 내부 DNS를 구축할 수 있게 된다.
서비스 디스커버리
서비스 디스커버리는 간단히 말해 특정 조건의 대상이 되는 멤버를 보여주거나 이름에서 엔드포인트를 판별하게 하는 기능이다. 쿠버네티스에서의 서비스 디스커버리는 서비스에 속해 있는 포드를 보여주거나 서비스명에서 엔드포인트 정보를 반환할 수 있게 된다
서비스를 실행시키게 되면 쿠버네티스 내부 DNS 서버에서 서비스명으로 ClusterIP를 대체로 사용할 수 있다. IP 주소가 변경이 되어도 서비스명으로 접근하게 되면 동일한 서비스에 접속할 수 있다. 정식 FQDN은 '서비스명.네임스페이스명.svc.cluster.local' 이다.
ClusterIP
ClusterIP 서비스는 쿠버네티스의 가장 기본이 ㄱ되는 서비스이며 쿠버네티스 클러스터 내부에서만 통신 가능한 Internal Network가 생성되는 가상 IP가 할당된다.
apiVersion: v1
kind: Service
metadata:
name: sample-clusterip
spec:
type: ClusterIP
ports :
- name: "http-port"
protocol: "TCP"
port: 8080
targetPort: 80
selector:
app: sample-app
보통 Deployment를 생성하고 명시된 label과 동일한 selector를 지정한다. spec.ports.port에는 ClusterIP에서 수신할 포트 번호를 지정하고 spec.ports.targetPort는 목적지 컨테이너 포트번호를 지정한다
NodePort
Nodeport 서비스는 모든 쿠버네티스 노드의 IP주소:포트에서 수신한 트래픽을 컨테이너에 전송하는 형태로 외부와 통신할 수 있다.
apiVersion: v1
ind: Service
metadata:
name: sample-nodeport
spec:
type: NodePort
ports:
- name: "http-port"
protocol: "TCP"
port: 8080
targetPort: 80
nodePort: 30080
selector:
app: sample-app
Nodeport를 생성하면 ClusterIP도 자동으로 생겨 클러스터 내부에서 통신이 가능한 네트워크가 생성된다. 다른 점은 nodePort를 지정할 수 있다는 것인데 특정 노드의 IP와 명시된 nodePort로 접근하면 CluterIP:port로 전송이 된다는 것이다. nodePort 항목에 명시적으로 포트를 지정하지 않으면 빈 포트 번호가 자동으로 선택된다
LoadBalancer
LoadBalancer 서비스는 서비스 환경에서 클러스터 외부로부터 트래픽을 수신할 때 가장 실용적이고 사용하기 편리한 서비스다. LoadBalancer 서비스는 쿠버네티스 클러스터 외부의 로드 밸런서에 외부 통신이 가능한 가상 IP르 할당할 수 있다.
NodePort는 결국 하나의 쿠버네티스 노드에 할당된 IP주소로 통신을 하기 때문에 그 노드가 단일 장애점(Single Point of Failure)이 되어 버린다. 그러나 LoadBalancer에서는 쿠버네티스 노드와 별도로 외부 로드 밸런서를 사용하기 때문에 노드 장애가 발생해도 크게 문제가 도지 않는다.
apiVersion: v1
kind: Service
metadata:
name: sample-lb
spec:
type: LoadBalancer
ports:
- name: "http-port"
protocol: "TCP"
port: 8080
targetPort: 80
nodePort: 30082
selector:
app: sample-app
'Kubernetes' 카테고리의 다른 글
쿠버네티스 인그레스 (0) | 2022.01.01 |
---|---|
쿠버네티스 서비스 기능 (0) | 2021.12.01 |
쿠버네티스 스테이트풀셋 (0) | 2021.11.16 |
쿠버네티스 포드 디자인 패턴 및 포드 설계 (0) | 2021.11.06 |
쿠버네티스 잡(Job) 및 크론잡(CronJob) (0) | 2021.10.18 |