Kubernetes 학습 기록 (2) - Kubernetes

카탈로그
  1. 1. 쿠버네티스 클러스터 설정
    1. 1.1. 미니큐브를 사용해 로컬 단일 노드 쿠버네티스 실행
      1. 1.1.1. 미니큐브 설치
      2. 1.1.2. 미니큐브 시작
      3. 1.1.3. 쿠버네티스 설치
      4. 1.1.4. 클러스터 작동 확인 / kubectl로 명령
      5. 1.1.5. (선택) alias와 kubectl 설정
      6. 1.1.6. 클러스터 노드 목록 확인
  2. 2. 쿠버네티스에서 Node App 실행
    1. 2.1. Node.js App 배포
    2. 2.2. 포드에 관하여…
    3. 2.3. 포드 나열하기
    4. 2.4. 포드 삭제하기
    5. 2.5. 웹 애플리케이션 접근
      1. 2.5.1. 서비스 객체 생성
      2. 2.5.2. 서비스 목록 보기
    6. 2.6. (이슈해결) 쿠버네티스에서 삭제해도, 계속 실행중일시

“Kubernetes in Action” 책으로 학습한 내용입니다.
1장에 이어서… 2장 시작

쿠버네티스 클러스터 설정

1장에서 도커 이미지에 패키지를 만들고 도커 허브를 통해 사용할 수 있게 됬다.
이제 도커에서 직접 실행하는 대신, 쿠버네티스 클러스터에 배포를 하고 실행해보자.

소개하는 3가지 방법

  • 로컬에서 단일 노드 쿠버네티스 클러스터 실행
  • 구글 쿠버네티스 엔진에서 호스트받은 클러스터에서 실행 (추후 작성)
  • kubeadm 툴을 사용해 설치하는 방법 (추후 작성)

미니큐브를 사용해 로컬 단일 노드 쿠버네티스 실행

미니큐브 = 쿠버네티스를 실행하고 로컬에서 어플리케이션을 개발하는데 유용한 도구
여러노드를 관리할 수는 없음, 단일 노드 개발에 특화

미니큐브 설치

OSX, 리눅스, 윈도우 지원 (설치법)

1
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.23.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
결과 화면

미니큐브 시작

1
minikub start

클러스터를 시작하는데 1분 이상 소모되므로, 대기

쿠버네티스 설치

OSX 설치 (리눅스 또는 윈도우는 darwinlinux 또는 windows로 변경)

1
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/

클러스터 작동 확인 / kubectl로 명령

1
kubectl cluster-info
결과 화면

(선택) aliaskubectl 설정

kubectl을 자주 치기 귀찮을 때, 설정법

로컬내에 /root/.bashrc 파일에 alias k='kubectl'을 추가하여 사용
이후 k cluster-info등으로 kubectl을 대체가능하다.

클러스터 노드 목록 확인

1
k get nodes
결과 화면

쿠버네티스에서 Node App 실행

Node.js App 배포

1
k run taeuk-test --image=kangtaeuk/taeuk-test --port=9381 --generator=run-pod/v1

run은 deprecated 된 듯… , 대신 create 또는 --generator=run-pod/v1 삽입
--port=9381은 앱이 포트 9381에서 수신 대기하고 있음을 알려준다

포드에 관하여…

쿠버네티스는 개별 컨테이너는 직접 취급하지 않고, 여러 위치 배치되면 컨테이너 그룹 개념을 사용한다.
이러한 컨테이너 그룹을 pod라고 한다.

포드는 동일한 리눅스 네임스페이스와 동일한 워커 노드에서 항상 함께 실행된다.

각 포드는 애플리케이션을 실행하는 자체 IP, Host, Process 등이 있는 별도 논리적 시스템이다.
(이 부분은 완벽히 이해가 되질 않는군…)

포드 나열하기

1
kubectl get pods
결과 화면

이미지가 다운로드 중이라면, 상태가 PENDING으로 뜸
다운로드 완료시, RUNNIG으로 전환됨

계속 안된다면, k describe pods taeuk-test 실행하여 확인

쿠버네티스에서 컨테이너 이미지 실행과정

포드 삭제하기

1
k delete po 이름

포드를 잘못 만들었을 경우나, 무한 wait시 삭제하고 다시 run

강제 삭제 명령어
k delete pods taeuk-test --grace-period=0 --force

웹 애플리케이션 접근

각 포드의 자체 IP가 존재하지만, 이 주소는 클러스터 내부에 존재하며 외부에서 접근 불가능함

외부에서 액세스하려면, 서비스 객체를 통해 IP를 노출해야함

이를 위해, LoadBalancer 형태의 특별한 서비스가 필요함 (로드밸런서의 공용IP로 포드에 연결가능)

서비스 객체 생성

1
k expose rc taeuk-test --type=LoadBalancer --name taeuk-http

서비스 목록 보기

1
k get services

바로 생성했다면, 아직 외부 IP주소가 없는 것을 확인.
클라우드 인프라에서 로드 밸런서를 생성하는데 시간이 걸리기 때문. 외부 IP가 생길 때까지 대기

(이슈해결) 쿠버네티스에서 삭제해도, 계속 실행중일시

k delete pods name을 해도 뒤의 다른 이름을 달고 계속 생성될 때가 있다.

결과 화면

이것은 지워도 deploymentrc(레플리카컨트롤러) 에서 계속 생성하기 때문이다.

그러므로, k get deployment 또는 k get rc를 하여 목록을 확인하고,

결과 화면

k delete deployment taeuk-test 또는 k delete rc taeuk-test를 하여 계속 실행되는 것을 방지