Page tree
Skip to end of metadata
Go to start of metadata

목차

  1. 클라우드 환경
    1. GCP 프로젝트 생성
    2. gcloud sdk 설치 및 인증
    3. 쿠버네티스 클러스터 생성
    4. TODO 앱 구축
      1. MySQL 구축
      2. TODO API
      3. TODO WEB
      4. 인그레스
  2. 로컬 환경 (작성중)



예제 깃헙 : https://github.com/gihyodocker

예제파일 다운로드 : http://wikibook.co.kr/docker-kubernetes/


*시작하기 전에

4장에서 만든 image파일이 있어야 한다. 

실습하며 만들어도 되고, 아래 파일을 직접 docker hub 에서 다운로드 가능하다.

gihyodocker/nginx:latest

gihyodocker/todoapi:latest

gihyodocker/tododb:latest

gihyodocker/todoweb:latest

gihyodocker/nginx-nuxt:latest



1. 클라우드 환경

GCP 에서 제공하는 GKE(Google Kubernetes Enging) 를 사용한다.

GKE 는 쿠버네티스의 개발을 주도하는 구글이 제공하는 것으로, 쿠버네티스 서비스 중 가장 널리 사용된다.


1. GCP 프로젝트 생성

autumn-kuber 라는 이름으로 생성했다.



2. gcloud SDK 설치 및 인증

gcloud SDK 는 GCP 서비스를 CLI 에서 조작하게 해주는 도구다.

설치되지 않은 경우 설치해준다.

https://cloud.google.com/sdk/docs/downloads-interactive?authuser=2&hl=ko#mac

(mac os 기준)

curl <https://sdk.cloud.google.com> | bash
exec -l $SHELL    # 재시작
gcloud init       # 사용할 계정, 프로젝트 등을 셋팅


설치되어 있는 경우 최신 버전으로 업데이트 한다.

gcloud components update


인증 및 초기설정

gcloud auth login
gcloud config set project autumn-kuber  # init 했을 경우 생략 가능
gcloud config set compute/zone asia-northeast1-a



3. 쿠버네티스 클러스터 생성

옵션

—cluster-version (클러스터 버전)

—machine-type (코어, 메모리, CPU 설정)

  —num-node (인스턴스 수)

(교재의 버전은 예전 버전이라 지원되지 않음! 최신 버전으로 해주세요)

gcloud container clusters create autumn \
--cluster-version=**1.12.8-gke.10** \
--machine-type=n1-standard-1 \
--num-nodes=3


다음 에러 발생 시

GCP 콘솔에서 GKE 사용 설정이 필요!


생성 완료


gcloud 로 kubernetes 클러스터를 제어할 수 있도록 kubectl 에 인증정보 설정

gcloud container clusters get-credentials autumn


확인

kubectl get nodes



4. TODO 앱 구축

4장에서 만들었던 TODO 애플리케이션을 클라우드에 구축해보자.


4-1. MySQL 구축


마스터-슬레이브 구성으로 MySQL 을 구축하자.

도커에서 퍼시스턴스 데이터를 다루는 컨테이너를 실행할 때는, 컨테이너가 배포된 호스트에 데이터 볼륨이 위치해야만 했다.

하지만 쿠버네티스에서는 호스트에서 분리된 외부 스토리지를 데이터 볼륨으로 사용할 수 있다.

→ 호스트와 데이터볼륨의 결합이 느슨해지고, 퍼시스턴스 데이터를 다루는 애플리케이션을 컨테이너로 운영하기 쉽다!

이러한 매커니즘은 다음의 쿠버네티스 리소스를 통해 구현된다.

  • 퍼시스턴트볼륨 (PersistentVolume)
  • 퍼시스턴트볼륨클레임 (PersistentVolumeClaim)
  • 스토리지클래스 (StorageClass)
  • 스테이트풀세트 (StatefulSet)


퍼시스턴트볼륨(PV)과 퍼시스턴트볼륨클레임(PVC)

인프라에 대한 복잡성을 추상화 하기 위한 방법.

쿠버네티스에서 스토리지를 확보하려면 퍼시스턴트볼륨과 퍼시스턴트볼륨클레임 이라는 리소스를 사용한다. 이 리소스는 클러스터가 구축된 플랫폼을 지원하는 퍼시스턴스 볼륨을 생성하기 위해 사용된다.


