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

[k8s] 5. Service - 실습

by Lauren X Ming 2021. 2. 3.

Service 실습

  • 하드에 서비스를 달면 하드가 죽어서 재생성돼도 서비스의 IP로 접근 가능
  • 여기서 진행

1. ClusterIP

Pod 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  labels:
     app: pod
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1
  containers:
  - name: container
    image: kubetm/app
    ports:
    - containerPort: 8080

ClusterIP 생성

apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080
  • 맨 밑에 type: ClusterIP 넣어도 되는데 안 넣어도 자동으로 ClusterIP 지정
  • 이 서비스의 9000번 포트로 접근하면 타겟으로 8080 포트로 연결을 함

ClusterIP로 접속

  • 클러스터아이피가 10.96.179.229네요

  • 마스터에서 curl로 아이피를 호출하는 건 쿠버네티스 내에서 접속하는 것
  • curl 10.96.179.229:9000/hostname은 pod-1의 호스트네임을 찍음
  • pod-1에 호스트네임이라는 path가 들어가면 pod-1의 호스트네임을 찍도록 파드를 생성해서 나옴
  • 외부에서 아이피로 접근하면 접속이 안 됨

강의에서 hostname을 찍도록 파드에서 생성했다고 하는데 이게 머선소리냐면 원래 hostname 필드가 선택필드여서 설정을 안 하면 metadata의 name 필드가 나옴. 그런데 hostname을 metadata의 name필드와 다르게 설정하면 hostname 설정 값이 나옴. 위 예시 파드는 hostname 필드를 설정 안 해서 metadata pod-1이 hostname path로 찍으니 나왔던 것

Pod 삭제 후 다시 생성

  • 기존 파드 삭제 후 똑같은 yaml으로 파드 생성
  • 서비스의 셀렉터가 알아서 연결을 만들어줘서 pod-1과 연결됨
  • pod-1의 아이피가 변경돼도 서비스의 아이피로 그대로 연결가능

2. NodePort

NodePort 생성

apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080
    nodePort: 30000
  type: NodePort
  • ClusterIP로 만든 서비스 svc-1은 삭제

  • 내부 엔드포인트
    • svc-2:9000 TCP --> 클러스터 아이피로 접근할 때 사용하는 포트
    • svc-2:30000 TCP --> 노드로 접근할 때 사용하는 포트

노드로 접속

  • node1 아이피(31), node2 아이피(32)로 각각 30000포트로 접속하여 pod-1의 호스트네임을 출력하게 하니 되네!

Pod하나 더 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod-2
  labels:
     app: pod
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node2
  containers:
  - name: container
    image: kubetm/app
    ports:
    - containerPort: 8080
  • 이름은 pod-2, node2에 생성

  • pod-1, pod-2 둘 다 NodePort 서비스에 연결됨

노드로 접속

  • 트래픽이 분산돼서 가네

externalTrafficPolicy 확인

apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080
    nodePort: 30000
  type: NodePort
  externalTrafficPolicy: Local
  • 기존의 서비스를 지우고 새로 서비스 생성
  • externalTrafficPolicy: Local가 추가됨

노드로 접속

  • 노드1에 있는 파드, 노드2에 있는 파드의 호스트네임만 출력됨

pod-1을 삭제하고 노드1로 접속하기

  • 접근이 안 됨

3. Load Balancer

Load Balancer 생성

apiVersion: v1
kind: Service
metadata:
  name: svc-3
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080
  type: LoadBalancer

생성이 안 됨

  • 마스터노드에서 kubectl get service svc-3로 상태 확인
  • Load Balancer의 EXTERNAL-IP는 AWS, AZURE 등의 플러그인이 있어야 할당이 됨
  • 쿠버네티스는 EXTERNAL-IP를 할당해주지 않음

출처

인프런 대세는 쿠버네티스 강의

'네트워크 > k8s' 카테고리의 다른 글

[k8s] 7. Volume - 실습  (0) 2021.02.07
[k8s] 6. Volume - emptyDir, hostPath, PV/PVC  (0) 2021.02.04
[k8s] 4. Service - ClusterIP, NodePort, LoadBalancer  (0) 2021.02.01
[k8s] 3. Pod - 실습  (0) 2021.01.31
[k8s] 2. 쿠버네티스 설치  (1) 2021.01.31