모두를 위한 클라우드 컴퓨팅 6

cloud-computing

쿠버네티스(Kubernetes) 등장 배경


소프트웨어 배포 방식의 변화


도커 그 이후…


컨테이너 오케스트레이션


대표적인 도구: 쿠버네티스



쿠버네티스(Kubernetes) 구조


Master (컨트롤 플레인)

(1) etcd (엣시디)


(2) API Server


(3) Scheduler


(4) Controller


Node

(1) kubelet


(2) kube-proxy


(3) 컨테이너 런타임


오브젝트


(1) Pod


(2) ReplicaSet


(3) Deployment


(4) Service


(5) Ingress


```s
[일반적인 구성]
- Deployment를 생성 (ReplicaSet, Pod 순차적으로 생성)
- 여기에 Service(Cluster IP) 붙임
- 여기에 Ingress 붙임 (NodePort, LoadBalancer 자동으로 따라 붙음)

[오브젝트 기술하기]
- 쿠버네티스 오브젝트 생성 시, 오브젝트에 대한 기본정보와 함께 의도한 상태를 기술한 spec을 제시함
- 오브젝트 spec을 yaml 파일로 작성하고, 이를 통해 쿠버네티스 API를 이용함

[예시]
apiVersion: apps/v1
kind: Deployment     # Pod, Service, Ingress, ...
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

```


API 호출 방식



Minikube

# minikube 설치
brew install minikube

# minikube 버전 확인
minikube version

# Docker Desktop을 실행한 후 (docker 드라이버 사용)
# 가상머신을 띄우고 쿠버네티스 클러스터 생성
minikube start

# 상태 확인
minikube status

# 쿠버네티스 대시보드 실행
minikube dashboard

# kubectl - 쿠버네티스 CLI. 쿠버네티스 API를 통해 클러스터와 상호작용
# kubectl 버전 확인 (clientVersion: kubectl 버전, serverVersion: 쿠버네티스 버전)
kubectl version
kubectl version --output=json

# 클러스터 정보 확인
kubectl cluster-info

# 클러스터 내 노드 확인
# 상태가 Ready라면, 애플리케이션 배포 가능한 상태를 의미
kubectl get nodes

##### 앱 배포하기 #####

# 디플로이먼트 생성 - 디플로이먼트 이름, 앱 이미지 위치 포함
# 앱 인스턴스가 실행할 수 있는 노드를 찾아서 스케줄링
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1

# 디플로이먼트 확인
# NAME - 클러스터 내 디플로이먼트 이름
# READY - 현재 replica 수 / 원하는(desired) replica 수
# UP-TO-DATE - desired 상태를 달성하기 위해 업데이트한 replica 수
# AVAILABLE - 사용 가능한 replica 수
# AGE - 애플리케이션 실행 시간
kubectl get deployments

# 프록시 생성 - 클러스터 접근 가능하도록 포워딩 (파드는 독립된 내부망 사용)
# (터미널 새 탭에서 실행)
kubectl proxy

# 호스트에서 쿠버네티스 클러스터에 접근 가능, API 확인 및 실행
curl http://localhost:8001
curl http://localhost:8001/version

##### 앱 조사하기 #####

# kubectl get      - 자원 나열
# kubectl describe - 자원에 대한 상세 정보 확인
# kubectl logs     - 파드 내 컨테이너 로그 출력
# kubectl exec     - 파드 내 컨테이너에 명령어 실행

# 파드 확인
kubectl get pods

# 파드 상세 정보 확인 (e.g. 컨테이너, 이미지)
kubectl describe pods

# 파드 이름 저장 및 출력
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME

# 파드 내 컨테이너 로그 출력 (컨테이너가 1개이므로 컨테이너명 생략)
kubectl logs $POD_NAME

# 파드 내 컨테이너 환경변수 목록 출력
kubectl exec $POD_NAME -- env

# 컨테이너 bash 실행
kubectl exec -ti $POD_NAME -- bash

# 컨테이너 bash - 코드 확인
cat server.js

# 컨테이너 bash - 애플리케이션 실행 확인
curl localhost:8080

# 컨테이너 bash 종료
exit

##### 앱 스케일링하기 #####

# 디플로이먼트 확인
kubectl get deployments

# 디플로이먼트가 생성한 ReplicaSet 확인
# NAME - ReplicaSet 이름 ([디플로이먼트이름]-[랜덤문자열])
# DESIRED - 애플리케이션의 원하는 replica 수
# CURRENT - 현재 실행 중인 replica 수
kubectl get rs

# replica를 4개로 스케일링
kubectl scale deployments/kubernetes-bootcamp --replicas=4

# 디플로이먼트 확인 -> replica 4개로 변경됨
kubectl get deployments

# 파드 정보 조회 - 각 파드마다 ip 주소 할당
kubectl get pods -o wide

# 디플로이먼트 상세 정보 - Event에 로그 추가됨
kubectl describe deployments/kubernetes-bootcamp

# replica 2개로 스케일 다운
kubectl scale deployments/kubernetes-bootcamp --replicas=2

# 디플로이먼트 확인 -> replica 2개로 변경됨
kubectl get deployments

# 파드 정보 조회 - 2개의 파드가 종료됨
kubectl get pods -o wide

##### 앱 업데이트하기 #####

# 디플로이먼트 확인
kubectl get deployments

# 파드 확인
kubectl get pods

# 파드 상세 정보에서 현재 이미지 버전 확인 (Image 필드)
kubectl describe pods

# set image 명령어로 이미지 업데이트 (디플로이먼트 이름, 이미지 버전 전달)
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

# 파드 확인
kubectl get pods

# rollout 상태 확인
kubectl rollout status deployments/kubernetes-bootcamp

# 파드 상세 정보에서 현재 이미지 버전 확인 -> v2로 업데이트됨
kubectl describe pods

# v10 태그 이미지로 업데이트해보기
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10

# 파드 확인 - ErrImagePull 또는 ImagePullBackOff 상태 발생
kubectl get pods

# 파드 상세 정보에서 에러 확인 (Events) - v10 버전이 존재하지 않음
kubectl describe pods

# rollout 되돌리기
kubectl rollout undo deployments/kubernetes-bootcamp

# 파드 확인
kubectl get pods


# minikube 클러스터 정지
minikube stop

# minikube 클러스터 삭제
minikube delete