본문 바로가기

DevOps/kubernetes

[udemy] 쿠버네티스 기초

코스 소개

 * 비기너 코스

Lab 환경, YAML, POD, Deployments, 네트워킹, 서비스, 마이크로 서비스 아키텍트, 데모, 코딩 연습

 * 관리자 코스 (CKA)

HA(High Availity) Deployment, 스케쥴러, 로깅/모니터링, 어플리케이션 라이프사이클, 매인턴스, 시큐리티

 * 개발자 코스 (CKAD)

코어 개념, ConfigMaps & Security & ServiceAccounts, 멀티 컨테이너 팟, readness & liveness Probes, 로깅 모니터링, 팟 디자인, 데모

 

쿠버네티스 비기너 코스

https://www.udemy.com/course/learn-kubernetes/

 

Kubernetes for the Absolute Beginners - Hands-on

Learn Kubernetes in simple, easy and fun way with hands-on coding exercises. For beginners in DevOps.

www.udemy.com

k8s라고도 불리는 쿠버네티스는 구글에 의해 만들어졌고 오픈소스 프로젝트이며 최고의 컨테이너 오케스트레이션 기술이다. 쿠버네티스를 이해하기 위해 컨테이너와 오케스트레이션에 대해서 알아본다.

 

컨테이너

 * Docker

최고의 컨테이너 기술은 Docker이다. 

개발을 하다보면 Node JS, Mongo DB와 같은 컴포넌트를 사용할 것이고 우리가 사용하는 운영체제에서 잘 실행되어야 한다. 

당연 서비스와 라이브러리 의존성을 체크해야하는데 서비스마다 다른 버전의 라이브러리를 사용할수도 있다. 버전을 올릴 때마다 호환성을 체크해야한다. 환경설정도 문제가 된다.

매번 개발자는 다른 환경에서도 동일한 환경설정을 보장해야하고 수많은 명령어를 입력하고 환경변수를 셋팅, 그리고 각각 정확한 버전의 컴포넌트를 설치해야한다. 

Docker는 각 컴포넌트를 여러 컨테이너에 실행시키고 라이브러리, 환경변수 문제를 모두 해결해준다. 같은 커널을 공유하기 때문에 우분투에서 올린 도커에 윈도우 컨테이너는 적합하지 않다. VM과 도커의 차이점을 설명한다. OS를 공유하기 때문에 적은 용량을 사용하며 Boot up도 굉장히 빠르다. 

 

 * Nodes

Node는 쿠버네티스가 설치된 물리 또는 가상 머신이다. 쿠버네티스에 의해 컨테이너들이 실행되는 워커이다. 노드가 죽으면 서비스가 내려가니 하나이상의 노드를 가지고 있어야 한다.

 * Cluster

클러스터는 노드의 집합이다. 하나의 노드가 죽더라도 다른 노드에 의해 접근이 가능해진다. 

 * Master

클러스터 운영을 책임진다. 클러스터 멤버들에 대한 정보와 노드 모니터링, 특정 노드 실패시 워크로드를 다른 노드로 이동, 

 

API Server: 쿠버네티스의 프론트 엔드이다. users, management devices ,command line interfaces, 모든 쿠버네티스 클러스트와 상호 대화 기능을 제공한다. 

etcd key store: 실뢰할 수 있는 키 벨류 스토어이다. 

Scheduler: 다수의 노드에 워크로드를 분배

Controller: 노드에게 알려주고 응답을 하는데 책임이 있으며 노드가 다운될 시 새로운 컨테이너를 올릴지 결정한다. 

Container Runtime: 컨테이너에서 실행되는 소프트웨어이다. 대표적으로 도커가 있다.

kubelet: 클러스터에서 각 노드에 실행중인 에이전트이다. 컨테이너들이 노드에 잘 실행되는지에 대한 책임이 있다. 

 

kubectl 툴은 쿠버네티스 클러스터에 어플리케이션을 디플로이하고 매니징하는데 사용된다. 

kubectl run hello-minikube

클러스터의 정보를 알고 싶거나 노드들의 상태를 알고 싶거나, 많은 다른 작업을 하고 싶을 때 사용한다. 

kubectl cluster-info

kubectl get nodes

 

설치방법

여기에서는 사진과 다르게 kodekloud.com 사이트에서 테스트해보는 것을 추천한다. kubeadm은 로컬 환경에 다수의 노드 쿠버네티스를 셋팅하는 솔루션이다. minikube 설치 영상을 제공한다. 

minikube 관련 링크

Install MiniKube: https://kubernetes.io/docs/tasks/tools/install-minikube/
VirtualBox: https://www.virtualbox.org/wiki/Downloads

