Kubernetes - Service

현시기얌·2022년 1월 10일
0

Kubernetes

목록 보기
2/23

Service

Service는 기본적으로 자신의 ClusterIP를 가지고 있다. 그리고 이 Service를 Pod에 연결시켜 놓으면 Service의 Ip를 통해서 Pod에 접근할 수 있다.
Pod에도 똑같은 Cluster내에서 접근할 수 있는 IP가 있는데 굳이 Service를 달아서 접근할까?

Pod는 시스템 장애, 성능 장애 든 언제든 죽고 다시 생성될 수 있는 Object이다. 그런 Pod의 Ip는 재생성되면 변하기 때문에 Pod의 IP는 신뢰성이 떨어진다.
하지만 Service의 IP는 사용자가 직접 삭제하지 않는한 삭제되거나 재생성되지 않는다.
따라서 Service의 IP로 접근하면 항상 연결되어있는 Pod에 접근할 수 있다.

Service는 여러종류가 있고 그 종류에 따라 Pod에 접근하는 방법이 다르다.

ClusterIp

가장 기본적인 Service는 ClusterIP방식이다.
이 Ip는 쿠버네티스 클러스터 내에서만 접근 가능하다.
따라서 외부에서는 접근할 수 없다.
그리고 Pod를 여러개 연결시킬 수 있다. 이렇게 여러개 Pod를 연결하면 Service가 트래픽을 분산시켜 Pod에 전달한다.

apiVersion: v1
kind: Service
metadata:
  name: service-1
spec:
  type: ClusterIP
  selector:
    app: pod
  ports:
    - port: 9000
      targetPort: 8080
apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  labels:
    app: pod
spec:
  containers:
    - name: container
      image: nginx:1.14
      ports:
        - containerPort: 8080

Service의 Type은 생략이 가능하고 생략시 default값은 ClusterIP다.
Service의 9000포트로 들어오면 타겟이 되면 Pod의 8080 포트로 연결된다.

ClusterIP는 외부에서 접근할 수 없고 클러스터 내에서만 사용하는 IP이므로 이 IP에 접근할 수 있는 대상은 Cluster 내부에 접근 가능한 Admin같은 인가된 사용자만 사용이 가능하다.

주된 작업은 쿠버네티스 대쉬보드를 관리하거나 각 Pod의 상태를 디버깅할 때 사용한다.

NodePort

NodePort타입으로 만들어도 Service에는 기본적으로 ClusterIP가 할당되어서 ClusterIP처럼 똑같이 사용할 수 있다.

또한 쿠버네티스 클러스터에 연결되어 있는 모든 Node한테 똑같은 포트가 할당되어서 외부로부터 어느 노드던 간에 그 IP의 포트로 접속을 하면 이 Service로 연결된다.

그리고 이 Service는 자신에게 연결되어 있는 Pod에게 트래픽을 전달한다.

Pod에 있는 Node에만 포트가 할당되는 것이 아니라 모든 노드에게 포트가 만들어지는 것이 특징이다.

apiVersion: v1
kind: Service
metadata:
  name: service-2
spec:
  type: NodePort
  selector:
    app: pod
  ports:
    - port: 9000
      targetPort: 8080
      nodePort: 30000

각 노드에 Pod에 하나씩 올라가져있으면 Node1에 IP를 접근하더라도 Service는 Node2에 있는 Pod에게 트래픽을 전달할 수 있다.

Service는 어떤 노드에게 온 트래픽인지 상관하지 않고 자신에게 달려있는 Pod들에게 트래픽을 전달해주기 때문이다.

그런데 만약 externalTrafficPolicy:Local 이라고 주면 특정 노드 포트에 IP로 접근을 하는 트래픽은 Service가 해당 노드 위에 올려져 있는 Pod에게만 트래픽을 전달해준다.

NodePort는 특징이 물리적인 Host에 IP를 통해서 Pod에 접근을 할 수 있다는 건데 주로 HostIP는 보안적으로 내부망에서만 접근할 수 있게 네트워크를 구성하기 때문에 Cluster 밖에는 있지만 내부망안에서 접근을 해야할 때 사용한다.
그리고 일시적인 외부 연동용으로 사용한다.

LoadBalancer

LoadBalancer 타입으로 Service를 만들면
NodePort의 성격을 그대로 가지고 있다.

추가적으로 LoadBalancer가 생겨서 각각의 Node에 트래픽을 분산시켜준다.

하지만 LoadBalancer에 접근하기 위한 IP주소는 외부접속 IP 주소를 할당해주는 별도의 플러그인이 설치되어 있어야 사용가능하다.

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

실제적으로 외부에 Service를 노출시킬려면 Loadbalancer를 사용해야한다.

그래야 내부 IP를 노출시키지 않고 외부 IP를 통해 안정적을 Service를 노출시킬 수 있다.

profile
현시깁니다

0개의 댓글