본문 바로가기
네트워크/k8s

[k8s] 25. Service - 실습

by Lauren X Ming 2021. 2. 19.

파드가 다른 서비스에 접근하기 위한 방법을 알아보자

1. DNS

image

Service

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

Request Pod

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

실습 과정

  1. Service 생성
  2. Pod 생성 --> 위 서비스와 연결됨
  3. Request Pod 생성
  4. request-pod에 들어가서 다른 파드에 request를 날릴 예정
  5. 마스터 노드에서 다음 명령어로 request-pod에 들어가기
    kubectl exec request-pod -it /bin/bash
  6. 들어간 파드 쉘에서 DNS로 서비스 이름, FQDN으로 아이피 조회 --> nslookup
    nslookup clusterip1
    nslookup clusterip1.default.svc.cluster.local
    image
  7. 파드 쉘에서 서비스의 도메인 호출로 파드 호스트네임 알아내기
    curl clusterip1/hostname
    curl clusterip1.default.svc.cluster.local/hostname
    image
    서비스에 들어간 트래픽은 파드로 가니까 파드의 호스트네임이 호출되는거

2. Headless

image

Service

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

Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod4
  labels:
    svc: headless
spec:
  hostname: pod-a
  subdomain: headless1
  containers:
  - name: container
    image: kubetm/app
  • hostname: pod-a으로 했는데 왜 이런짓 했지
  • subdomain: headless1 --> 위 서비스의 이름

Pod2

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

실습 과정

  1. Service 생성
  2. Pod 생성
  3. Pod2 생성
  4. request-pod 쉘에서 nslookup 질의
    nslookup headless1
    nslookup pod-a.headless1
    nslookup pod-b.headless1
    image
    Headless 서비스는 아이피가 없어서 연결되어 있는 파드의 아이피를 줌

3. Endpoint - 자동생성 확인

image

Service

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

Pod

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

실습 과정

  1. Service 생성
  2. Pod 생성
  3. 마스터 노드에 다음 명령어로 Endpoint가 알아서 만들어졌는지 확인
    kubectl describe endpoints endpoint1
    image
    Endpoint 이름은 서비스 이름과 같고, 아이피는 연결된 파드의 아이피가 나옴

4. Endpoint - 직접 만들기

image

Service

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

Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod9
spec:
  containers:
  - name: container
    image: kubetm/app
  • 서비스, 파드 둘 다 라벨이 없음

Endpoint

apiVersion: v1
kind: Endpoints
metadata:
  name: endpoint2
subsets:
 - addresses:
   - ip: 20.111.156.73
   ports:
   - port: 8080
  • 아이피 주소에는 pod9 아이피 주소 넣기

실습 과정

  1. Service 생성
  2. Pod 생성
  3. Endpoint 생성 --> 대시보드 서비스에 Endpoint가 들어가짐
  4. request-podd 쉘에서 에서 다음 명령어로 Endpoint 연결 확인
    curl endpoint2:8080/hostname
    image

4. Endpoint - 직접 만들고 외부 연결

image

Service

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

Endpoint

apiVersion: v1
kind: Endpoints
metadata:
  name: endpoint3
subsets:
 - addresses:
   - ip: 185.199.110.153
   ports:
   - port: 80
  • ip는 github ip 주소 다음 명령어로 알아내서 입력

    nslookup https://www.github.com

    image

  • 자료파일 다운로드 확인

    curl -O 185.199.110.153:80/kubetm/kubetm.github.io/blob/master/sample/practice/intermediate/service-sample.md

실습 과정

  1. 서비스 생성
  2. Endpoint 생성
  3. request-pod 쉘에서 Endpoint 호출해서 자료 다운로드 받기
    curl -O endpoint3/kubetm/kubetm.github.io/blob/master/sample/practice/intermediate/service-sample.md
    image

5. ExternalName

image

Service

apiVersion: v1
kind: Service
metadata:
 name: externalname1
spec:
 type: ExternalName
 externalName: github.github.io
  • externalName에 외부 도메인을 넣으면 됨

실습 과정

  1. request-pod 쉘에서 externalName 서비스 호출
    curl -O externalname1/kubetm/kubetm.github.io/blob/master/sample/practice/intermediate/service-sample.md
    image
    이제, 파드에서 외부 도메인을 바꾸고 싶으면 서비스의 externalName 도메인 값만 바꿔주면 됨
    image

출처

인프런 - 대세는 쿠버네티스