실행
조사/학습 #12735
csi-driver-lvm 프로젝트 구성
발견 버전:
반영 버전:
난이도:
보통
중요도:
하
조력자:
회사:
연락처:
점수:
0.62
설명
개요¶
- 다양한 csi-driver 구현체를 보고 진행 가/불 과 진행된다면 어느정도 걸릴지 파악
- 1차적으로 내부 csi-driver 가 ASE 에서 지원 가능한지 확인
- metal-stack/csi-driver-lvm 을 GMS 에 맞게 재구성하고 프로젝트를 생성한다.
난이도 및 추정시간¶
- k8s 는 너무 오랜만에 보고, csi 는 개념부터 이해가 필요해서 난이도 보통
- 설치부터 막히고 있어 추정시간 17시간
추가 작업¶
- metal-stack/csi-driver 를 gms-csi-driver 로 리펙토링
- proxy 형태로 개발
- nfs 를 생성하여 배포
- helm 설치 형태
추가 작업으로 인한 추정시간¶
- controller/node 개발 및 helm chart 지정 정책 등 복합적인 구성이 필요하여 추정시간을 33시간으로 추정
- 필요시 일감을 분리할 수 있음
이 헌제님이 2달 전에 변경
- 점수 항목을 변경했습니다 (0.00 => 6.50)
기본 테스트까지 완료¶
- k8s 설치
cat << EOF > /etc/yum.repo.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
EOF
wget https://buildlogs.centos.org/c7.2003.00.x86_64/conntrack-tools/20200401021911/1.4.4-7.el7.x86_64/conntrack-tools-1.4.4-7.el7.x86_64.rpm
yum -y localinstall conntrack-tools-1.4.4-7.el7.x86_64.rpm
yum install -y kubelet kubeadm kubectl
systemctl start kubelet
- k8s 클러스터 실행
kubeadm init --pod-network-cidr=10.244.0.0/16
export KUBECONFIG=/etc/kubernetes/admin.conf
# 네트워크 플러그인 설치 (Flannel)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 마스터 노드에서도 워커 역할 수행
kubectl taint nodes localhost node-role.kubernetes.io/control-plane:NoSchedule-
- helm 설치
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm version
- metal-stack 실행
git clone https://github.com/metal-stack/csi-driver-lvm.git
cd csi-driver-lvm/charts/csi-driver-lvm
vim values.yaml
...
devicePattern: /dev/sd[b-d]
...
cd ../..
helm install csi-driver-lvm ./charts/csi-driver-lvm/
- 확인
kubectl get pods -n default
kubectl get ds -n default
kubectl apply -f examples/csi-pvc-raw.yaml
kubectl apply -f examples/csi-pod-raw.yaml
kubectl apply -f examples/csi-pvc.yaml
kubectl apply -f examples/csi-app.yaml
# pv 확인
kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
pvc-18b009b1-6c5c-4430-ae48-7f2938d2e12f 10Mi RWO Delete Bound default/csi-pvc csi-driver-lvm-linear <unset> 5m55s
# 실제 확인
lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <35.12g
swap centos -wi-a----- <3.88g
pvc-18b009b1-6c5c-4430-ae48-7f2938d2e12f csi-lvm -wi-a----- 12.00m
이 헌제님이 2달 전에 변경
동작 구조¶
- Controller , Node, CSI sidecar container 필요
- Controller : CreateVolume 등
- Node: NodePublishVolume 등(Pod 에 mount)
- sidecar:
- csi-provisioner: PVC 요청시 볼륨 생성
- csi-attacher: attach/detach 처리
- csi-resizer: PV 확장
- csi-snapshotter: 스냅샷 지원
- node-driver-registrar: k8s 에 csi-driver 등록
- livenessprobe: 상태 체크
간단 동작 흐름 예상¶
- kubectl pvc 생성 요청
- kube API
- kube controller
- kubectl call CSI
- csi driver
- ase API
이 헌제님이 약 2달 전에 변경
- 점수 항목을 변경했습니다 (5.62 => 4.38)
개발 현황¶
- https://github.com/metal-stack/csi-driver-lvm 를 gms proxy 를 통해서 진행하도록 수정
- helm 을 통해서 설치할 수 있도록 한다.
- storage-class 는 thin, thick 을 제공한다.
- storage-class 를 통해서 제공되는 볼륨은 nfs 를 통해서 접근할 수 있다.
- helm
- charts/csi-driver-lvm/values.yaml: template 에 들어갈 변수를 지정한다.
- vgName: 생성한 볼륨 그룹 이름 지정
- storageAuth: gms_token 입력
- storageVIP: GMS 에 접근가능한 네트워크 주소 입력
- driverName:
lvm.csi.gms.io - gms.io/thinpool: thinpool 이름을 지정한다. (없을 시 자동 생성)
- gms.io/thinpoolSize: thinpool 이 자동 생성될 때 크기를 지정한다.
- gms.io/networkZone: nfs 에서 사용할 네트워크 영역을 지정한다.
- charts/csi-driver-lvm/templates/storageclasses.yaml: 최신 버전 k8s 의 storageclass 를 지원한다.
- storageClasses 에서 thin, thick 볼륨을 제공하도록 한다.
- charts/csi-driver-lvm/templates/storageclasses-compat03x.yaml: 레거시 k8s 의 storageclass 를 지원한다.
- storageclasses 와 storageClassStub 지정이 다르며 나머지는 동일
- charts/daemonset.yaml
- csi-driver 의 데몬 설정을 지정한다. (제공하는 기능 등)
- 실행 명령은
args:참조
- charts/csi-driver-lvm/values.yaml: template 에 들어갈 변수를 지정한다.
- cmd
- lvmplugin/main.go : 명령을 통해 받은 정보로 controller, node, indentity 서버를 시작
- pkg
- server
- controller.go: controller 서버로 볼륨 생성, 삭제 등 시행 (nfs 생성)
- node.go: k8s 에서 publish/unpublish 진행 (targetPath 를 제공하면 생성한 nfs 로 마운트)
- driver.go: 공통 모듈, parameter 지정 (storage 는 driver.storage 형태로 정보 제공)
- identity.go: 드라이버 식별 정보 제공(변경사항 없음)
- proxy : gms api call wrapper
- api_lvm.go : LV 생성, 삭제, 확장, VG 조회 등 제공
- api_daemon.go: NFS 데몬 제어 제공
- api_lvm_snapshot.go: LV 스냅샷 생성, 삭제, 확장, 병합 제공
- api_share.go: 공유 생성/삭제, 공유 NFS 생성/삭제, 공유 NFS 네트워크 설정 생성/삭제 등 제공
- api_zone.go: zone 조회 제공
- client.go: api 서비스를 묶어서 제공
- model_body_opts.go: api 에서 body 요청이 있을 경우 제공되는 자료형
- model_*.go: api 응답에서 제공되는 자료형
- storage: driver 에서 제공하는 정보로 gms proxy 연결 (API 가 변경되면 proxy 만 변경하면 됌)
- csi-driver 에서 할 수 있는 모든 기능 제공
- server
- example
- 사용 예 제공 (현재 수정중)
- tests
- 테스트 (미 수정)
제약사항¶
- LVM
볼륨 그룹은 생성되어 있어야 한다. - LVM
볼륨 그룹은 1개 지원한다. - AnyStor-E API 및 k8s-cluster 에서 접근할 수 있는 VIP 를 제공해야 한다.
- NFS 에서 접근할 수 있는 네트워크 영역은 생성되어 있어야 한다.
- 네트워크 영역은 1개 지원한다.
미구현 사항¶
- LVM HA 제공 등
이 헌제님이 약 2달 전에 변경
Proxy 구현 정보 상세¶
- api_daemon
- NfsKernelControl
- api_lvm
- ChangeLv
- DeleteLv
- ExtendLv
- GetLv
- Response: LvmLvResponse
- Lv
- ListLv
- Response: LvmLvResponse
- Lv
- Response: LvmLvResponse
- CreateLv
- GetVg
- Response: LvmVgResponse
- Vg
- Response: LvmVgResponse
- ListVg
- Response: LvmVgResponse
- Vg
- Response: LvmVgResponse
- api_lvm_snapshot
- ActivateSnapshot
- CreateSnapshot
- DeleteSnapshot
- ExtendSnapshot
- ListSnapshot
- Response: LvmSnapshotResponse
- Snapshot
- Response: LvmSnapshotResponse
- MergeSnapshot
- api_zone
- CreateNetworkZone
- DeleteNetworkZone
- ListNetworkZone
- Response: NetworkZoneResponse
- cZone
- Response: NetworkZoneResponse
- api_share
- DisableNfs
- EnableNfs
- Response: ShareNfsResponse
- ShareSection
- ShareNfsNetwork
- ShareSection
- Response: ShareNfsResponse
- GetNfsConfig
- Response: ShareNfsConfigResponse
- NfsSetting
- Response: ShareNfsConfigResponse
- SetNfsConfig
- SetNfsNetworkAccess
- CreateShare
- DeleteShare
- ListShare
- param: ShareParamOpts
- response: ShareResponse
- Share
- UpdateShare
- api_default
- ExtendFilesystem
- FormatFilesystem
- MountFilesystem
- UnmountFilesystem
실행