쿠버네티스 실습

실습환경

쿠버네티스 전체 버전을 설치할 수 있는 환경

  • 운영체제
    • 리눅스 환경
    • Ubuntu, Debian, Cent OS, Red Hat Enterprise, Fedora, 컨테이너 리눅스 까지 상관없음
  • 하드웨어
    • CPU(Core) 가 2개 이상

쿠버네티스가 사용하는 포트

  • Master Node 가 사용하는 포트
    • 6443: API Server
    • 2379, 2380: etcd Client API
    • 10250: kubelet API
    • 10251: Scheduler
    • 10252: Controller Manager
  • Worker Node 가 사용하는 포트
    • 10250: kubelet API
    • 30000~32767: NodePort Service

설치 방법

  • 전체 설치

    • 마스터 와 워커를 다른 컴퓨터에 설치
    • 가상머신을 이용해서 하나의 컴퓨터에서 마스터 와 워커 노드를 분리해서 설치
  • 경량 버전 설치: 운영체제와 상관없이 설치 가능

    • k3s: 마스터와 워커 1개씩 설정, 제약이 많음 - linux에서 스크립트를 다운로드 받아 실행:
      curl -sfL https://get.k3s.io | sh -

    • minikube: 마스터와 워커 1개씩 설정 https://minikube.sigs.k8s.io/docs/start/?arch=%2Fwindows%2Fx86-64%2Fstable%2F.exe+download

    • Windows 홈 버전에서는 Hyper-V가 설치되지 않아서 설치가 안될 수 있는데 이 경우 아래 내용을 .bat 파일로 만들어서 관리자 권한으로 실행하면 Hyper-V 기능을 사용할 수 있게 됩니다. 그 이후 리눅스에서 minikube를 설치

    pushd "%~dp0"
    dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
    for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
    del hyper-v.txt
    Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
    pause
    • kind: 마스터 1개와 워커 여러개 가능한데 Docker를 런타임으로 사용
    • docker-desktop: 쿠버네티스 설치 옵션을 체크하면 사용 가능
  • 설치 후 확인

sudo kubectl run mynginx --image nginx

sudo kubectl get pod

쿠버네티스 사용

yaml

  • 쿠버네티스에서는 pod를 만들 때 명령어 만으로 생성할 수 있고 yaml 파일을 생성하는 것이 가능
  • 작성 요령
    • 하나의 블록에 속하는 엔트리마다 -를 붙여야 합니다.
    • 키 값 매핑은 : 으로 합니다
    • 문서의 시작 과 끝에 — 를 삽입할 수 있습니다.
    • 키 와 값 사이에 공백이 있어야 합니다.
    • 주석은 #으로 시작
    • 들여쓰기는 tab 이 아니라 공백
  • 검증: https://onlineyamltools.com/validate-yaml

파드를 생성하고 관리

  • 파드는 쿠버네티스의 기본 배포 단위이면서 다수의 컨테이너를 포함
  • 일반적으로는 하나의 파드에 하나의 컨테이너가 포함되지만 하나의 컨테이너에 2개 이상의 컨테이너를 포함시킬 수 있는데 이를 sidecar pattern 이라고 함
  • 컨테이너 실행
kubectl run 컨테이너이름 --image 이미지이름

kubectl run mynginx --image nginx
  • 실행 중인 컨테이너(pod) 조회
    kubectl get pod
    • 상태
    Pending: 생성 명령 O 실행은 X
    ContainerCreating: 생성 중
    Running: 정상 실행 중
    Completed: 한 번 실행하고 완료된 상태
    Error: 에러
    CrashLoopBackOff: 지속적인 에러 상태로 인해 crash가 반복 중
    • 자세히보기
    kubectl get pod 파드이름 -o yaml
    
    kubectl get pod 파드이름 -o wide
    • event 기록까지 확인 가능한 자세히 보기:디버깅 할 때 사용
    kubectl describe pod 파드이름
  • pod 로깅
    kubectl logs -f 파드이름
  • pod에 명령을 수행
    kubectl exec 파드이름 -- 명령
    kubectl exec mynginx -- apt-get update
    • 파드 내부로 들어가고자 하는 경우
    kubectl exec -it 파드이름 -- bash
  • 파드 와 호스트간 파일 복사
    kubectl cp 타겟 소스
    • 파드 안의 파일을 표현할 때 <파드이름>:>경로
    • 호스트의 /etc/password 파일을 mynginx 컨테이너의 /tmp/passwd로 복사하고자 하는 경우
    kubectl cp /etc/password mynginx:/tmp/passwd
    
    $ sudo touch /etc/password
    
    $ ls /etc/password
    /etc/password
    
    $ kubectl cp /etc/password mynginx:/tmp/passwd
    
    $ kubectl exec -it mynginx -- bash
    
    # ls /tmp
    passwd
  • 파드 정보 수정
    kubectl edit pod 파드이름
  • 파드 삭제
    kubectl delete pod 파드이름
  • yaml 파일을 이용해서 파드를 생성
    kubectl apply -f 야믈파일경로
    • yaml 파일을 생성(mynginx.yml)
apiVersion: v1
kind: Pod
metadata:
  name: mynginx
spec:
  containers:
    - name: mynginx
      image: nginx
  • kubectl apply -f mynginx.xml
  • yaml을 권장하는 이유
    • 로컬 시스템에 위치한 YAML 정의서 뿐 아니라 인터넷 상에 위치한 YAML 파일도 사용 가능
    • 멱등성을 보장