퍼시스턴트볼륨 : 물리적 스토리지. 파드와 별개로 관리되며 별도의 생명주기를 가지고 있음.

퍼시스턴트볼륨클레임 : 추상화된 논리 리소스 (용량 동적 확보 가능). 사용자가 PV 에 하는 요청. (PV 를 파드에 직접 연결하는 것이 아니라, PVC 를 통해 사용한다)

접근 권한 (읽기/쓰기), 접근 노드 개수, 스토리지 종류 등을 설정할 수 있다.

*Dynamic Provisioning

별도로 PV 를 미리 정의할 필요 없이, PVC 만 정의하면 자동으로 PV 를 생성해주는 기능


스토리지 클래스

퍼시스턴트볼륨으로 확보한 스토리지의 종류를 정의하는 리소스다. 동적 생성 시 PVC 에 스토리지 클래스를 지정하여 이에 맞는 디스크가 생성될 수 있다.

      • docker-kubernetes-master/ch06/ch06_3_2/storage-class-ssd.yaml

        kubectl apply -f storage-class-ssd.yaml

스테이트풀세트

stateless 애플리케이션을 배포하는 데 적합한 '디플로이먼트' 와 다르게,

'스테이트풀세트' 는 stateful 애플리케이션을 관리하는 데 적합한 리소스다. (컨트롤러)

디플로이먼트에서 생성한 파드 : 무작위로 생성된 식별자

스테이트풀세트에서 생성한 파드 : 일련번호가 붙는 유일한 식별자

→ 파드의 식별자가 안정적이기 때문에 파드가 재생성되어도 스토리지가 계속 같은 파드에 연결된다. 데이터를 똑같이 복구할 수 있다.


  • docker-kubernetes-master/ch06/ch06_3_3/*

다음 설정파일을 이용해 MySQL 스테이트풀세트를 만든다.


마스터용 설정

설정의 volumeClaimTemplates 을 통해 퍼시스턴트볼륨클레임을 파드마다 자동으로 생성하는 템플릿을 생성할 수 있다.

따라서 각 파드(MySQL) 가 요구하는 퍼시스턴트볼륨클레임을 매번 만들지 않아도 된다.

kubectl apply -f mysql-master.yaml


슬레이브용 설정
kubectl apply -f mysql-slave.yaml


확인
kubectl get pod

초기 데이터 등록

(init-data.sh 는 tododb 디렉터리에 있다. 없을 경우 github 에서 받을 수 있다)

kubectl exec -it mysql-master-0 init-data.sh



4-2. TODO API

Nginx 와 API 는 강한 결합을 가져도 무방하기 때문에 파드 형태로 함께 구성한다.

kubectl apply -f todo-api.yaml

확인
kubectl get pod -l app=todoapi

4-3. TODO WEB
kubectl apply -f todo-web.yaml


정적 파일을 Nginx 에서 제공할 수 있도록 쿠버네티스 볼륨을 만들었다.

(emptyDir, volumeMounts)

web 컨테이너에 있는 정적 파일을 Nginx 컨테이너에 복사한다.

(todoweb 디렉토리 필요. 없을 경우 github 에서 받을 수 있다)

cp -R /todoweb/.nuxt/dist /

web 컨테이너의 /dist 디렉터리는 가상 볼륨을 통해 Nginx 와 공유되므로, Nginx 컨테이너의 /var/www_nuxt 디렉터리에도 파일이 위치한다.
ls -l /var/www/_nuxt/


4-4. 인그레스

인그레스를 통해 외부에서 웹 어플리케이션에 접근 가능하도록 해준다.

kubectl apply -f ingress.yaml
kubectl get ingress



참고


쿠버네티스의 볼륨

쿠버네티스의 볼륨은 컨테이너가 아닌 파드에 종속된다. 따라서 그 파드 안에 속해있는 컨테이너 간 공유가 가능하다.

  • Temp

      emptyDir
    
  • Local

      hostPath
    
  • Network

      gitRepo, NFS, AWS EBS ...
    

쿠버네티스 컨테이너

쿠버네티스 객체 (파드, 서비스, 볼륨 등) 를 관리하는 역할.

  • ReplicaSet
  • Deployment
  • StateFul
  • DaemonSet
  • Job





  • No labels