개발 이야기/쿠버네티스

쿠버네티스 - 파드 - 8

석구석구 2021. 7. 4. 19:33
쿠버네티스 실행
apiVersion: v1
kind: ReplicationController
metadata:
  name: suk9
spec:
  replicas: 1
  selector:
    app: suk9
  template:
    metadata:
      name: suk9
      labels:
        app: suk9
    spec:
      containers:
      - name: suk9
        image: seokkyulee/suk9
        ports:
        - containerPort: 8080

우선 first.yaml 파일을 만들고, 이후 터미널을 열어 커맨드를 입력해보자.

minikube start
kubectl apply -f first.yaml

kubectl이 minikube 클러스터를 사용하도록 설정되고, 이전에 만든 이미지(seokkyulee/suk9)를 기반으로 컨테이너를 생성한다.

 

우리는 방금 간단한 명령어로 쿠버네티스에 애플리케이션을 실행했다.

 

그런데 띄워진 컨테이너를 보고 싶지 않은가?

 

그전에 파드라는 개념을 알고가자.

 

- 쿠버네티스는 개별 컨테이너들을 직접 다루지 않는다.

- 함께 배치된 다수의 컨테이너라는 개념을 사용한다.

- 이런 컨테이너 그룹을 파드(Pod)라고 한다.

- 밀접하게 연관된 컨테이너의 그룹으로 같은 워커 노드에서 같은 리눅스 네임스페이스로 함께 실행된다.

- 각 파드는 자체 IP, 호스트 이름, 프로세스 등이 있는 논리적으로 분리된 머신이다.

- 각 파드는 고유한 IP를 가지고, 하나 이상의 컨테이너를 갖는다.

 

쿠버네티스는 개별 컨테이너를 조회할 수 없다. 컨테이너의 그룹(Pod)을 조회해야 한다.

 

컨테이너의 그룹. 파드 Pods
kubectl get pods
kubectl describe pod

 

파드를 조회하고, 파드의 상세정보를 출력해 볼 수 있다.

 

우리가 실행한 쿠버네티스의 내부 동작은 다음과 같다.

1. 도커 허브에 우리 이미지를 푸시했다.

2. kubectl run 명령을 전달했다.

3. kubectl은 쿠버네티스 마스터 노드의 Rest Api를 호출한다.

4. 파드가 생성되고 워커 노드에 스케쥴링된다.

    - 스케쥴링은 특정 시간이 되면 동작을 한다는 의미가 아니라, 파드가 특정 워커 노드에 할당되었다는 것을 의미한다.

5. kubelet에 이러한 내용이 전달되고 도커에 이미지를 실행하라고 지시한다.

6. 도커는 이미지를 풀하고 실행한다.

 

그럼 우리가 만든 컨테이너에 접속을 해보자.

http://localhost:8080

접속이 되지 않는다. (컨테이너에 접속하자고 했지만, 이야기했듯이 쿠버네티스는 컨테이너를 개별로 다루지 않는다. 파드 단위로 다룬다.)

파드는 자체 IP 주소를 가지고 있지만, 이 주소는 클러스터 내부에 있으며 외부에서는 접근이 불가능하다. 외부에서 파드에 접근하도록 하려면 서비스 오브젝트를 통해 노출해야 한다. 일반적인 서비스 오브젝트 역시 내부 클러스터에서만 접근 가능하기 때문에 로드 밸런서 유형의 특별한 서비스를 생성해야 한다. 로드 밸런서 서비스를 생성하면 로드 밸런서의 퍼블릭 IP를 통해 파드에 연결할 수 있다.

 

서비스 오브젝트
kubectl expose rc suk9 --type=LoadBalancer --name suk9-http
kubectl get svc

* rc : replicationController, svc : service의 약자다.

suk9-http라는 서비스가 생성되었고 클러스터 IP와 외부 IP를 볼 수 있다. 하지만 아무리 기다려도 외부 IP는 할당되지 않는다. minikube는 로드밸런서 서비스를 지원하지 않기 때문이다.

minikube service suk9-http

이제 서비스의 외부 IP와 포트를 통해 파드에 요청을 보낼 수 있다.

응답 내용에서 알 수 있듯이 파드 이름을 호스트 이름으로 사용한다는 것을 알 수 있다.

 

짧지만 레플리케이션, 파드, 서비스에 대해 접근하게 되었다. 다음 시간에는 이러한 구조들이 어떻게 돌아가는지 간단하게 살펴보기로 하자.