Kubernetes - Object:Service
Devops/Kubernetes

Kubernetes - Object:Service

뉴비뉴 2020. 4. 27.

Service 실습

Pod 가 죽고 다시 살아나면 IP가 변경된다.

그래서 Pod에 Service를 달아두고 Service IP로 접근하게 된다.

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

Service(Type, ClusterIP) 생성

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

Service도 3개의 타입으로 나뉘는데 아무것도 입력하지 않으면 Cluster 타입으로 생성된다.

클러스터 타입이란, 클러스터 내에서만 접근이 가능하다. 그 말은 즉슨 외부에서는 접근이 불가능하다는 것이고,

관리자가 모니터링을 할 서버에 적합한 타입이다.

 

Service의 Port로 접속 시 targetPort 로 연결된다.

Service IP의 포트로 접근하여 /hostname을 찍어보면 Pod-1 이 찍히게 된다.

 

Service(Type, NodePort) 생성

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

NodePort는 30000번으로 지정해두었고, 노드로 접근을 했을 때 사용할 수 있는 포트이다.

현재 Node는 2개의 서버를 생성해두었고, Node1(127.0.0.2) Node2(127.0.0.3) 이라고 가정하겠습니다.

Pod를 두 개 생성하고, NodePort로 연결한 다음 Service IP로 요청하게 되면 Service 내에 2개의 Pod에 알아서 분배되어 요청이 나눠지게 됩니다.

ex) curl 127.0.0.2:30000 요청을 계속보내면 Pod-1로도 갔다가 Pod-2로도 요청이 전송되는데

 

하지만 externalTrafficPolicy: Local 을 설정하게 된다면 2번 Node IP로 요청을 보내면 2번으로 계속 전송된다.

만약 Node-1 에 있는 Pod-1 이 삭제되었고, Node-1에 요청을 보낸다면 요청이 가지않는다.

이 부분을 주의해야한다.

 

내부망에서 테스트연결용이나 데모나 임시연결용으로 쓰인다.

임시연결용이란 출시하기전에 실제 테스트해보기 위해 Node를 오픈시켜보는? 것 정도로 생각해보면 될 것 같다.

 

구글링 설명

NodePort 타입의 서비스는 기본적으로 CLusterIP 타입과 동일하지만 몇가지 기능들을 더 가지고 있습니다. NodePort 타입 서비스는 노드 네트워크의 IP를 통하여 접근을 할 수 있을 뿐만 아니라 ClusterIP로도 접근이 가능합니다.

이것이 가능한 이유는 쿠버네티스가 NodePort 타입의 서비스를 생성하면 kube-proxy가 각 노드의 eth0 네트워크 interface에 30000~32767 포트 사이의 임의의 포트를 할당합니다.

 

그리고 할당 된 포트로 요청이 오게되면 이것을 매핑된 CLusterIP로 전달합니다. 

Service(Type, Load Balancer) 생성

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

생성해도 정상적으로 작동이 안되는 이유는 외부 아이피(공인 IP)를 할당해주는 플러그인이 없기 때문이다.

하지만 난 GCP를 사용하였고 정상적으로 생성되었다 그 이유는 AWS, GCP에서는 지원 플러그인이 있기 때문이다.

 

구글링 설명

NodePort 기능을 더하여 로드 밸런서를 통한 접근까지 완벽하게 해결하는 기능을 가집니다.

이것은 GCP나 AWS와 같이 API를 통하여 로드 밸런서를 생성할 수 있는 클라우드 환경을 사용한다는 것을 가정합니다.

'Devops > Kubernetes' 카테고리의 다른 글

Kubernetes - Object:ConfigMap, Secret  (0) 2020.05.08
Kubernetes 세미나  (0) 2020.04.29
Kubernetes - Object:Volume  (0) 2020.04.27
Kubernetes - Object  (0) 2020.04.27
Kubernetes - 배경, 개념, 장점  (0) 2020.04.23

댓글

💲 추천 글