매직코드
article thumbnail

쿠버네티스 안내서와 패스트캠퍼스 강의를 보고 작성한 포스팅입니다.

 

Pod는 자체 IP를 가지고있고 클러스터 내부에서는 Pod IP를 통해 통신하고 접근할 수 있지만 두가지 단점이 있다.

첫번째로는 Pod가 쉽게 사라지고 생성되는 특징 때문에 직접 통신하고자 하는 Pod를 찾이 어렵다.

두번째로는 클러스터 외부에서 Pod에 접근할 수 없다는 점이다.

쿠버네티스는 Pod과 직접 통신하는 방법 대신 별도의 고정된 IP를 가진 "서비스"를 만들고 이 서비스를 통해 Pod에 접근하는 방식을 사용한다.

 

 

서비스는 노출 범위에 따라 CluterIP, NodePort, LoadBalancer 이렇게 3가지로 구분할 수 있다.

서비스 생성에 앞서서 디플로이먼트가 있어야하기 때문에 이전에 만들어두었던 파일을 통해 서비스 만들기를 실습해보자.

# 1. 도커 실행
# 2. 미니큐브 시작
minikube start
cd Desktop/kube

# 3. Deployment 설정
vi deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        
# 4. Deployment 생성
kubectl apply -f deployment.yml

 

서비스가 있어야 하는 이유를 직접 확인해보자면 pod ip를 통해 접근을 시도해보면 된다.

호스트는 접근 권한이 없다고 나오거나 접근시도를 무한반복 할것이다.(Request timeout for icmp_seq 0,1,2...)

ctrl+c로 빠져나올 수 있다.

# pod ip 확인
kubectl get pod -o wide

# pod ip로 접근
ping ip번호

Service - NodePort 만들기

생성된 디플로이먼트와 매칭시켜서 사용할 수 있는 서비스를 만들어보자

 

 

# 서비스 설정 파일 생성
vi service.yml

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  type: NodePort			# 서비스 종류 설정
  ports:
  - port: 80
    protocol: TCP
  selector:				# 아래 레이블을 가진 Pod를 매핑
    app: nginx
    
# 서비스 생성
kubectl apply -f service.yml

# 서비스 상태 확인
kubectl get service

ports: 내부에 nodePort: 를 통해서 노드에 오픈할 Port 번호를 지정해 줄 수 있다.

서비스 상태를 확인해보면 새로 만든 서비스의 type 이 NodePort임을 알 수 있고, Port에 있는 서비스의 포트번호(80:포트번호/TCP)를 통해 접근할 수 있다.

minikube ip

# 접근 : curl 미니큐브ip:포트번호
curl 192.168.64.4:31000

Service - LoadBalancer 만들기

노드포트의 단점은 노드가 사라졌을 때 자동으로 다른 노드를 통해 접근이 불가능하다는 점이다.

자동으로 살아있는 노드에 접근하기 위해 모든 노드를 관리하는 Load Balancer가 필요하다. 브라우저는 NodePort에 직접 요청을 보내는 것이 아니라 Load Balancer에 요청하고 Load Balancer가 알아서 살아있는 노드에 접근하면 노드포트의 단점을 없앨 수 있다.

vi loadbal.yml

apiVersion: v1
kind: Service
metadata:
  name: counter-lb
spec:
  type: LoadBalancer
  ports:
    - port: 30000
      targetPort: 80
      protocol: TCP
  selector:
    app: counter
    tier: app

kubectl apply -f loadbal.yml
kubectl get service

이번에는 브라우저로 연결을 확인해보자

주소창에 ip:포트번호를 통해서 접근할 수 있다.

 


실습

다음 조건에 맞게 service를 만들어보세요

Deployment 이름 echo
Deployment Label app: echo
Deployment 복제수 3
Container 이름 echo
Container 이미지 ghcr.io/subicura/echo:v1
NodePort 이름 echo
NodePort Port 3000
NodePort NodePort 32000
더보기
 
vi quiz-echo.yml

# yaml 파일 작성
apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echo
  template:
    metadata:
      labels:
        app: echo
    spec:
      containers:
        - name: echo
          image: ghcr.io/subicura/echo:v1

---
apiVersion: v1
kind: Service
metadata:
  name: echo
spec:
  type: NodePort
  ports:
    - port: 3000
      protocol: TCP
      nodePort: 32000
  selector:
    app: echo
    
# 생성
kubectl apply -f quiz-echo.yml
kubectl get all

# 연결확인
curl ip번호:port번호

마무리

실습 마무리는 종료 및 삭제

이젠 코드를 안남겨도 어떻게 하는지 알겠지....

모르면 이전 포스팅 참고!

 

 

profile

매직코드

@개발법사

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!