클라우드 엔지니어/클라우드 캠프과정

쿠버네티스(Kubernetes Volume)

해아's 2022. 10. 14. 17:25

05. Volume
  0) Volume란?
컨테이너가 사용할 가상의 디스크
컨테이너 내의 디스크에 있는 파일은 임시적이며(휘발성)
컨테이너에서 실행될 때 애플리케이션에 적지 않은 몇 가지 문제가 발생
첫번째, 컨테이너가 삭제 또는 다시 실행될 때 파일이 사라짐
두번째, 파드 내의 컨테이너 간의 파일 공유 방법
이를 해결하기 위한 것이 바로 볼륨

  1) Volume의 종류
    (1) emptyDir
일시적인 데이터를 저장하는 데 사용되는 간단한 빈 디렉터리
파드가 생성될 때 생성되고 파드가 삭제될 때 사라지는 임시 볼륨
파드 내의 컨테이너가 죽었다고 하더라도 emptyDir은 남아있음

    (2) hostPath
노드의 파일 시스템을 파드의 디렉터리로 마운트하여 사용
즉, 파드의 컨테이너에서 저장한 파일이 노드의 특정 디렉토리에 저장된다.
파드가 삭제되어도 노드에 데이터가 남아있는다.
서로 다른 파드가 같은 노드의 hostPath 사용 가능

    (3) PVC / PV
시스템 관리자가 실제 물리 디스크를 생성한 후에, 이 디스크를 PersistentVolume이라는 이름으로 쿠버네티스에 등록
개발자는 Pod를 생성할때, 볼륨을 정의하고, 이 볼륨 정의 부분에 물리적 디스크에 대한 특성을 정의하는 것이 아니라 PVC를 지정하여 관리자가 생성한 PV와 연결해서 사용

 

컨테이너는 실행된 프로그램인데 휘발성 성질이 있으므로 그 파일들을 Volume에 저장하여야 한다.

 

실습

emptyDir 생성하기

apiVersion: v1
kind: Pod
metadata:
  name: pod-emptydir-4
spec:
  containers:
  - name: container1
    image: yoskr/yos_node:0.1
    ports:
      - containerPort: 8000
    volumeMounts:
    - name: empty-dir
      mountPath: /empd
  - name: container2
    image: yoskr/yos_node:0.2
    ports:
      - containerPort: 9000
    volumeMounts:
    - name: empty-dir
      mountPath: /empd
  volumes:
  - name : empty-dir
    emptyDir: {}

 

 

hostPath

apiVersion: v1
kind: Pod
metadata:
  name: pod-hos-path-3
spec:
  nodeSelector:
    kubernetes.io/hostname: node1
  containers:
  - name: container
    image: yoskr/yos_node:0.2
    ports:
      - containerPort: 9000
    volumeMounts:
    - name: host-path
      mountPath: /mount1
  volumes:
  - name : host-path
    hostPath:
      path: /node-vol
      type: DirectoryOrCreate

 

위와같이 노드에 볼륨이 생긴다. 문제는 노드1이 고장나면 pod를 옴겨도 데이타를 노드2로 옴길수가 없다

물론 nfs로 연동할수 있지만. 앵간한건 다 자동화 하는게 목표라 아래방식을 사용한다.

같은 노드에있는 파드들끼리도 공유가 가능하다.

 

PVC / PV

 

스토리지 서버에 PV를 셋팅하고

PVC를 통해 PV를 붙인다

그리고 파드에는 pvc를 마운트 해서 사용하는개념?

 

PV생성

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-03
spec:
  capacity:
    storage: 2G #용량2기가
  accessModes:
  - ReadWriteOnce
  #ReadWriteOnce: 노드 하나에만 볼륨을 읽기/쓰기하도록 마운트할 수 있음
  #ReadOnlyMany: 여러 개 노드에서 읽기 전용으로 마운트할 수 있음
  #ReadWriteMany: 여러 개 노드에서 읽기/쓰기 가능하도록 마운트할 수 있음
  local: #지금은 로컬에 연결 각종타입이 지원됨
    path: /node-v
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [노드이름]}
        
        
        16라인의 노드이름은 접속가능한 노드이름을 지정한다(여러개가능 아무것도안쓰면 모두)