MiniKube Download page for  Windows: https://github.com/kubernetes/minikube/releases

 

설치방법:

https://www.udemy.com/course/learn-kubernetes/learn/lecture/9723304#content

로컬에 리눅스, 맥, 윈도우에서 kubectl를 다운받는다. virtualbox에 우분투 서버를 올린 뒤 minkube를 설치하고 웹서버를 하나올려보고 접속, 이후 종료까지 진행해본다. 

 

Pods

쿠버네티스는 컨테이너를 워커 노드에 직접 디플로이하지 않는다. 컨테이너는 팟이라고 불리우는 쿠버네티스 오브젝트로 캡슐화 된다. 즉 팟은 한개의 어플리케이션에 대한 단일 인스턴스이다. 물론 하나의 팟은 여러개의 컨테이너를 가질 수 있지만 이 경우는 기존 컨테이너를 서포트하 컨에이너이다(예를들어 웹 어플리케이션을 서포트하기 위해 유저정보, 유저에 의해 업로드된 파일처리같은..생성될 때 같이 생성되고 죽을 때 같이 죽는다. 같은 팟 안에 있으면 컨테이너끼리 대화도 가능하다. 로컬호스트를 참조할수도 있고 같은 네트워크 스페이스, 스토리지를 공유할 수도 있다)  결론적으로는 추가 할당이 필요한 경우 새로운 팟을 올려야만 한다. 노드에 자원이 부족할 경우 새로운 노드에 팟을 올려야한다. 

 

YAML

https://www.udemy.com/course/learn-kubernetes/learn/lecture/9742476#content

단일 키, 벨류를 표현할 때는 키: 벨류 (콜론 + 띄어쓰기로) 표현한다.

밸류가 리스트일 경우 - 를 이용하고 딕셔너리 일 경우 띄어쓰기로 표현한다. 

#리스트
Fruits:
- Orange
- Apple
- Banana

#딕셔너리
Banana:
  Calories: 105
  Fat: 0.4
  Carbs: 27

# 리스트 + 딕셔너리
Fluits:
  - Banana:
      Calories: 105
      Fat: 0.4
      Carbs: 27
  - Grape:
      Calories: 62
      Fat: 0.3
      Carbs: 16

# 리스트의 각 항목이 딕셔너리로 구성됨
Employee:
  Name: Jacob
  Sex: Male
  Age: 30
  Title: Systems Engineer
  Projects:
    - Automation
    - Support
  Payslips:
    - Month: June
      Wage: 4000
    - Month: July
      Wage: 4500
    - Month: August
      Wage: 4000

 쿠너네티스에서 YAML

# kubectl create -f pod-definition.yml 이런 명령어로 만들 수 있음
# 그리고 아래처럼 내용을 조금 추가해줌

#kind에 따라 버전설정해주면 됨, Pod는 대문자로 써야함
apiVersion: v1
kind: Pod
# 사실 이정도만 넣어주면 됨. 레이블에는 원한다면 다른 키 벨류를 추가적으로 넣어주면 됨 ex) type: front-end
metadata
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
    - name: nginx-container
      image: nginx
      env:
        - name: PORT
          value: 9999

 

쿠버네티스 기본명령어

kubectl apply -f pod.yaml로 컨테이너를 생성할 수 있음

 

https://www.udemy.com/course/learn-kubernetes/learn/lecture/9742480#content

yaml파일은 IDE로 쉽게 만들 수 있다.  vscode를 설치하고 extensions에서 YAML(red hat)를 설치한다. 그리고 익스텐션 설정값을 살짝 수정해준다. 

자동으로 키를 추천해주고 타입도 알려준다.

또한 아웃라인(개요)를 이용하면 어떻게 구성되어있는지도 쉽게 확인할 수 있다.

 

https://uklabs.kodekloud.com/courses/labs-kubernetes-for-the-absolute-beginners-hands-on/

https://uklabs.kodekloud.com/topic/labs-familiarize-with-lab-environment-2/

https://uklabs.kodekloud.com/topic/labs-pods-with-yaml-2/

여기에서 무료로 공부해볼 수 있다고 하는데 일단 패스, 일단 답은 아래와 같음. 답이라도 한번 보는걸 추천

https://www.udemy.com/course/learn-kubernetes/learn/lecture/22175054#content

 

 

로드밸런싱

 

웹서버를 예로들면 사용자의 요청이 많아져서 실패가 날 경우 노드가 추가될 것이다. 하나의 노드에는 2개의 팟이 올라가는데 하나의 클러스터에서 여러 노드에 문제 없이 분배해주는 열학을 한다. 

 * Replication Controller (사용 안 함)

