k8s 볼륨

AeZan·2023년 11월 22일
0

서비스

레디니스 프로브

컨트롤러로 생성된 파드들 중에 정상적인 파드만 서비스로 접근할 수 있게하려고 파드 설정 부분에서 설정 -> HTTP / TCP / exec 방식 가능

헤드리스 서비스

ClusterIP 서비스처럼 내부용 서비스
별도의 IP 주소는 없음 -> 서비스의 DNS 로 접속 가능
stateFullSet 과 함께 사용할 경우 특정 파드로 접근 가능

볼륨 -> 공유/저장 기능을 위해 사용

emptyDir
빈 디렉토리를 생성해서 파드 안의 컨테이너에 연결해주는 방식
-> 디렉토리는 자동으로 생성 및 삭제 (파드의 라이프사이클과 동일)
각 컨테이너들끼리 데이터 공유를 위해 사용

hostpath
파드가 실행되는 해당 노드의 특정 파일/디렉토리를 연결 (마운트)
노드마다 데이터가 다르거나 없을 수도 있음

PV
볼륨을 파드와 별개로 관리 (라이프사이클)
다양한 종류의 스토리지 서비스 지원
lifecycle
1. provisioning: 볼륨생성
2. binding: 볼륨 연결
3. using: 볼륨 사용
4. reclaiming: 볼륨을 반환

nfs 설치

sudo apt install -y nfs-kernel-server

sudo mkdir /srv/nfs-volume

vim /etc/nfs-volume

/srv/nfs-volume *(rw,sync,no_subtree_check,no_root_squash)

vim index.html

hello NFS volume

각 노드에 NFS CLINET 설치
for NODE in {kube-node1,kube-node2,kube-node3}; do ssh vagrant@$NODE "sudo apt install -y nfs-common"; done

nfs 연결

ssh kube-node1

mkdir /test

sudo mount -t nfs kube-control1:/srv/nfs-volume /test

nfs 에 마운트 되는지 확인

PV, PVC 생성

apiVersion: v1
kind: PersistentVolume
metadata:
  name: myapp-pv-nfs
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /srv/nfs-volume
    server: 192.168.56.11

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myapp-pvc-nfs
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  volumeName: myapp-pv-nfs

pvc 생성 후 CLAIM 항목에 bind 된 것을 확인

nfs 를 직접 연결해주면 pod에 볼륨은 남아있지 않음
pv 는 남아있음


myapp-rs-nfs.yaml

---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-rs-nfs
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp-rs-nfs
  template:
    metadata:
      labels:
        app: myapp-rs-nfs
    spec:
      containers:
        - name: web-server
          image: nginx:alpine
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
          volumeMounts:
            - name: web-share
              mountPath: /usr/share/nginx/html
      volumes:
        - name: web-share
          persistentVolumeClaim:
            claimName: myapp-pvc-nfs

myapp-svc-nfs.yaml

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc-nfs
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: myapp-rs-nfs

볼륨 연결이 제대로 된 것을 확인해볼 수 있었음!

pvc 지워보고 pv 상태확인

pvc 정책이 retain 이라 pv에 남아는 있다
pvc를 새로 만들어도 자동으로 연결되지는 않는다.

pv 지워보고 pvc 상태 확인
pvc-> pending 에서 bound 로 바뀜
pv-> abailable -> bound


CREATE PV -> PVC -> POD
DELETE POD -> PVC -> PV


동적 볼륨 프로비저닝

매번 정적 볼륨을 요청하고 PV를 매번 제공해야하면 귀찮음

스토리지 기능 및 분류 정보를 담고 있는 스토리지 클래스 리소스만 정의해 놓고 개발자가 pvc 를 요청하면 스토리지 클래스 리소스에 의해 pv 가 자동으로 프로비저닝 되어 사용될 수 있도록 함

볼륨 플러그인에 따른 config 파일 작성방법

외부 NFS 서버를 이용한 간단한 동적 프로비저너 구현

git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git

ls /nfs-subdir-external-provisioner/deploy

rbac.yaml -> 사용자 권한 설정 파일

deployment.yaml 파일 수정

pod 생성 확인

class.yaml -> sotrageclass 정의 파일

-- 사전 준비 끝 --

vim dynamic-nfs.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myapp-pvc-dynamic
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClssName: nfs-client

vim dynamic-rs-nfs.yaml

---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-rs-dynamic
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp-rs-dynamic
    metadata:
      labels:
        app: myapp-rs-dynamic
    metadata:
    spec:
      containers:
        - name: web-server
          image: nginx:alpine
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
          volumeMounts:
            - name: web-share
              mountPath: /usr/share/nginx/html
      volumes:
        - name: web-share
          persistentVolumeClaim:
            claimName: myapp-pvc-dynamic

pv를 따로 지정해주지 않았지만 storageclass 에 의해 생성이 됨


애플리케이션 사용자화

myapp-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
    - name: myapp
      image: ghcr.io/c1t1d0s7/go-myweb:alpine
      args:
      - -port=8088	# image 의 port 를 8088 로 변경
      ports:
      - containerPort: 8088 # image port 번호여야 함
        protocol: TCP

env-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: env-myapp-pod
spec:
  containers:
    - name: myapp
      image: ghcr.io/c1t1d0s7/go-myweb:alpine # MESSAGE 환경 변수가 있으면 해당 변수의 값을 출력메세지로 사용하도록 만들어짐
      ports:
      - containerPort: 8080
        protocol: TCP
      env:
      - name: MESSAGE
        value: "Customized Hello World"  # image 내부의 내용 변경 


Configmap


명령어 key-value 로 지정

kubectl create cm test-cm --from-literal KEY=hello

명령어 file 로 지정

kubectl create cm host-cm --from-file /etc/hosts

yaml 파일로 작성

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config4
data:
  key: value1
  key2: value2
  kye4: value4

pod에 configmap 포함하여 생성

configmap 생성

apiVersion: v1
kind: Pod
metadata:
  name: env-myapp-pod-cm
spec:
  containers:
    - name: myapp
      image: ghcr.io/c1t1d0s7/go-myweb:alpine
      imagePullPolicy: IfNotPresent
      ports:
      - containerPort: 8080
        protocol: TCP
      env:
      - name: MESSAGE
        valueFrom:
          configMapKeyRef:
            name: custom-img
            key: message
#      args:
#        - -port=$portnumber

cofigmap 이 잘 적용된 것을 확인할 수 있음


configmap volume 으로 적용하기

apiVersion: v1
kind: Pod
metadata:
  name: test-cm-mount
spec:
  containers:
    - name:  test
      image: busybox
      command:
        - sleep
        - Infinity
      imagePullPolicy: IfNotPresent
      volumeMounts:
        - name: cm-vol
          mountPath: /mnt[/filename] # 개별 파일 마운트
#          subPath: filename	#개별 파일로 인식
  volumes:
    - name: cm-vol
      configMap:
        name: host-cm

디렉토리나 파일이 존재하지 않는 경우 마운트할 때 생성하고 마운트해줌

/mnt 에 기존 파일이 존재한다면 마운트 된 상태에서는 사용할 수 없음
디렉토리 전체에 마운트하지 말고, 개별 파일로 마운트할 수 있음

0개의 댓글

관련 채용 정보