티스토리 뷰

https://subicura.com/k8s/guide/service.html

 

Service

Service(서비스)를 이용하여 Pod을 노출하고 클러스터 외부에서 접근할 수 있는 방법을 알아봅니다.

subicura.com

 

 

  • 모든 Pod 들은 고유의 ip 를 갖고있다
  • 하지만 Pod들은 deployment와 relicaSet에 의해 사라지기도 하기 때문에 Pod 과 직접 소통하는 것은 권장되지 않는다
  • 따라서 별도의 고정된 IP를 갖는 서비스를 만들고 그 서비스를 통해 pod 에 접근한다

 

ClusterIP 서비스

ClusterIP는 클러스터 내부에 새로운 IP를 할당하고 여러 개의 Pod을 바라보는 로드밸런서 기능을 제공한다.

그리고 서비스 이름을 내부 도메인 서버에 등록하여 Pod 간에 서비스 이름으로 통신할 수 있다.

 

counter-redis-svc.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
spec:
  selector:
    matchLabels:
      app: counter
      tier: db
  template:
    metadata:
      labels:
        app: counter
        tier: db
    spec:
      containers:
        - name: redis
          image: redis
          ports:
            - containerPort: 6379
              protocol: TCP

---
apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  ports:
    - port: 6379
      protocol: TCP
  selector: # deployment 의 라벨과 동일하다 
    app: counter 
    tier: db

 

Deployment와 Service를 하나씩 만든다.

Deployment 는 app=counter, tier=db 레이블을 찾고 없다면 template 에 정의된 스펙에 따라 만들어낸다.

 

Serviceselector 를 보면 deployment 의 라벨과 동일하다.

이렇게 되면 이 서비스는 해당 pod을 가르키게 된다.

 

service/redis 의 포트 6379로 들어오면 pod/redis의 포트 6379로 연결.

 

apply

 

yml 파일을 apply 한 결과다.

redis 서비스가 생성됐고, deployment 도 생성됐다 (이에따라 pod,rs 도 생성됨)

 

redis의 포트는 6379다.

 

 

현재 service/redispod/redis-77b9988d97-7dgb9 가 생성된 그림이다.

 

  • 같은 클러스터에서 생성된 pod 이라면 'redis' 라는 도메인으로 redis pod 에 접근 할 수 있다 (서비스가 자동 등록)

 

서비스에 접근 

위에서 만든 redis 서비스에 접근할 counter 앱을 deployment 로 만든다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: counter
spec:
  selector:
    matchLabels:
      app: counter
      tier: app
  template:
    metadata:
      labels:
        app: counter
        tier: app
    spec:
      containers:
        - name: counter
          image: ghcr.io/subicura/counter:latest
          env:
            - name: REDIS_HOST
              value: "redis"
            - name: REDIS_PORT
              value: "6379"

 

env 를 보면 환경변수로 REDIS_HOST, REDIS_PORT 를 준다.

같은 클러스터 내에서 redis 라는 도메인으로 접근가능하기 때문이다.

 

 

ssh 로 접속 하고,

redis 도메인 6379 포트로 연결하면 연결이 가능하다.

 

Endpoint

Endpoint 는 서비스의 접속 정보를 갖고 있다.

kubectl get endpoints

 

현재 service/redis 의 Endpoint 는 10.244.0.37 인데 이게 뭘 의미하는 걸까?

 

 

redis pod 의 IP 주소는 10.244.0.37 이다.

즉 redis 서비스가 redis pod 를 가르키고 있는 것.

 


NodePort 서비스

ClusterIP 는 클러스터 내부에서만 접근 할 수 있다.

NodePort는 클러스터 외부에서 접근할수 있다.

 

counter-nodepart.yml

apiVersion: v1
kind: Service
metadata:
  name: counter-np
spec:
  type: NodePort # type 없으면 디폴트 ClusterIP
  ports:
    - port: 3000 # 3000번 포트로 접속
      protocol: TCP
      nodePort: 31000 # 노드에 오픈되는 포트 
  selector: # pod의 레이블 지정
    app: counter
    tier: app

 

이 서비스는 pod 에 3000번 포트로 접속한다.

각 노드는 31000 포트를 오픈해서 접속할수 있게 한다.

 

apply

 

counter-np NodePort 가 생성됐다.

 

 

minikube ip

 

클러스터의 ip 는 172.30.11.131 이다.

그리고 31000 포트를 오픈했으므로 웹브라우저에서 '172.30.11.131:31000' 로 접근해보자.

 

 

이렇게 웹브라우저, 즉 클러스터 외부에서 접근 가능하다!

 


 

  • service/counter-np NodePort가 31000포트를 열고 있다
  • NodePort 로 접근하면 노드 내부의 ClusterIP를 거쳐서 pod 에 접근한다
  • (service 의 CLUSTER-IP 는 서비스끼리 통신을 위한 ip로 외부에서 접근할때 사용하는 IP 가 아니다, 외부에서 접근할때는 노드의 ip 와 포트번호로 접근한다) 

 

여러개의 노드

 

  • NodePort는 ClusterIP의 기능을 기본으로 포함한다
  • NodePort 는 클러스터의 모든 노드에 포트를 오픈한다 
    • 여러 개의 노드가 있다면 아무 노드로 접근해도 지정한 pod 로 접근할수 있다 

LoadBalancer 서비스

NodePort의 단점

  • 노드가 사라졌을때 자동으로 다른 노드를 통해 접근이 불가능하다
  • 예를들어 3개의 노드가 있다면 3개 중 아무 노드로 접근해도 NodePort로 접근 가능하지만 해당 노드가 죽어있을 수도 있다

로드 밸런서는 이런 문제를 해결한다.

브라우저는 NodePort 에 직접 요청하지 않고 로드 밸런서에 요청을 보내고, 로드 밸런서가 알아서 살아 있는 노드에 접근한다.

 

counter-lb.yml

apiVersion: v1
kind: Service
metadata:
  name: counter-lb
spec:
  type: LoadBalancer # 로드밸런서 
  ports:
    - port: 30000
      targetPort: 3000
      protocol: TCP
  selector:
    app: counter
    tier: app

 

 

apply

 

<pending> (보류중) 이라고 나와있다.

로드밸런서는 AWS 같은 클라우드 환경이 아니면 사용이 제한적이고 현재 AWS 같은 외부 클라우드의 IP가 존재하지 않기 때문이다.

 

metallb 애드온으로 가상환경을 만들어 줄 수 있다.

(참고: https://subicura.com/k8s/guide/service.html#service-loadbalancer-%E1%84%86%E1%85%A1%E1%86%AB%E1%84%83%E1%85%B3%E1%86%AF%E1%84%80%E1%85%B5)

 

 

 

 

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

minikube addons enable ingress 시 MK_ADDON_ENABLE 에러  (0) 2024.01.08
Kubernetes로 배포하기, yml 정리  (0) 2024.01.06
Kubernetes Deployment  (0) 2024.01.06
Kubernetes ReplicaSet  (0) 2024.01.05
Kubernetes Pod  (0) 2024.01.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함