PV와 PVC는 1:1관계이다!!

PVC로 pv-03에 연결하기

 

pv와 pvc생성까지는 로컬로 생성했더도 어디노드에 셋팅할지가 없다 추후 pod생성시 노드를 지정하여 연결한다

 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-01
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1G
  storageClassName: ""

 

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-3
spec:
  containers:
  - name: container
    image: yoskr/yos_node:0.2
    volumeMounts:
    - name: pvc-pv
      mountPath: /mount3
  volumes:
  - name : pvc-pv
    persistentVolumeClaim:
      claimName: pvc-01

 

 

 

============   실습  사이드카 패턴===================

[ 웹서버 컨테이너  ]
[ 컨텐츠 전용 컨테이너 ]
1)사이드카 패턴을 위한 이미지 만들기
   contents-pull.sh 를 추가하고 컨테이너가 실행될때 contents-pull.sh를 실행되는 컨테이너 하나 생성
2) 사이드카 패턴을 위한 yml 파일 작성
아파치웹서버 이미지를 이용한 컨테이너와
위에서 만든 컨테이너가 실행되는 파드를 만드시오
단 두 컨테이너는 emptyDir를 이용해 공유되고 있는 상태
이때 아파치 웹서버는 /usr/local/apache2/htdocs에 마운트
위에서 만든 컨테이너는 /data에 마운트

 

강사님풀이

더보기
apiVersion: v1
kind: Pod
metadata:
  name: pod-sidecar2
spec:
  containers:
  - name: container1
    image: httpd
    ports:
      - containerPort: 80
    volumeMounts:
    - name: static_file
      mountPath: /usr/local/apache2/htdocs
      readOnly: true
  - name: container2
    image: yoskr/sidecar_data:1.2
    env:
    - name: CONTENTS_SOURCE_URL
      value: "http://192.168.179.1:8888/"
    - name: FILE_NAME
      value: "hello.html"
    volumeMounts:
    - name: static_file
      mountPath: /data
  volumes:
  - name : static_file
    emptyDir: {}


강사님 풀이
# Dockerfile 만들기
FROM  python:3.9.14-buster
ADD ./contents-pull.sh /contents-pull.sh
WORKDIR /
CMD ./contents-pull.sh

#도커만들고 올리기
docker build --tag yoskr/sidecar_data:1.2 .
docker push yoskr/sidecar_data:1.2

#pod만들기
apiVersion: v1
kind: Pod
metadata:
  name: pod-sidecar2
spec:
  containers:
  - name: container1
    image: httpd
    ports:
      - containerPort: 80
    volumeMounts:
    - name: static_file
      mountPath: /usr/local/apache2/htdocs
      readOnly: true
  - name: container2
    image: yoskr/sidecar_data:1.2
    env:
    - name: CONTENTS_SOURCE_URL
      value: "http://192.168.179.1:8888/"
    - name: FILE_NAME
      value: "hello.html"
    volumeMounts:
    - name: static_file
      mountPath: /data
  volumes:
  - name : static_file
    emptyDir: {}


확인하기
while true; do curl 192.168.2.83; sleep 1; done

 

============   실습  DB파드==================

 

실습 2 DB파드
파드안에  mysql 컨테이너 생성
DB 만들고 테이블 만들고 데이터 insert
파드를 삭제후 다시 생성해도 데이터가 남아 있을수 있게 설정

강사님 정답

더보기
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
도커허브에 아규먼트로 MYSQL_ROOT_PASSWORD를 줘야한다고 써있다
apiVersion: v1
kind: Pod
metadata:
  name: mysql-server
spec:
  nodeSelector:
    kubernetes.io/hostname: node1
  containers:      
  - name: mysql
    image: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "qwer1234"
    volumeMounts:
    - mountPath: /var/lib/mysql
      name: db-vol
  volumes:
  - name : db-vol
    hostPath:
      path: /db-vol
      type: DirectoryOrCreate

============   자체실습  저번에 만들 도커 db설정을 해보자==================

 

 

 

 

 

 

 

 

 

 

 

참고자료

728x90
반응형