일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 트림원라이트
- 볼륨할당
- zwift
- 즈위프트
- 외부에서접근설정
- 라즈베리파이4B
- 스토리지할당
- 신호드랍
- 쯔위프트
- 원격접속설정
- raspberrypie4b
- 자바스크립트
- 외부볼륨
- config.js
- 모듈구조
- 신호끊김
- 트림원라이트이슈
- k8s
- magicmirro
- 콕스엔데버
- 매직미러
- 글자사라짐
- magicmirror
- 검색엔진노출
- 라즈베리파이
- Kubernetes
- 모듈추가
- 거절메일
- 관리노드설정
- 쿠버네티스
- Today
- Total
IT를 공부하자
Kubernetes NFS CSI 드라이버 설치 본문
Kubernetes의 볼륨 서비스
Kubernetes 환경을 운용하기 위해서는 container 상에 동작하는 데이터에 대한 상태를 영구적으로 저장할 수 있는 외부 스토리지가 필수이다. container 자체의 로컬 볼륨은 container가 종료되면 볼륨의 내용도 초기화되기 때문에 무엇인가를 저장하기 위한 목적이라면 외부의 볼륨 서비스는 필수이다.
Kubernetes에 외부 볼륨을 서비스하기 위해서는 해당 스토리지에서 CSI 드라이버를 제공해야 kubernetes와 연동해서 사용할 수 있다.
NFS CSI 드라이버
아래 Kubernetes 공식 홈페이지에서 CSI 드라이버를 제공하는 벤더사 목록을 확인할 수 있는데 가장 쉽게 적용해서 테스트해 볼 수 있는 NFS CSI 드라이버를 설치해 보자. 단, NFS CSI 드라이버는 볼륨스냅샷을 지원하지 않기 때문에 데이터를 백업 솔루션과 연동하여 백업하는 용도로는 적합하지 않으니, 단순 테스트 용도로 사용해 보자.
https://kubernetes-csi.github.io/docs/drivers.html
NFS CSI 드라이버를 설치하기 위해 참고한 사이트는 아래와 같다.
https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/docs/install-nfs-csi-driver.md
테스트 구성환경
테스트를 위한 구성 환경은 다음과 같다. Kubernetes 클러스터 구성은 마스터노드 1대, 워커노드 2대로 구성되어 있다.
구분 | OS | IP | 기타 |
NFS 서버 | Ubuntu 20.04 | 10.118.99.67 | /apt-mirror |
k8s master 노드 | Ubuntu 20.04 | 10.118.99.71 |
external CSI 드라이버 설치
모든 CSI 드라이버를 설치하기 이전에 반드시 external CSI 드라이버를 설치해야 정상적으로 PV, PVC가 생성되어 볼륨을 사용할 수 있다.
git 명령어로 아래 사이트의 external snapshotter 소스를 복제한다.
root@kuber01:/home/emc# git clone https://github.com/kubernetes-csi/external-snapshotter/
Cloning into 'external-snapshotter'...
remote: Enumerating objects: 52014, done.
remote: Counting objects: 100% (346/346), done.
remote: Compressing objects: 100% (276/276), done.
remote: Total 52014 (delta 55), reused 303 (delta 41), pack-reused 51668
Receiving objects: 100% (52014/52014), 66.26 MiB | 808.00 KiB/s, done.
Resolving deltas: 100% (27043/27043), done.
Updating files: 100% (6312/6312), done.
복제가 완료되면 버전을 확인하고 원하는 버전의 external snapshotter를 선택하고 설치를 진행한다.
root@kuber01:/home/emc# cd ./external-snapshotter
root@kuber01:/home/emc/external-snapshotter# ls
CHANGELOG cloudbuild.yaml code-of-conduct.md deploy go.mod LICENSE OWNERS pkg release-tools vendor
client cmd CONTRIBUTING.md examples go.sum Makefile OWNERS_ALIASES README.md SECURITY_CONTACTS
root@kuber01:/home/emc/external-snapshotter# cd CHANGELOG/
root@kuber01:/home/emc/external-snapshotter/CHANGELOG# ls
CHANGELOG-1.1.md CHANGELOG-2.0.md CHANGELOG-3.0.md CHANGELOG-4.1.md CHANGELOG-5.0.md CHANGELOG-6.1.md
CHANGELOG-1.2.md CHANGELOG-2.1.md CHANGELOG-4.0.md CHANGELOG-4.2.md CHANGELOG-6.0.md README.md
root@kuber01:/home/emc/external-snapshotter/CHANGELOG# cd ..
root@kuber01:/home/emc/external-snapshotter# git checkout release-6.1
Branch 'release-6.1' set up to track remote branch 'release-6.1' from 'origin'.
Switched to a new branch 'release-6.1'
root@kuber01:/home/emc/external-snapshotter# kubectl kustomize client/config/crd | kubectl create -f -
customresourcedefinition.apiextensions.k8s.io/volumesnapshotclasses.snapshot.storage.k8s.io created
customresourcedefinition.apiextensions.k8s.io/volumesnapshotcontents.snapshot.storage.k8s.io created
customresourcedefinition.apiextensions.k8s.io/volumesnapshots.snapshot.storage.k8s.io created
root@kuber01:/home/emc/external-snapshotter# kubectl -n kube-system kustomize deploy/kubernetes/snapshot-controller | kubectl create -f -
serviceaccount/snapshot-controller created
role.rbac.authorization.k8s.io/snapshot-controller-leaderelection created
clusterrole.rbac.authorization.k8s.io/snapshot-controller-runner created
rolebinding.rbac.authorization.k8s.io/snapshot-controller-leaderelection created
clusterrolebinding.rbac.authorization.k8s.io/snapshot-controller-role created
deployment.apps/snapshot-controller created
NFS CSI 드라이버 설치
아래와 같이 마스터 노드에서 curl 명령어를 통해 설치 스크립트를 원격에서 가져와 직접 실행한다.
curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.1.0/deploy/install-driver.sh | bash -s v4.1.0 --
실행 결과는 아래와 같다.
root@kuber01:/home/emc# curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.1.0/deploy/install-driver.sh | bash -s v4.1.0 --
Installing NFS CSI driver, version: v4.1.0 ...
serviceaccount/csi-nfs-controller-sa created
serviceaccount/csi-nfs-node-sa created
clusterrole.rbac.authorization.k8s.io/nfs-external-provisioner-role created
clusterrolebinding.rbac.authorization.k8s.io/nfs-csi-provisioner-binding created
csidriver.storage.k8s.io/nfs.csi.k8s.io created
deployment.apps/csi-nfs-controller created
daemonset.apps/csi-nfs-node created
NFS CSI driver installed successfully.
설치가 정상적으로 완료되면 아래와 같이 POD 정보를 확인해서 배포 상태를 모니터링한다.
root@kuber01:/home/emc# kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
csi-nfs-controller-679b6d5754-4pd9c 0/3 ContainerCreating 0 20s 10.118.99.72 kuber02 <none> <none>
root@kuber01:/home/emc# kubectl -n kube-system get pod -o wide -l app=csi-nfs-node
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
csi-nfs-node-67szt 0/3 ContainerCreating 0 25s 10.118.99.71 kuber01 <none> <none>
csi-nfs-node-cm68z 0/3 ContainerCreating 0 25s 10.118.99.72 kuber02 <none> <none>
csi-nfs-node-h255x 0/3 ContainerCreating 0 25s 10.118.99.73 kuber03 <none> <none>
배포가 완료되면 최종적으로 아래와 같이 모든 POD가 Running 상태이다.
root@kuber01:/home/emc# kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
csi-nfs-controller-679b6d5754-4pd9c 3/3 Running 0 4m48s 10.118.99.72 kuber02 <none> <none>
root@kuber01:/home/emc# kubectl -n kube-system get pod -o wide -l app=csi-nfs-node
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
csi-nfs-node-67szt 3/3 Running 0 4m54s 10.118.99.71 kuber01 <none> <none>
csi-nfs-node-cm68z 3/3 Running 0 4m54s 10.118.99.72 kuber02 <none> <none>
csi-nfs-node-h255x 3/3 Running 0 4m54s 10.118.99.73 kuber03 <none> <none>
볼륨 할당 테스트
이제 모든 드라이버가 설치가 완료되었으므로 샘플 App을 배포하여 실제로 NFS 서버에 볼륨이 생성되고 앱에 할당되는지를 테스트해보자. nginx 웹서버를 기동하고 웹서버에 10Gi 볼륨을 NFS CSI 스토리지 클래스를 호출하여 동적으로 할당하도록 설정하고 배포를 진행한다. 그리고 nginx 웹서버가 할당된 볼륨에 로그를 찍도록 하였다.
root@kuber01:/home/emc# vi nginx-deployment.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-deployment-nfs
spec:
accessModes:
- ReadWriteMany # In this example, multiple Pods consume the same PVC.
resources:
requests:
storage: 10Gi
storageClassName: nfs-csi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nfs
spec:
replicas: 1
selector:
matchLabels:
name: deployment-nfs
template:
metadata:
name: deployment-nfs
labels:
name: deployment-nfs
spec:
nodeSelector:
"kubernetes.io/os": linux
containers:
- name: deployment-nfs
image: mcr.microsoft.com/oss/nginx/nginx:1.19.5
command:
- "/bin/bash"
- "-c"
- set -euo pipefail; while true; do echo $(hostname) $(date) >> /mnt/nfs/outfile; sleep 1; done
volumeMounts:
- name: nfs
mountPath: "/mnt/nfs"
volumes:
- name: nfs
persistentVolumeClaim:
claimName: pvc-deployment-nfs
root@kuber01:/home/emc# kubectl create -f nginx-deployment.yaml
persistentvolumeclaim/pvc-deployment-nfs created
deployment.apps/deployment-nfs created
할당된 pv, pvc 정보를 확인한다. 정상적으로 할당된 것을 확인할 수 있다.
root@kuber01:/home/emc# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-deployment-nfs Bound pvc-eb866fed-9dd6-49c9-89d3-f8af14cc43d4 10Gi RWX nfs-csi 4s
root@kuber01:/home/emc# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-eb866fed-9dd6-49c9-89d3-f8af14cc43d4 10Gi RWX Delete Bound default/pvc-deployment-nfs nfs-csi 6s
NFS 서버에서 생성된 볼륨 정보를 확인한다.
root@ubuntu2204:/apt-mirror# ls -la
total 12
drwxrwxrwx 3 emc emc 4096 Dec 27 04:04 .
drwxr-xr-x 20 root root 4096 Dec 17 06:25 ..
drwxrwxrwx 2 nobody nogroup 4096 Dec 27 04:04 pvc-eb866fed-9dd6-49c9-89d3-f8af14cc43d4
root@ubuntu2204:/apt-mirror#
간단하게 NFS CSI 드라이버를 활용하여 container 환경에 볼륨을 할당하여 구성하는 방법을 살펴보았다.
'kubernetes' 카테고리의 다른 글
인터넷 접속이 불가능한 오프라인 환경의 환경에서 Kubernetes 구성하기 (1) | 2024.01.30 |
---|---|
Visual Studio Code를 활용하여 Kubernetes Yaml 파일을 오류 없이 작성해 보자 (0) | 2023.01.06 |
외부 시스템에서 kubernetes 클러스터를 관리할 수 있도록 설정하자 (0) | 2023.01.05 |