본문 바로가기

Infrastructure/Kubernetes

[Basic] 쿠버네티스 운영

쿠버네티스 운영

볼륨, 디스크 서비스

쿠버네티스 볼륨

  • 데이터를 담는 디렉토리다.
  • Pod 내 컨테이너들이 접근 가능하다.
  • Pod에 소속되는 동안 유지된다.
  • Pod 내에서 구동되는 컨테이너들보다 오래 유지되며, 그 데이터는 컨테이너가 재시작 되더라도 계속 보존된다.
  • 자세한 내용은 Wiki를 참고한다.

쿠버네티스 볼륨 종류

  • 로컬 디스크, configMap, secret, persistentVolumeClaim, emptyDir, hostPath
  • NFS, iSCSI, Fiber Channel과 같은 일반적인 외장 디스크 인터페이스다.
  • GlusterFS, Ceph와 같은 오픈 소스 파일 시스템을 사용할 수 있다.
  • AWS EBS, GCP Persistent 디스크와 같은 퍼블릭 클라우드에서 제공되는 디스크를 사용할 수 있다.
  • VsphereVolume과 같이 프라이빗 클라우드 솔루션에서 제공하는 디스크 볼륨을 사용할 수 있다.
  • 더 자세한 볼륨 종류에 대한 정보는 쿠버네티스 공식 문서를 참고한다.

컨테이너간 볼륨 공유

apiVersion: v1
kind: Pod
metadata:
  name: two-containers
spec:
  restartPolicy: Never
  containers:
    - name: nginx-container
      image: nginx
      volumeMounts:
        - name: shared-data
          mountPath: /usr/share/nginx/html
        - name: debian-container
          image: debian
      volumeMounts:
        - name: shared-data
          mountPath: /pod-data
      command: ["/bin/sh"]
      args: ["-c", "echo Hello from the debian container > /pod-data/index.html"]
      volumes:
        - name: shared-data
          emptyDir: {}

컨테이너간 볼륨 유형

Temp Local Network
emptyDir hostPath GlusterFS, gitRepo, NFS, iSCSI, gcePersistentDisk, AWS EBS, AzureDisk, Fiber Channel, Secret, VshereVolume

emptyDir

  • emptyDir은 파드가 생성될 때 생성되고 파드가 삭제될 때 같이 삭제되는 임시 볼륨으로 생성 당시에는 디스크에 아무 내용이 없기 때문에 emptyDir이라는 이름을 가지고 있다.
  • 파드 내의 컨테이너가 크래시되어 삭제되거나 재시작 되더라도 emptyDir의 생명주기는 컨테이너 단위가 아니라 파드 단위이기 때문에 emptyDir은 삭제되지 않고 계속해서 사용이 가능하다.
volumeMounts:
  - name: shared-storage
    mountPath: /data/shared
  - name: nginx
    image: nginx
volumeMounts:
  - name: shared-storage
    mountPath: /data/shared
  volumes:
  - name: shared-storage
    emptryDir: {}

hostPath

  • hostPath는 노드의 로컬 디스크의 경로를 파드에서 마운트해서 사용한다.
  • 같은 hostPath에 있는 볼륨은 여러 파드 사이에서 공유되어 사용된다.
  • 파드가 삭제되더라도 hostPath에 있는 파일들은 삭제되지 않고 다른 파드가 같은 hostPath를 마운트하게 되면 남아 있는 파일들을 액세스할 수 있다.
  • 노드의 /tmp 디렉토리를 hostPath를 이용하여 /data/shared 디렉토리에 마운트할 수 있다.
volumeMounts:
  - name: tpath
    mountPath: /data/shared
volumes:
  - name: tpath
    hostPath: 
      path: /tmp
      type: Directory

gitRepo

  • 생성 시 지정된 Git 리포지토리의 특정 리비전의 내용을 Clone하여 내려받은 후에 디스크 볼륨을 생성하는 방식이다.
  • 물리적으로는 emptyDir이 생성되고, Git 리포지토리 내용을 Clone하여 내려받는다.
    readOnly: true
  ports:
    - containerPort: 80
      protocol: TCP
  volumes:
    - name: html
      gitRepo:
        repository: https://github.com/luksa/kubia-website-example.git
        revision: master
        directory: .

PersistentVolume(PV) and PersistentVolumeClaim(PVC)

  • 클러스터 내 스토리지 일부 조각을 나타내는 API 객체다.
  • 개발 파드의 수명주기를 넘어 보존되는 범용/플러그 가능 자원으로서 가용할 수 있다.
  • 볼륨 자체를 의미하는 PV들은 스토리지를 사용하고자 할 때 그 제공방식의 세부사항들을 추상화하는 API를 제공한다.
  • 스토리지가 사전에 생성되는 시나리오(정적 프로비저닝)에서는 PV들이 직접 사용된다.
  • 반면 온디멘드 스토리지를 필요로 하는 시나리오(동적 프로비저닝)에서는 PV 대신 PVC가 사용된다.
  • PV는 파드하고는 별도로 관리되고 별도의 생명주기를 가지고 있으며 PVC는 사용자가 PV에 하는 요청이다.

쿠버네티스 서비스

쿠버네티스 서비스 개념

  • 파드 집합과 같은 애플리케이션들에 접근하는 방법을 기술하는 API 객체다.
  • 포트, 로드밸런서를 기술할 수 있다.
  • 파드들을 서로 연결한다.
  • 설정을 분리(decouple)한다.
  • 파드 접근 정책을 정의한다.
  • 마이크로서비스와 대응되는 개념이다.
  • 액세스 포인트는 내부(internal)일수도 외부(external)일 수도 있다.

쿠버네티스 서비스 구조

  • 서비스는 지정된 IP로 생성이 가능하고 여러 파드를 묶어서 로드 밸런싱이 가능하며 고유한 DNS 이름을 가질 수 있다.
  • 멀티 포트 지원, 파드 간에 랜덤으로 부하를 분산하는 로드 밸런싱 알고리즘을 지원한다.
apiVersion: v1
kind: Service
metadata:
  name: hello-node-svc
spec:
  selector:
    app:hello-node
  ports:
    - port: 80
      protocol: TCP
      targetPort: 8080
  type: LoadBalancer

Health Check

  • 쿠버네티스는 각 컨테이너의 상태를 주기적으로 체크해서 문제가 있는 컨테이너를 자동으로 재시작하거나 또는 문제가 있는 컨테이너(파드) 서비스에서 제외 가능한 기능을 제공한다.
  • Liveness probe: 컨테이너가 살아 있는지 아닌지를 체크하는 방법이다.
  • Readiness probe: 컨테이너가 서비스 가능한 상태인지를 체크하는 방법이다.

Probe types

  • Liveness probe와 Readiness probe는 컨테이너가 정상적인지 아닌지를 체크하는 3가지 방법이다.
  • Command probe: 컨테이너의 상태 체크를 쉘 명령을 수행으로 체크한다.
  • HTTP probe: HTTP GET 메서드를 이용하여 컨테이너의 상테를 검사한다.
  • TCP probe: 지정된 포트에 TCP 연결을 시도하여 상태를 검사한다.