Kubernetes - Service

Sungjin·2022년 2월 28일
1

Kubernetes

목록 보기
4/11
post-thumbnail

Service - Cluster IP, NodePort, Load Balancer


이 글은 김태민님의 대세는 쿠버네티스 강의를 참고하여 정리하였습니다!

출처 : https://www.inflearn.com/course/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EA%B8%B0%EC%B4%88/dashboard


🔍 테스트 해볼 내용

Service Object의 Option에 대해서 배워 볼게요!
1. Cluster Ip 구성
2. NodePort 구성
3. Load Balancer 구성

도커 이미지는 김태민님께서 만들어두신 이미지를 사용합니다.


🚀 Service

먼저 Pod만을 사용하지 않고 Service를 사용하는 이유를 알아 봅시다.

Pod라는 것은 Kubernetes환경에서 다양한 요인으로 인해 언제든지 고장날 수 있습니다.

그러면 추후에 알아볼 Controller등에 의해서 Pod를 재생성하게 되는데요.

재생성된 PodIp의 할당이 달라지게 됩니다. 즉, 신뢰성이 떨어지게 되는 것이죠.

그에 반해서 Service는 사용자가 직접 삭제하지 않는 한 지워지지 않습니다.

그러므로, Service와 함께 구성된 Pod는 더욱 신뢰성을 가지며, 클라이언트는 Service로 접근하여 Pod에 접근 가능하도록 만들어줍니다.

지금부터, 실습해볼 것들은 외부또는 클러스터 내에서 클라이언트들이 Service Object에 접근 가능하도록하는 Option에 대해서 배워봅시다!


🚀 Cluster IP

이름에서도 보이다시피, 외부에서는 접근 불가하고 Cluster내에서만 접근 가능한 Object입니다.

Pod를 여러 개 연결 시킬 수 있으며, 여러 개의 Pod를 연결 했을 때, 서비스가 Traffic을 분산 시켜서 Pod에 전달하게 됩니다.

이제, Pod와 Service를 만들어 작동시켜 봅시다!

Pod1.yaml

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

Service1.yaml

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

kubectl create -f ./pod1.yaml

kubectl apply -f ./pod1.yaml

kubectl create -f ./service1.yaml

kubectl apply -f ./service1.yaml

이제 pod와 service가 잘 생성되었는지 확인해 봅시다.

kubectl get nodes -o wide

kubectl get services -o wide

현재 pod의 IP와 service의 IP를 잘 기억해 놓읍시다.

이제 cluster에 접근하여 service와 pod가 잘 연결되어 있는지 확인 하여 봅시다!

👍 curl명령어를 통하여 service의 IP로 접근하면 pod의 hostname이 출력되게 끔 하였습니다.

minikube ssh

curl 10.99.234.249:9000/hostname

이렇게 Cluster IP에 관한 실습은 마치겠습니다.


🚀 Node Port

Option에서도 기본적으로 Cluster IP가 할당 됩니다.

하지만 차이점은 Cluster IPPod들과 Service의 연결이었다면, 이 Option에서는 Node단위로 Service와의 연결이라는 점입니다.

Kubernetes 클러스터에 연결되어있는 모든 Node에 똑같은 Port가 할당되어서 해당 Node , 해당 Port로 접속하게 되면, Service로 접근이 되고, Service는 자신에게 연결되어 있는 Pod에게 Traffic을 전달하는 방법입니다.

즉, Service는 어떤 노드에게 온 Traffic이든 상관 없이 Pod들에게 Traffic을 전달할 수 있게 되는 것입니다.

이제 직접 실습을해 보도록 합시다!

Pod는 기존 생성된 것을 사용하겠습니다.

Service2.yaml

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로 설정되어 있으면, 접근한 Node의 Pod에만 Traffic을 전달하게 됩니다.

kubectl create -f ./service2.yaml

kubectl apply -f ./service2.yaml

svc-2가 생성된 것을 확인할 수 있습니다!

여기서 9000번 포트는 ClusterIP 를 의미하고 30000번 포트는 NodePort입니다.

이제 해당 node의 IP를 알아보도록 합시다.

kubectl get node -o wide

먼저 클러스터 내로 접근하여 node로 접근해보도록 합시다!

minikube ssh

curl {clusterIP}:9000/hostname

curl {nodeIP}:30000/hostname

기본적인 Cluster IP와 Node Port둘 다 잘 접근되는 것을 볼 수 있습니다!

이렇게 NodePort에 관한 실습은 마치겠습니다.


🚀 Load Balancer

NodePort의 성격을 그대로 가집니다.
각각의 NodeTraffic을 분산시켜주는 역할을 하며, Load Balancer에 접근하는 외부 접속 IP는 별도로 할당합니다.

실제 운영환경에서는, NodePort가 아닌 Load Balancer를 사용해야합니다. 그러한 이유는 Node의 직접적인 IP를 노출하게 되면 보안 상 위험이 생길 수 있기 때문입니다!

Load Balancer는 실습을 하기 위해서는 추가 모듈이 따로 필요하다고 합니다.

실습은 따로 진행하지는 않도록 하겠습니다.


이상으로 마치겠습니다. 🙋🏻‍♂️

profile
WEB STUDY & etc.. HELLO!

1개의 댓글

comment-user-thumbnail
2022년 3월 2일

👍👍

답글 달기