본문 바로가기
CICD

[Kubernetes] Headless, Endpoint, ExternalName(Service)

by 장중앙 2022. 1. 22.

  * 사용자 관점에서 Pod/Service에 연결하는 방법

 

파드의 입장에서 연결 및 외부 서비스에 안정적인 연결방법

* 이러한 연결 방법에는 DNS Server를 기본적으로 이용하여 사용

DNS Server란

  • 쿠버네티스 클러스터 안에 존재하는 서비스의 이름과 IP가 저장되어 있는 존재
  • Pod가 Service에 대한 도메인을 질의하면 해당 Service IP를 알려줌
  • Pod가 유저를 찾으려고 할 때, 쿠버네티스 내부 뿐만 아니라, 상위 DNS 인 내부망 DNS, 외부 네트워크 DNS까지 조회가능

   * DNS Server는 FQDN(Fully Qualified Domain Name)으로 구성되어 있음

   

 

파드의 입장에서 외부 및 다른 서비스/Pod와 연결 가능한 방법

1. Headless

  • Pod간의 연결을 위해 사용하는 방법
  • Cluster IP가 None인 Service
  • DNS Server에 Pod의 이름과 Service의 이름이 붙여져서 도메인 이름으로 등록됨
  • 다른 Pod에 접근하기 위해 IP 주소를 알 필요없이, 도메인 이름으로 접근 가능

 

 

2. EndPoint

  • 사용자의 입장에서 Label을 이용해 Pod와 Service간의 연결을 진행
  • 쿠버네티스측에서는 이러한 연결을 위해 EndPoint를 만들어서 연결고리를 관리함
  • 이러한 EndPoint는 Service와 동일한 이름을 가지고 있고 Pod의 IP정보를 담고 있음
  • EndPoint를 직접 만드는 것으로 Label, Selector를 만들지 않고도 연결이 가능
  • Pod 뿐만 아니라 외부의 IP 주소를 입력하여 외부와도 연결이 가능

 

 

3. ExternalName

  • 외부 사이트에서 데이터를 가져오려는 경우 사용
    • EndPoint로도 외부와 연결은 가능하지만, IP가 변동될 가능성이 있어 hostname으로 연결하는 방법
  • 쿠버네티스 DNS Server로 부터 상위 DNS Server를 계속 거쳐 외부 네트워크로 접근하는 방법

* Pod는 Service만 가르키면 되고 Service에서 필요할 때마다 해당 도메인 주소 변경이 가능

     -> 외부 대상 IP가 변경될 때마다 Pod를 수정하고 재배포할 필요가 없어짐

 

 


1. 쿠버네티스 DNS 실습

서비스 생성

apiVersion: v1
kind: Service
metadata:
  name: clusterip1
spec:
  selector:
    svc: clusterip
  ports:
  - port: 80
    targetPort: 8080

 서비스와 연동된 Pod 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod1
  labels:
    svc: clusterip
spec:
  containers:
  - name: container
    image: kubetm/app

서비스 및 Pod 생성 확인

 

 

생성한 서비스와 연동되지 않은Pod 생성

apiVersion: v1
kind: Pod
metadata:
  name: request-pod
spec:
  containers:
  - name: container
    image: kubetm/init

 

master 노드에서 콘솔을 이용해 해당 Pod(Request-pod)로 진입

kubectl exec "pod name" -it /bin/bash

 

DNS로 IP 조회

// 해당 서비스명으로 IP 조회
nslookup clusterip1
// FQDM에 맞춰 입력해도 같은 결과가 출력
nslookup clusterip1.default.svc.cluster.local

 

도메인으로 해당 서비스에 접근 가능

curl clusterip1/hostname
curl clusterip1.default.svc.cluster.local/hostname


2. Headless 실습

서비스 생성

클러스터 IP에 None이라는 속성을 지정

apiVersion: v1
kind: Service
metadata:
  name: headless1
spec:
  selector:
    svc: headless
  ports:
    - port: 80
      targetPort: 8080    
  clusterIP: None

 

서비스와 연동될 Pod 2개 생성

hostname, subdmain을 지정

hostname 을 지정하지 않으면 Pod이름이 host명이 됨

