쿠버네티스 - Deployment와 Service

업데이트:

Deployment로 Pod 배포하기

Deployment로 Pod를 생성하고, 해당 Pod의 image, env, port 등 스펙을 정의할 수 있다.
또한, Replica 수를 정의해 HA를 위한 Pod의 개수를 관리할 수 있다.
만들어보자.

deployment 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
vi nginx-deploy.yaml

apiVersion: apps/v1
kind: Deployment      # deployment > replicaset > pod
metadata:
  name: nginx-deployment       # deployment's name
  labels:
    app: nginx                 # resource에 label을 달 수 있음.
spec:                 # deployment의 spec 정의
  replicas: 3         # 3개의 레플리카 파드 생성
  selector:           # 디플로이먼트가 관리할 파드를 찾는 방법.
    matchLabels:      # pod 중 app=nginx 라벨을 가진 파드를 선택
      app: nginx
  template:                    # 생성되는 pod들의 meta, spec을 정의
    metadata:
      labels:
        app: nginx             # pod에 app=nginx 라벨을 붙임
    spec:
      containers:              # 컨테이너 하나 생성
      - name: nginx            # name 필드의 값 nginx
        image: nginx:latest    # 최신 nginx 이미지 사용
        ports:
        - containerPort: 80    # 컨테이너 포트 지정

클러스터에 deployment 적용

클러스터에 해당 deploy를 적용한다.

1
kubectl apply -f nginx-deploy.yaml

pod, deploy 생성 확인하기

deploy가 생성되고, deploy에 정의한 spec에 따라 pod가 3개 생성되었을 것이다.

1
2
kubectl get pods -A  
kubectl get deploy -A  

Service로 서비스에 접근 가능하게 하기

Pod만 생성한 경우, 해당 노드 local에서 접근 가능한 상태가 완성된 것이다.
외부에서 접근 가능하도록 Service로 해당 Pod들을 묶을 수 있다.
이전 장에서 30000~32767 port를 NodePort Service로 0.0.0.0/0 Inbound 포트를 허용했는데 지금 활용한다.

service 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vi nginx-service.yaml

apiVersion: v1
kind: Service         # Service 정의
metadata:                      # 해당 Service의 metadata 설정
  name: mynginxservice         # 서비스 이름 mynginxservice
spec:
  type: NodePort      # ClusterIP, LoadBalancer, NodePort가 있음. (추후 Ingress도 다룰 예정)
  ports:
  - port: 8080        # pod ip:port
    targetPort: 80    # app ip:targetPort
    protocol: TCP     # 
    name: http        # 
  selector:
    app: nginx        # nginx pod들을 service로 묶음

apply

1
kubectl apply -f nginx-service.yaml

service 생성 확인하기

1
kubectl get service -A

실제 nginx service에 접근해보기

위 yaml대로 apply한 경우, NodePort 포트는 30000~32767 사이의 무작위 수가 설정되어 있을 것이다.
service 생성 명령어로 port를 확인하고, 아무 Worker 노드에서 {worker public ip}:{node port} 접근하면 nginx 서비스가 호출될 것이다.

pod가 어디 생성되어있을지도 모르고, 이렇게 하면 해당 Node에 있는 Pod만 호출되는게 아닌가? 라는 생각을 했다.
이는 CoreDNS라고 하는 쿠버네티스의 기능이, Service를 호출하면 CoreDNS 기능이 알아서 밸런싱해 각 노드의 Pod를 알아서 호출해준다고 한다.

댓글남기기