inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

그림으로 배우는 쿠버네티스(v1.35)

4.6.클러스터주소(ClusterIP), 헤드리스(Headless)

clusterIP가 없을 때 POD끼리의 통신가능 여부

210

wyshin

작성한 질문수 3

0

[질문 하기]

 

안녕하세요 4.6 강의를 듣다가 궁금증이 생겨 질문드려요

 

CluterIP는 내부에서 POD끼리 통신을 위해 존재하는 서비스라고 이해를 했습니다. 그렇다면 ClusterIP가 없다면 POD끼리 통신이 불가능하지 않을까 생각이 들어 아래와 같은 yaml파일을 배포해봤습니다

 

apiVersion: apps/v1

kind: Deployment

metadata:

name: deploy-nginx

labels:

app: deploy-nginx

spec:

replicas: 3

selector:

matchLabels:

app: deploy-nginx

template:

metadata:

labels:

app: deploy-nginx

spec:

containers:

- name: chkip

image: sysnet4admin/net-tools-ifn

#---

#apiVersion: v1

#kind: Service

#metadata:

# name: cl-nginx

#spec:

# selector:

# app: deploy-nginx

# ports:

# - name: http

# port: 80

# targetPort: 80

# type: ClusterIP

 

처음에는 아래에 있는 주석을 풀어 ClusterIP를 생성하고 각 POD에 접속하여 pod끼리 ping을 날렸을 때는 당연히 ClusterIP 덕분에 통신이 된다고 생각했습니다

 

그리고, 주석을 추가해 ClusterIP없이 배포를 했습니다

[root@m-k8s 4.6]# k get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

deploy-nginx-bc5885484-snsgf 1/1 Running 0 33s 172.16.221.160 w1-k8s <none> <none>

deploy-nginx-bc5885484-tqcp2 1/1 Running 0 33s 172.16.132.51 w3-k8s <none> <none>

deploy-nginx-bc5885484-x269c 1/1 Running 0 33s 172.16.103.178 w2-k8s <none> <none>

net 1/1 Running 0 76m 172.16.132.43 w3-k8s <none> <none>

 

[root@m-k8s 4.6]# k get service

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10d

 

그런데 생각과는 달리 ClusterIP가 없어도 pod끼리 통신이 가능하더라고요

[root@m-k8s 4.6]# k exec deploy-nginx-bc5885484-snsgf -it -- /bin/bash

[root@deploy-nginx-bc5885484-snsgf /]# ping 172.16.132.51

PING 172.16.132.51 (172.16.132.51): 56 data bytes

64 bytes from 172.16.132.51: seq=0 ttl=62 time=0.806 ms

64 bytes from 172.16.132.51: seq=1 ttl=62 time=0.497 ms

 

ClusterIP가 없어도 통신이 가능한 이유가 어떻게 될까요??

docker kubernetes

답변 1

0

조훈(Hoon Jo)

안녕하세요

현재 구성 환경은 (한 개의 호스트에 가상으로 구성하기 위해서) 노드 간에 IP 및 서로 터널링(calico - tunneling)으로 통신이 모두 가능하도록 구성되어 있습니다.

따라서 현재의 환경에서는 파드 간의 통신이 터널링 구간을 통해서 가능합니다. 그전에 NAT (eth0)를 통해서 넘어갑니다. 해당 내용은 traceroute로 다음과 같이 확인하실 수 있습니다.

 

[ 온프레미스 / 현재 환경 ]

root@cp-k8s:~# k get po -o wide 
NAME                   READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
net-775d7d6b6-cxh5h    1/1     Running   0          46s   172.16.132.41    w3-k8s   <none>           <none>
net-775d7d6b6-rh568    1/1     Running   0          53s   172.16.221.163   w1-k8s   <none>           <none>
net-775d7d6b6-xlftb    1/1     Running   0          46s   172.16.103.163   w2-k8s   <none>           <none>

[root@net-775d7d6b6-cxh5h /]# traceroute 172.16.221.163
 1  10.0.2.15 (10.0.2.15)  0.012 ms  0.014 ms  0.007 ms
 2  172.16.221.128 (172.16.221.128)  1.133 ms  0.508 ms  0.628 ms
 3  172.16.221.163 (172.16.221.163)  1.285 ms  1.401 ms  27.686 ms