subdomain은 일반적으로 서비스명을 지정

apiVersion: v1
kind: Pod
metadata:
  name: pod4
  labels:
    svc: headless
spec:
  hostname: pod-a
  subdomain: headless1
  containers:
  - name: container
    image: kubetm/app
apiVersion: v1
kind: Pod
metadata:
  name: pod5
  labels:
    svc: headless
spec:
  hostname: pod-b
  subdomain: headless1
  containers:
  - name: container
    image: kubetm/app

생성된 파드와 서비스 확인

클러스터 IP가 만들어지지 않은 서비스가 확인됨

 

생성한 서비스와 연동되지 않은 Pod 생성

apiVersion: v1
kind: Pod
metadata:
  name: request-pod
spec:
  containers:
  - name: container
    image: kubetm/init

생성된 Pod 확인

 

 

master 노드에서 콘솔을 이용해 해당 Pod(Request-pod)로 진입

kubectl exec "pod name" -it /bin/bash

 

nslookup으로 서비스와 파드의 DNS 확인

 

curl로 Pod의 호스트명에 접근

 


3. label, Selector를 이용한 EndPoint 자동 생성

서비스 생성

apiVersion: v1
kind: Service
metadata:
  name: endpoint1
spec:
  selector:
    svc: endpoint
  ports:
  - port: 8080

해당 서비스와 label - Selector로 연동되는 Pod 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod7
  labels:
    svc: endpoint
spec:
  containers:
  - name: container
    image: kubetm/app

생성된 서비스 및 파드 확인

 

서비스의 엔드포인트 확인

kubectl describe endpoints "Object Name"

해당 Pod의 주소와 포트 번호가 출력됨

    -> 결국 서비스를 생성하면 쿠버네티스에서 Label, Selector를 이용하여 자동적으로 EndPoint를 생성


4. 사용자 지정 EndPoint 생성

서비스 생성

3번 실습과 다르게 Selecor를 지정하지 않음

apiVersion: v1
kind: Service
metadata:
  name: endpoint2
spec:
  ports:
  - port: 8080

파드 생성

3번 실습과 다르게 Label지정 X

apiVersion: v1
kind: Pod
metadata:
  name: pod9
spec:
  containers:
  - name: container
    image: kubetm/app

생성된 서비스 및 파드 확인

연결된 파드가 존재하지 않음

 

서비스의 EndPoint확인

아무런 연결도 존재하지 않음

 

엔드포인트 생성

서비스 명과 파드의 IP로 지정하여 생성해야함

apiVersion: v1
kind: Endpoints
metadata:
  name: "Service Name"
subsets:
 - addresses:
   - ip: "Pod IP Address"
   ports:
   - port: 8080

 

생성한 EndPoint확인

서비스를 확인하면 연결된 파드가 확인됨

* 단, 이전 Label, Selector를 이용하여 만든 것과는 다르게 Pod 목록에 표시 되지는 않음


5. EndPoint에 외부주소 기입

 

서비스 생성

apiVersion: v1
kind: Service
metadata:
  name: endpoint3
spec:
  ports:
  - port: 80

 

생성된 서비스 확인

 

github의 IP 주소 확인

해당 주소들 중 한개를 골라서 사용

 

github접근 확인

github 레포지토리에 접근하여 파일 다운로드

curl -O "github IP address":80/"dir Path"/"file name"

 

EndPoint 생성

apiVersion: v1
kind: Endpoints
metadata:
  name: endpoint3
subsets:
 - addresses:
   - ip: 185.199.110.153
   ports:
   - port: 80

 

위의 파일 다운로드를 endpoint를 이용하여 접근

    -> github의 주소를 몰라도 접근 가능

curl -O "endpoint name"/"dir Path"/"file name"

6. External Name 실습

external name을 type으로 가지는 서비스 생성

apiVersion: v1
kind: Service
metadata:
 name: externalname1
spec:
 type: ExternalName
 externalName: github.github.io

 

external name을 이용하여 접근

curl -O "external name"/"dir Path"/"file name"

* 만약 IP주소가 변경된다면 해당 external name을 수정하면 됨

    -> Pod 재배포 X

댓글