ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [쿠버네티스] 큐브 시스템 컴포넌트와 라이브네스, 레디네스
    컨테이너/쿠버네티스 2021. 1. 29. 20:27

     

    큐브 시스템 컴포넌트


    큐브 API 서버

    • 쿠버네티스 시스템 컴포넌트는 오직 API 서버와 통신하며 컴포넌트끼리는 서로 직접 통신하지 않습니다.
    • RESTful API를 통해 클러스터 상태를 쿼리로 제공하고, 수정할 수 있는 기능을 제공합니다.

     

    큐브 컨트롤러 매니저

    • API에 의해 받아진 요청을 처리하는 역할을 맡습니다.
      • 레플리케이션 매니저
      • 레플리카셋, 데몬셋, 잡 컨트롤러
      • 디플로이먼트 컨트롤러
      • 스테이트풀셋 컨트롤러
      • 노드 컨트롤러
      • 서비스 컨트롤러
      • 엔드포인트 컨트롤러
      • 네임스페이스 컨트롤러
      • 영구 볼륨 컨트롤러
      • etc

    큐브 스케줄러

    • 요청 받은 리소스를 어느 노드에서 실행할지를 결정합니다. 현재 노드의 상태를 점검하고 최상의 노드를 찾아 배치하죠.
    • 다수의 팟(Pod)을 배치하는 경우에는 라운드 로빈 방식을 채택합니다.

     

     

    쿠버네티스 주요 컴포넌트 확인

    $ kubectl get pod -n kube-system

     

    쿠버네티스 설정 파일 확인

    $ ls /etc/kubernetes/manifest

     

    POD


    Pod

    • 컨테이너의 공동 배포된 그룹이며 쿠버네티스는 컨테이너를 개별적으로 배포하지 않고 팟 단위로 항상 배포하고 운영합니다.
    • 일반적으로 팟은 단일 컨테이너만 포함하지만 다수의 컨테이너를 포함할 수도 있습니다(컨테이너 당 단일 프로세스가 적합).

     

    Pod의 관리

    • Pod은 밀접하게 연관된 프로세스를 함께 실행하고 마치 하나의 환경에서 동작하는 것처럼 보입니다. 그러다 동일한 환경을 제공하면서 다소 격리된 상태를 유지시켜 줍니다.
    • Pod의 모든 컨테이너는 동일한 네트워크 및 UTS 네임스페이스에서 실행되며 같은 호스트 이름 및 네트워크 인터페이스를 공유합니다(포트 충돌 가능성 있음).

     

    YAML으로 Pod 디스크립터 작성

    Pod 정의

    • apiVersion, kind , metadata, spec 등으로 구성됩니다. 어떤 특성을 가진 정의들인지 한번 확인해볼까요?
      • apiVersion : 쿠버네티스 api의 버전
      • kind : 리소스의 유형 (Pod, Service 등)
      • metadata : Pod과 관련된 이름, 네임스페이스, 레이블 등 그 밖의 정보
      • spec : 컨테이너, 볼륨 등의 정보
      • 상태 : Pod의 상태, 각 컨테이너의 설명 및 상태, Pod 내부의 IP 및 그 밖의 기본 정보 등(우리가 작성할 필요는 없음)

     

    YAML 파일은 쿠버네티스 공식 문서에서 조회하고 받아올 수 있습니다.

    https://kubernetes.io/docs/home/

     

    Kubernetes Documentation

    Kubernetes is an open source container orchestration engine for automating deployment, scaling, and management of containerized applications. The open source project is hosted by the Cloud Native Computing Foundation.

    kubernetes.io

    디스크립터를 사용해 포드 생성

    $ kubectl create -f ${yaml파일}

     

    컨테이너에서 호스트로 포트 포워딩

    $ kubectl port-forward ${pod파일 이름} 8080:8080

     

    Pod 삭제

    $ kubectl delete pod ${Pod 이름}

     

    전체 Pod 삭제

    $ kubectl delete pod --all

     

     

    Liveness, Readiness


    Liveness

    • 컨테이너가 살았는지 판단하고 다시 시작하는 기능입니다. 즉, 컨테이너의 상태를 파악하고 교착 상태에 빠진 컨테이너를 재시작해줍니다. -> 고가용성

     

    Readiness Probe

    • Pod이 준비된 상태에 있는지 확인하고 정상 서비스를 시작하는 기능입니다.
    • Pod이 준비되지 않은 상태면 로드밸런싱을 하지 않습니다.

     

    Startup Probe

    • 애플리케이션의 시작 시기를 확인하여 가용성을 높이는 기능입니다.
    • 애플리케이션이 시작되기 전까지는 Liveness와 Readiness를 비활성화 시킵니다.

     

     

    Liveness Probe 구성

    apiVersion: v1                                                             // exec-liveness.yaml
    kind: Pod
    metadata:
      labels:
        test: liveness
      name: liveness-exec
    spec:
      containers:
      - name: liveness
        image: k8s.gcr.io/busybox
        args:
        - /bin/sh
        - -c
        - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
        livenessProbe:
          exec:
            command:
            - cat
            - /tmp/healthy
          initialDelaySeconds: 5
          periodSeconds: 5
    

     

    위 YAML 파일은 /tmp/healthy에 컨테이너를 생성하고, 30초 뒤에 이를 제거한다. 그리고 600초 동안 sleep 모드에 들어간다.  LivenessProbe는 5초마다 /tmp/healthy를 확인하므로 /tmp/healthy가 삭제되었을 때 0이 아닌 값을 출력해 컨테이너를 재시작하게 된다.

     

     

    apiVersion: v1                                                             // http-liveness.yaml
    kind: Pod
    metadata:
      labels:
        test: liveness
      name: liveness-http
    spec:
      containers:
      - name: liveness
        image: k8s.gcr.io/liveness
        args:
        - /server
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
            httpHeaders:
            - name: Custom-Header
              value: Awesome
          initialDelaySeconds: 3
          periodSeconds: 3
    

     

    http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {          // server.go
        duration := time.Now().Sub(started)
        if duration.Seconds() > 10 {
            w.WriteHeader(500)
            w.Write([]byte(fmt.Sprintf("error: %v", duration.Seconds())))
        } else {
            w.WriteHeader(200)
            w.Write([]byte("ok"))
        }
    })

    이 YAML 파일은 서버 응답 코드가 200이상 400미만일 경우 컨테이너 유지를 하며 서버 응답 코드가 그 외의 것일 경우, 컨테이너를 재시작합니다.

     

     

    Liveness + Readiness Probe 구성

    apiVersion: v1
    kind: Pod
    metadata:
      name: goproxy
      labels:
        app: goproxy
    spec:
      containers:
      - name: goproxy
        image: k8s.gcr.io/goproxy:0.1
        ports:
        - containerPort: 8080
        readinessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 20
    

    Readiness TCP 설정

    • Readiness Probe는 8080포트를 5초 후부터 검사를 시작합니다.
    • 검사 주기는 10초입니다.

     

    Liveness TCP 설정

    • Liveness TCP는 8080포르틑 15초 후부터 검사를 시작합니다.
    • 검사 주기는 20초입니다.

     

    '컨테이너 > 쿠버네티스' 카테고리의 다른 글

    [쿠버네티스] create VS apply  (0) 2021.01.30
    쿠버네티스 서비스 동작 구조  (0) 2021.01.28
    쿠버네티스란  (0) 2021.01.27

    댓글

Designed by Tistory.