ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • kubernetes Tutorials 3. Pods 와 Nodes
    DevOps/Kubernetes 2020. 5. 1. 03:13

    학습 목표

     

    1. 쿠버네티스 Pods 가 무엇인지

     

    2. 쿠버네티스 Nodes가 무엇인지

     

    3. 배포한 App에 트러블 슈팅하는 방법

     


    Kubernetes Pods 란?

    앞 시간에 Deployment를 만들었고 쿠버네티스는 Pods를 만들어서 이 App 인스턴스를

     

    호스팅 해주게 된다. 하나 또는 여러 App 컨테이너 그룹을 추상화 한 개념이 이 Pods이다.

     

    도커 같은 컨테이너 뿐 아니라 그런 컨테이너들이 사용하는 리소스들 까지 통틀어서 Pods라는 개념이 되는 것이다.

     

    리소스들에는 Shared storage, 볼륨, 네트워킹, Pods하나 당 IP address, 이미지 버전이나 컨테이너들이 사용하는 포트 등

     

    이 있다.

     

     

    Pods는 App에 특화된 논리적인 호스트를 모델링한 것이다. 따라서 여러 다른 App 컨테이너들을

     

    이 안에 다 담아놓을 수 있다. 예를 들어 하나의 Pod 안에다가 두 개의 컨테이너를 넣을 수 있다.

     

    Node js App을 통한 컨테이너와 node js 웹서버에 보내주는 또 다른 컨테이너 이렇게 2개를 하나의

     

    Pod로 묶어서 그 안에다 넣어 둘 수 있다는 이야기이다.

     

     

    Pod 안에 들어있는 컨테이너들은 IP Address와 port 공간을 공유하며 항상 같이 존재하며 같이 스케쥴링된다.

     

    그리고 같은 노드에서 실행된다.

     

     

    Pod는 쿠버네티스 플랫폼에서 원자적인 단위이다. ( atomic unit ) 하나 죽으면 다 같이 내리게 된다는 뜻

     

    Kubernetes에 Deployment를 만들었을 때 Deployment는 컨테이너를 직접 만드는 게 아닌  컨테이너들을 가진 Pods를

     

    만든다. 그 각각의 pod가 이제 특정 노드에 묶이게 된다. 그 노드 안에서 계속에서 존재하게 된다.

     

    노드가 실패하면 동일한 Pods를 또 다른 클러스터에 있는 다른 노드에 스케쥴링한다.

     

    즉 노드 안에서 컨테이너 단위가 아닌 Pods 단위로 옮겨지게 된다.

     

     

    Pod 1 = 하나의 Pod안에 한 개의 컨테이너가 있을 수 있고 

    Pod 2 = 하나의 Pod안에 하나의 컨테이너와 하나의 볼륨이 있을 수도 있고

    Pod 3 = 하나의 pod 안에 두 개의 컨테이너와 하나의 볼륨이

    Pod 4 = 하나의 Pod 안에 두개의 컨테이너와 세 개의 볼륨이 있을 수도 있다.

     

     

    이 Pod마다 하나의 IP로 묶인다. 

     


     

    Kubernetes Node

     

    Pods는 노드 위에서 실행시킬 수 있다. 노드는 쿠버 네티스에서 워커 머신이라고 했다.

     

    ( * 쿠버네티스의 리소스 타입 2가지 : Mster, Node )

     

     

    각각의 노드는 마스터에 의해서 관리되며 노드는 여러 개의 Pods를 가지고 있다. 노드 안에 Pods라는 단위가

     

    여러 개 올라갈 수 있다. 그리고 쿠버네티스 마스터는 자동으로 그런 Pods들을 어떤 노드에다가 실행할지 스케쥴링한다.

     

    마스터의 자동 스케쥴링은 각 노드의 이용 가능한 리소스들 고려해서 스케쥴링한다. ( Scheduling Strategy? )

     

    도커 스웜의 경우 서비스를 배포할 때 사용하는 여러 가지 전략들이 있었던 것과 비슷한 개념이 아닐까 싶다.( 한 워커당 하나 씩 , 머신을 최대한 쓰는 등)

     

     

    모든 쿠버네티스 노드는 최소한 다음을 실행한다.

     

    - 큐블릿 ( Kubelet )

    : 쿠버네티스 마스터와 노드 간에 커뮤니케이션을 담당, Pods와 컨테이너를 관리 담당한다.

     

    - 컨테이너 런타임 ( like 도커 ) 

    : 레지스트리에서 이미지를 가져와서 unpacking 후 App을 실행시키는 역할

     

     

    다음과 같이 노드 안에는 여러 Pods들이 있고 그림을 보면 하나의 노드가 여러 IP를 가진다는 것을 알 수 있다.

     

    하나의 Pod는 하나의 IP만 가지며 kubelet이 Pod들을 관리한다.

     

     


     

    kubecetl을 통해서 트러블 슈팅을 해보자.

     

    kubectl의 명령들 

     

    kubectl get 

    - 리소스를 가져온다

     

    kubectl describe

    - 어떤 한 리소스에 대한 자세한 정보를 출력한다

     

    kubectl logs

    - Pods안에 들어있는 컨테이너의 로그를 출력한다.

     

    kubectl exec

    - Pod 안에 들어있는 컨테이너에 명령을 실행한다.

     

     

    이러한 명령들을 사용해서 언제 App이 배포되었고, 현재 상태는 어떠한지, 어디서 실행 중인지, 설정 파일들은 어떤지 들

     

    을 참조할 수 있다.

     


     

    앞 서 배포하였던 App이 동작하는지 살펴보자.

     

    현재 존재하는 pod가 있는지 명령어를 통해 확인하였다.

     

    Pods안에 어떤 컨테이너들이 있는지 등을 알아보자

     

    이 Pod의 이름, 어떤 노드에서 이 pod가 돌고 있는지, 현재 상태 이 pod의 IP 즉 pod는 IP하나에 여러 컨테이너들이 IP를

     

    공유하는 상태였으니 이 안에 들어있는 컨테이너 도 전부 이 IP를 쓰는 것을 알 수 있다.  이 안에 컨테이너는 1개 있고

     

    Image 아이디와 port 번호 등도 보인다. 

     

    그리고 Pod안에서 일어났던 이벤트들 역시 볼 수 있다.

     

     

    Pod은 private 하고 ioslated 된 공간이라 프락시를 써서 앞선 시간에 접근해보았다.

     

    kubectl proxy를 써서 8001로 두 번째 터미널에서 열어주자.

     

    Pod를 직접 프락시를 통해 접근하여 Pod name을 출력한 후 동작하고 있는 App을 보기 위해 다음과  같은

    요청을 보내보자.

     

    프락시가 떠있는 8001 에다가

     

    프록시 서버가 지정해주는 URL + Pod name을 주면 우리의 App 내용인 Hello Kubernetes가 찍힌 것을 알 수 있다.

     

     

     

    로그 보기

     

    Pod안에 들어있는 컨테이너들의 로그는 kubectl logs  + Pod name을 통해 가져올 수 있다.

     

    컨테이너가 현재 하나이기 때문에 컨테이너 이름을 줄 필요는 없나 보다.

     

     

    컨테이너 안에 어떤 명령어를 실행하기

     

    Pod가 이미 올라와서 동작하고 있다면 그 안에 돌고 있는 컨테이너에 특정 명령을 실행할 수도 있다.

     

    그렇게 하려면 exec 커맨드를 사용해야 한다.

     

     

    실제 명령어를 실행하는 것은 컨테이너 대상인데 Pod 이름밖에 주지 않았는데 이는 컨테이너가 현재 1개이기

     

    때문에 가능한 일이다.  

     

     

    다음의 명령어로 쉘 스크립트  bash가 생겼다. NodeJs App이 돌고 있는 컨테이너의 콘솔이 생긴 것

     

    컨테이너 안으로 들어온 것이니 컨테이너 안에 있는 파일도 볼 수 있다.

     

     

    cat server.js

    컨테이너 안에 들어온 것이니 로컬 호스트 8080으로 접속할 수 있다. 이 노드 JS App이 해당 포트를 사용해서 돌고 있기

     

    때문이다.

     

     

    https://kubernetes.io/docs/tutorials/kubernetes-basics/explore/explore-interactive/

     

    Interactive Tutorial - Exploring Your App

    To interact with the Terminal, please use the desktop/tablet version Continue to Module 4›

    kubernetes.io

     

Designed by Tistory.