Pod

  • 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위
  • 하나 이상의 컨테이너 그룹
  • 스토리지 및 네트워크를 공유하고 함께 배치됨
  • Pod는 직접 생성하지 않는 경우가 많고 대부분의 경우는 워크로드 리소스를 사용해서 생성
  • 파드의 단계
    • pending: 파드가 쿠버네티스 클러스터에 승인되었지만 하나 이상의 컨테이너가 설정되지 않았고 실행할 준비가 되지 않음, 파드가 스케쥴되기 이전까지의 시간 뿐만 아니라 네트워크를 통한 컨테이너 이미지 다운로드 시간도 포함
    • running: 파드가 노드에 바인딩 되었고 모든 컨테이너가 생성되었으며 적어도 하나의 컨테이너가 아직 실행중이거나 시작 또는 재시작 상태에 있는 것
    • Succeedd: 파드에 있는 모든 컨테이너들이 성공적으로 종료되었고 재시작되지 않음
    • failed: 파드에 있는 모든 컨테이너가 종료되었고 적어도 하나 이상의 컨테이너가 실패로 종료된 경우인데 해당 컨테이너는 non-zero 상태로 빠져나왔거나(exit) 시스템에서 의해서 종료된 것(terminated)
    • unknown: 파드의 상태를 얻을 수 없는 상태로 대부분은 다른 노드와의 통신 오류
  • 컨테이너 재시작 정책: restartPolicy
    • Always: 항상 재시작
    • OnFailure: 실패한 경우 재시작
    • Never: 재시작 하지 않음
  • 동일한 노드에서 kubelet에 의한 컨테이너 재시작 정책인데 파드의 컨테이너가 문제가 발생해서 종료되는 경우 5분 동안 지수 백오프 지연(10초, 20초, 40초, 80초…)으로 컨테이너를 재시작

리소스를 이용한 파드 생성

  • kubectl createkubectl apply 명령으로 생성
    • httpd 이미지를 이용해서 deployment로 파드를 생성
    • kubectl create deployment my-httpd --image=httpd --replicas=1 --port=80
    • stateless와 stateful
      • stateless(상태가 없음): 사용자가 애플리케이션을 사용할 때 상태나 세션을 저장할 필요가 없는 애플리케이션에 사용
      • stateful(상태가 있음): 사용자가 애플리케이션을 사용할 때 상태나 세션을 별도의 데이터베이스에 저장해야 하는 애플리케이션에 사용
    • deployment 를 확인
      • kubectl get deployment
      • READY: 레플리카의 개수
      • UP-TO-DATE: 최신 상태로 업데이트 된 레플리카의 개수
      • AVAILABLE: 사용 가능한 레플리카의 개수
      • AGE: 파드가 실행하고 있는 지속 시간
    • 이미지 변경
      • kubectl set image deployment/디풀로이먼트이름 컨테이너이름=이미지

디플로이먼트와 서비스

Deployment

  • stateless한 애플리케이션을 배포할 때 사용
  • 레플리카 셋의 상위 개념으로 파드의 개수를 유지할 뿐 아니라 배포 작업을 좀 더 세분화해서 관리할 수 있음
  • Pod < ReplicaSet < Deployment
  • 배포 전략
    • 롤링 업데이트: 새 버전의 애플리케이션을 배포할 때 새 버전의 애플리케이션은 하나씩 늘려가고 기존 버전의 애플리케이션은 하나씩 줄여나가는 방식
      • 쿠버네티스의 표준 배포 방식
      • 새로운 버전으로 배포된 파드에 문제가 발생하면 이전 버전의 파드로 서비스를 대체할 수 있어서 상당히 안정적이지만 업데이트가 느리게 이루어지는 단점이 있음
      • 옵션 maxSurge(업데이트 주에 만들 수 있는 파드의 최대 개수)
      • 옵션 maxUnavailable(업데이트 중에 사용할 수 없는 파드의 개수로 0보다 큰 정수를 지정할 수 있음)
    spec:
      replicas: 3
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
    • recreate(재생성)
      • 이전 버전의 파드를 모두 종료하고, 새 버전의 파드로 일괄 교체하는 방식
      • 빠르게 교체할 수는 있지만 새로운 버전의 파드에 문제가 발생하면 대처가 늦어질 수 있다는 단점이 있음
    spec:
      replicas: 3
      strategy:
        type: Recreate
    • blue/green
      • 애플리케이션의 이전 버전(블루) 과 새로운 버전(그린)이 동시에 운영되는 구조
      • 새로운 버전만 서비스 목적으로 사용 가능하고 그린은 테스트 목적
      • 새로운 버전에 문제가 있으면 바로 이전 버전으로 대체가 가능하지만 파드의 개수가 늘어남
      • 버전으로 구분
    spec:
      replicas: 3
      version: v1.0.0
    • canary
      • 블루/그린 과 비슷하지만 조금 더 진보적인 방식
      • 애플리케이션의 기능 테스트를 할 때 사용하는 방식
      • 두 개의 버전을 모두 배포하지만 새 버전에는 조금씩 트래픽을 증가(5% -> 10%… 50%)시키면서 새로운 버전의 기능을 테스트
      • 기능 테스트가 끝나고 문제가 없다고 판단되면 이전 버전은 모두 종료시키고 새 버전으로만 서비스
      • version을 이용해서 배포