Pod이 Spec과 동일하지 않은 경우 동일한 상태가 되도록 관리함. 현재는 레플리카 컨트롤러를 사용하지 않고 레플리카 셋을 사용함. 앱 배포시에는 디플로이먼트를 사용함. 셀렉터에서 레이블을 선택할 때 같은지 다른지만 비교가능 (레플리카셋은 in. not in, exists도 가능)

 * Replica Set (실제적으로는 상위 개념인 Deployment를 사용함)

 Replication Controller과 비슷하다.  하지만 더 풍부한 표현식 selector를 갖는다. 

스케일을 수정하는 방법은

kubectl edit replicaset myapp-replicaset 에서 relicas 수정하거나

kubectl scale replicaset myapp-replicaset --replicas=2 이런식으로 수정해주면 된다.

만약 스케일을 줄이면 알아서 개수만큼 종료시킨다. 

 

 

apiVersion: extensions/v1beta1
 kind: ReplicaSet
 metadata:
   name: example
 spec:
   replicas: 3
   selector:
     matchExpressions:
      - {key: app, operator: In, values: [example, example, rs]}
      - {key: environment, operator: NotIn, values: [production]}
   template:
     metadata:
       labels:
         app: example
         environment: dev
     spec:
       containers:
       - name: example
         image: example/rs
         ports:
         - containerPort: 80

 

https://www.udemy.com/course/learn-kubernetes/learn/lecture/22175060#content

에서 레플리카셋에 대한 질문과 답을 설명해준다.

 

 

Deployment

ReplicaSet보다 좀 더 추상화된 상위 개념이다. 실제 운영에서는 ReplicaSet대신 Deployment를 사용한다.코드를 수정해서 팟을 다른 버전의 이미지로 변경해야하는 경우 어떻게 변경시킬지 설정할 수 있다. (순차적으로 하나씩?, 한번에 모두) 아래 그림을 보면 ReplicaSet에서 상위의 버튼들이 기능으로 추가된 것을 볼 수 있다. 

 

YAML파일은 위와 똑같은데 kind만 ReplicaSet에서 Deployment로만 변경해주면 된다.  (metadata의 이름도..)

 

https://www.udemy.com/course/learn-kubernetes/learn/lecture/22175064#content

에서 여러 예제애 대한 질문과 답변을 제공한다.

 

Deployment의 업데이트와 롤백

 

한번에 내리고 올리는 것은 위험하기 때문에 Reolling Update가 디폴트 값이다.

이미지를 변경하는 방법은 간단하다.

 

롤백명령어는 다음과 같다. 기본적으로 제공한다. 

kubectl rollout undo deployment/myapp-deployment

다음은 기본 명령어이다.

 

서비스

NodePort, ClusterIP, LoadBalanacer 이렇게 3종류가 있다. 

 * NodePort

팟의 아이피, 포트는 모른다. 다만 서비스가 중간다리 역할을 해주기 때문에 사용자는 단지 NodePort로 애플리케이션에 서비스를 요청하면 된다.  

ports는 딕셔너리 리스트이므로 최초 하나(targetPort)에만 -를 써주는것을 햇갈리지말아야한다.

여기에 팟을 지정하기 위해 레이블을 설정해준다. 

컨테이너에 노드가 증가하더라도 서비스는 알아서 연결시켜준다.

 

 * Cluster IP

밖에서 유저가 특정포트로 접속하는게 아니라 내부 노드들끼리 통신해야하는 경우 어떻게 해야할까? 서비스는 노드들을 그룹으로 묶어서 접근할 수 있게 해준다. 클러스터 IP는 자동적으로 생성된다. 

여기서는 NodePort를 지정해줄 필요는 없다.

 

 * Load Balancer

여러 노드에 팟이 올라간 경우 모든 IP를 종합해서 하나의 URL로 맵핑해줘야 한다. 

GCP나 여러 유명 클라우드를 사용하면 spec의 type을 NodePort를 LoadBalancer로 변경만 해주면 끝난다.

apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    app: myapp
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30008

 

아래는 서비스에 대한 질문과 답이다.

https://www.udemy.com/course/learn-kubernetes/learn/lecture/22175066#content

 

그리고 마지막으로 투표를 하는 앱을 만드는데

투표를 하면 레디스에 값을 저장하고 워커가 레디스에 있는 것들을 처리해 디비로 저장한다. 이후 다른 앱에서 디비를 조회해 결과를 확인하는 앱을 만든다.

https://github.com/kodekloudhub/example-voting-app/tree/master/k8s-specifications

여기에 yaml파일들이 있다.

 

 

 

'DevOps > kubernetes' 카테고리의 다른 글

[udemy] CKA 과정, 쿠버네티스 아키텍처  (1) 2021.09.02