이는 클라우드 (공급사에 따라 다름)에서도 마찬가지입니다. 크게 보면 내부 IDC 이기 때문에 통신 가능하다면 응답 받을 수 있습니다.

아마 왜 clusterIP를 사용하는지는 헤드리스 서비스(도메인으로만 통신)와 연관 지으면 좀 더 이해가 되실 것 같습니다.

IP 로(계속 변화하는 값) 통신하고 설정되는 것은 애플리케이션에서 사용하기 어렵습니다.

또한 엔드포인트까지 보신다면 단일 파드 접근은 큰의미 없다는 것을 알게 되실 것 같습니다.

 

[ 클라우드 환경 / GKE ]

[(☸️ |hj-gke:default)]$ k get po -o wide 
NAME                    READY   STATUS    RESTARTS   AGE     IP            NODE                                      NOMINATED NODE   READINESS GATES
net-775d7d6b6-58khn     1/1     Running   0          69s     10.116.2.19   gke-keycloak-default-pool-05b3d298-mpdt   <none>           <none>
net-775d7d6b6-rqjnv     1/1     Running   0          69s     10.116.1.9    gke-keycloak-default-pool-05b3d298-855c   <none>           <none>
net-775d7d6b6-vqdxv     1/1     Running   0          69s     10.116.0.7    gke-keycloak-default-pool-05b3d298-9p4p   <none>           <none>

[root@net-775d7d6b6-58khn /]# traceroute 10.116.1.9
traceroute to 10.116.1.9 (10.116.1.9), 30 hops max, 46 byte packets
 1  10.116.2.1 (10.116.2.1)  0.010 ms  0.008 ms  0.004 ms
 2  gke.prjname.internal (10.128.0.37)  1.331 ms  0.228 ms  0.402 ms
 3  10.116.1.9 (10.116.1.9)  0.836 ms  0.316 ms  0.230 ms

0

wyshin

연휴인데도 답변 해주셔서 감사합니다

섹션2. 1.5쿠버네티스_컨트롤플레인_노드와_워커_노드_그리고 kubeadm으로 쿠버네티스 직접 구성하기-v1.30 오류

0

40

2

[해결] 2.4. tabby config.yaml 파일 복사 실패 시

1

93

0

9.3 Error 발생 유도 테스트 확인 부탁드립니다.

0

95

2

livenessProbe 어플리케이션 재시작 의미

0

67

2

K8S 노들에 접근이 안됩니다.

0

168

6

arm virtualBox의 vagrant up 에러

0

115

2

추후 강의계획 질문

0

149

1

MAC 에서 사용할 수 있는 ova 파일은 없나요?

0

220

2

7.8. w3-affinity-leader 적용 에러 문제 질문드립니다.

0

211

5

커리큘럼 순서 문의

0

206

2

apply 실행 후 pod상태가 ContainerCreating 에서 변경이 안됩니다.

0

371

2

livenessProbe에 대한 설명이 조금 부족한거 같네요

0

218

3

controlplane_node.sh 실행 오류 문의

0

242

2

예제폴더의 경로와 영상의 경로가 너무나도 다릅니다

0

219

2

9.6강의 소스 수정 요청 및 에러 문의

0

165

2

8.6 강의 중 sysnet4admin/chk-info 이미지 bash 이슈

0

161

3

드디어 맥에서도 virtualbox가 지원 됩니다.

0

282

2

8.3강의 set-ctx-pod-admin.sh 수정 요청

0

120

3

7.5 강의 tardy-nginx 이미지 문제

0

3312

3

ch1. controlplan_node.sh 실행 시 에러가 뜹니다

0

306

3

Kubenetes 클러스터에 추가적으로 신뢰하는 CA를 넣을 수 있나요?

0

183

1

clusterrolebinding의 --namespace 옵션의 역할

0

165

2

A.0003 파일 vagrant file 수정 (자문자답)

0

167

2

nfs-client-provisioner 관련 생성 오류 질문

0

191

1