728x90

 

시작하며

k8s환경을 구축한 이후 jupyter와 superset을 설치하였는데 이상하게 정상적으로 실행되지 않았다. 에러 로그를 추적하면서 pv, pvc, storageClass에 존재를 알게 되었고 이것을 사용해야지만 정상적으로 설치되어 사용할 수 있는 것이었다.

pv와 pvc를 활용하기 위해선 스토리지가 필요한데 온프레미스 환경에서는 네트워크 기반 스토리지를 사용한다. 대표적으로 3가지가 있다.

1. rook-ceph
2. NFS(Network File System)
3. GlusterFS

필자는 rook-ceph를 가장 많이 쓴다고 하여 이것에 대한 것만 알아보았고 나머지는 잘 모른다. k8s 환경에서 스토리지를 설치하는 것은 정말 신경쓸 것이 많았다. 필요조건은 다음과 같다.

a. node 3개 이상
b. node 당 파티션 설정이되어 있지 않은 빈 디스크 1개 이상
 - lsblk -f 또는 df -h
c. 각 node server 8 core 이상
 - lscpu | grep "^CPU(s):" | awk '{print $2}'
d. 각 node server memory 20GB 이상
 - free -h

b. node 당 파티션 설정이되어 있지 않은 빈 디스크 1개 이상(참고자료)

이해를 돕기 위해 설치전과 후를 비교했다.

빈디스크 xvdb
ceph 설치 성공 이후 xvdb

이 조건에 해당하지 않은 상태에서 설치하였고, 안 되는 이유를 찾는 데 많은 시간이 걸렸다.. 다른 분들은 이 글을 보고 시간을 낭비하지 않길 바란다.

설치 따라하기

git clone 전에 git을 설치하자

sudo dnf install -y git
[root@docker01 ceph]# kubectl create namespace rook-ceph
[root@docker04 ceph]# cd /var/lib
[root@docker04 ceph]# git clone --single-branch --branch release-1.16 https://github.com/rook/rook.git
[root@docker04 ceph]# cd rook/deploy/examples

// rook-ceph -> namespace 생성 및 여기에 pods 실행
[root@docker04 ceph]# export ROOK_OPERATOR_NAMESPACE="rook-ceph"
[root@docker04 ceph]# export ROOK_CLUSTER_NAMESPACE="rook-ceph"
[root@docker04 ceph]# sed -i.bak \
-e "s/\(.*\):.*# namespace:operator/\1: $ROOK_OPERATOR_NAMESPACE # namespace:operator/g" \
-e "s/\(.*\):.*# namespace:cluster/\1: $ROOK_CLUSTER_NAMESPACE # namespace:cluster/g" \
-e "s/\(.*serviceaccount\):.*:\(.*\) # serviceaccount:namespace:operator/\1:$ROOK_OPERATOR_NAMESPACE:\2 # serviceaccount:namespace:operator/g" \
-e "s/\(.*serviceaccount\):.*:\(.*\) # serviceaccount:namespace:cluster/\1:$ROOK_CLUSTER_NAMESPACE:\2 # serviceaccount:namespace:cluster/g" \
-e "s/\(.*\): [-_A-Za-z0-9]*\.\(.*\) # driver:namespace:operator/\1: $ROOK_OPERATOR_NAMESPACE.\2 # driver:namespace:operator/g" \
-e "s/\(.*\): [-_A-Za-z0-9]*\.\(.*\) # driver:namespace:cluster/\1: $ROOK_CLUSTER_NAMESPACE.\2 # driver:namespace:cluster/g" \
/var/lib/rook/deploy/examples/common.yaml \
/var/lib/rook/deploy/examples/operator.yaml \
/var/lib/rook/deploy/examples/cluster.yaml
[root@docker04 ceph]# kubectl create -f crds.yaml -f common.yaml -f operator.yaml
// 꼭 rook-ceph-operator 가 STATUS = Running 인지 확인한 후 다음을 진행하자
[root@docker04 ceph]# kubectl get pods -n rook-ceph
NAME                                                 READY   STATUS      RESTARTS   AGE
rook-ceph-operator-68c44c7fc4-22cq4                  1/1     Running     0          29m
[root@docker04 ceph]# kubectl create -f cluster.yaml
NAME                                                 READY   STATUS      RESTARTS   AGE
csi-cephfsplugin-5dfv2                               3/3     Running     0          28m
csi-cephfsplugin-5whdx                               3/3     Running     0          28m
csi-cephfsplugin-provisioner-69fcc97965-p282p        6/6     Running     0          28m
csi-cephfsplugin-provisioner-69fcc97965-p47bf        6/6     Running     0          28m
csi-cephfsplugin-s2npg                               3/3     Running     0          28m
csi-rbdplugin-79msq                                  3/3     Running     0          28m
csi-rbdplugin-mc8r6                                  3/3     Running     0          28m
csi-rbdplugin-provisioner-54fdf8db4c-kj8dk           6/6     Running     0          28m
csi-rbdplugin-provisioner-54fdf8db4c-wbhvw           6/6     Running     0          28m
csi-rbdplugin-wwp22                                  3/3     Running     0          28m
rook-ceph-crashcollector-docker03-5b5896dfcd-rmcl8   1/1     Running     0          25m
rook-ceph-crashcollector-docker05-549458499b-8q2bb   1/1     Running     0          25m
rook-ceph-crashcollector-docker06-59644d6f8f-q9wsc   1/1     Running     0          25m
rook-ceph-mgr-a-575d888889-rslgh                     1/1     Running     0          25m
rook-ceph-mon-a-5bbfd67998-64lw6                     1/1     Running     0          28m
rook-ceph-mon-b-546948d4c9-gbr64                     1/1     Running     0          28m
rook-ceph-mon-d-758f494bd5-ppbtg                     1/1     Running     0          24m
rook-ceph-operator-68c44c7fc4-22cq4                  1/1     Running     0          29m
rook-ceph-osd-0-b4c745d6-crn2w                       1/1     Running     0          23m
rook-ceph-osd-1-59879b6f95-sn2sr                     1/1     Running     0          23m
rook-ceph-osd-2-7d667774f9-hklkn                     1/1     Running     0          23m
rook-ceph-osd-prepare-docker03-xrwrw                 0/1     Completed   0          23m
rook-ceph-osd-prepare-docker05-c6mfv                 0/1     Completed   0          23m
rook-ceph-osd-prepare-docker06-fndfb                 0/1     Completed   0          23m

osd까지 모두 생성된 이후 아래와 같이 cephcluster의 PHASE가 Ready이면 성공이다.

[root@docker04 ceph]# kubectl get cephcluster -n rook-ceph
NAME        DATADIRHOSTPATH   MONCOUNT   AGE   PHASE   MESSAGE                        HEALTH        EXTERNAL
rook-ceph   /var/lib/rook     3          32m   Ready   Cluster created successfully   HEALTH_WARN

HEALTH_WARN이 발생하였다. 이 경우엔 아래 toolbox 설치 후 접근하여 로그를 확인할 수 있다.

[root@docker04 ceph]# kubectl create -f toolbox.yaml
[root@docker04 ceph]# kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
[root@rook-ceph-tools-867586b448-qp5mk /]# ceph -s
  cluster:
    id:     5792cb1b-922b-4574-ba02-25aa85651499
    health: HEALTH_WARN
            clock skew detected on mon.b, mon.d
            mon d is low on available space

  services:
    mon: 3 daemons, quorum a,b,d (age 62m)
    mgr: a(active, since 25m)
    osd: 3 osds: 3 up (since 62m), 3 in (since 63m)

  data:
    pools:   1 pools, 128 pgs
    objects: 0 objects, 0 B
    usage:   19 MiB used, 220 GiB / 220 GiB avail
    pgs:     128 active+clean

에러가 2가지가 발생했다.

1. clock skew detected on mon.b, mon.d
2. mon d is low on available space

오류를 조치한 방법은 아래 게시글을 참고하기 바란다.

https://jfbta.tistory.com/290

 

[kubernetes] rook-ceph Error: clock skew detected on mon.b, mon.d

목차 결론 mon.b와 mon.d에 서버 시간이 맞지 않을 때 발생하는 에러이다. 필자는 ntp 서버를 구축하여 시간을 동기화 시켰는데 해당 서버들에 ntp 동기화 적용을 하지 않아 발생했다. 방법 1) 시간 확

jfbta.tistory.com

https://jfbta.tistory.com/289

 

[kubernetes] rook-ceph Error: mon d is low on available space

목차 결론 직역하면 mon d에 사용 가능한 공간이 부족하다는 의미다. 디스크 확보 전 Avail은 16G였다. [root@docker05 apps]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 50G 30G 16G 59% / 디스크

jfbta.tistory.com

 

rook-ceph 완전 삭제하기

[root@docker04 ceph]# cd /var/lib
[root@docker04 ceph]# cd rook/cluster/examples/kubernetes/ceph
[root@docker04 ceph]# kubectl delete -f crds.yaml -f common.yaml -f operator.yaml
[root@docker04 ceph]# kubectl delete -f toolbox.yaml

// cluster 제거를 시도하면 종속적으로 실행중인 프로세스 때문에 멈출 것이다.
[root@docker04 ceph]# kubectl delete -f cluster.yaml

----
제거 시 멈춘 경우 강제 삭제 명령어를 실행해보자.
----
// cephcluster 강제삭제
for CRD in $(kubectl get crd -n rook-ceph | awk '/ceph.rook.io/ {print $1}'); do
    kubectl get -n rook-ceph "$CRD" -o name | \
    xargs -I {} kubectl patch -n rook-ceph {} --type merge -p '{"metadata":{"finalizers": []}}'
done

// 파드 강제 삭제
kubectl delete pod --all -n rook-ceph --grace-period 0 --force

// 네임스페이스 강제 삭제
kubectl get namespace "rook-ceph" -o json \
| tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
| kubectl replace --raw /api/v1/namespaces/"rook-ceph"/finalize -f -
----
// rook-ceph를 설치할 때 git으로 받아온 폴더이다. 이것을 꼭 제거해주어야 한다.
[root@docker04 ceph]# rm -rf /var/lib/rook

// 모든 node에 있는 빈디스크 xvdb를 초기화 시키는 명령어이다. node서버에 직접 접근한 후 실행한다.
// 둘 중 하나 실행
[root@docker04 ceph]# dd if=/dev/zero of=/dev/xvdb bs=120M status=progress
[root@docker04 ceph]# dd if=/dev/random of=/dev/xvdb bs=120M status=progress

bs=120M은 네트워크 속도이기 때문에 높을 수록 빠르다.

 

여기까지 삭제를 완료했다면 다시 되돌아가 설치해서 테스트한다.

설치 완료 확인

[root@docker04 ceph]# kubectl get cephcluster -n rook-ceph
NAME        DATADIRHOSTPATH   MONCOUNT   AGE   PHASE   MESSAGE                        HEALTH        EXTERNAL
rook-ceph   /var/lib/rook     3          32m   Ready   Cluster created successfully   HEALTH_OK

HEALTH_OK가 되어야 성공이다.

PV 자동 생성 테스트

[root@docker04 /]# cd var/lib/rook/cluster/examples/kubernetes/ceph/
[root@docker04 /]# kubectl create -f csi/rbd/storageclass.yaml

pvc에서 연결을 시도할 storageclass를 생성합니다.

[root@docker04 ceph]# cd ..
[root@docker04 kubernetes]# ll
total 16
drwxr-xr-x 7 root root 4096 Mar  5 10:18 ceph
-rw-r--r-- 1 root root 1205 Mar  4 19:33 mysql.yaml
-rw-r--r-- 1 root root  129 Mar  4 19:33 README.md
-rw-r--r-- 1 root root 1303 Mar  4 19:33 wordpress.yaml
[root@docker04 kubernetes]# kubectl create -f mysql.yaml
service/wordpress-mysql created
persistentvolumeclaim/mysql-pv-claim created
deployment.apps/wordpress-mysql created
[root@docker04 kubernetes]# kubectl create -f wordpress.yaml
service/wordpress created
persistentvolumeclaim/wp-pv-claim created
deployment.apps/wordpress created

kubectl get pv,pvc로 확인하면 아래와 같은 결과가 나타날 것이다.

Every 2.0s: kubectl get pv,pvc                                                                                                                                                           Tue Mar  5 11:44:34 2024

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS      REASON   AGE
persistentvolume/pvc-00c3baf5-0c75-454b-a1ed-a9e58149dc47   20Gi       RWO            Delete           Bound    default/mysql-pv-claim   rook-ceph-block            2m47s
persistentvolume/pvc-32878213-173a-4475-89b5-e48718ee1991   20Gi       RWO            Delete           Bound    default/wp-pv-claim      rook-ceph-block            2m34s

NAME                                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
persistentvolumeclaim/mysql-pv-claim   Bound    pvc-00c3baf5-0c75-454b-a1ed-a9e58149dc47   20Gi       RWO            rook-ceph-block   2m47s
persistentvolumeclaim/wp-pv-claim      Bound    pvc-32878213-173a-4475-89b5-e48718ee1991   20Gi       RWO            rook-ceph-block   2m34s

마지막으로 Dashboard 실행 후 모니터링

[root@docker04 ceph]# kubectl edit cephcluster -n rook-ceph
(수정 전)
dashboard:
    enabled: true
    ssl: true
    
(수정 후)
dashboard:
    enabled: true
    ssl: false

https가 아닌 http로 접근해야되기 때문에 ssl을 false로 바꿔준다.

[root@docker04 ceph]# vim dashboard-loadbalancer.yaml
(수정 전)
spec:
  ports:
    - name: dashboard
      port: 8443
      protocol: TCP
      targetPort: 8443
      
(수정 후)
spec:
  ports:
    - name: dashboard
      port: 7000
      protocol: TCP
      targetPort: 7000
      
[root@docker04 ceph]# kubectl apply -f dashboard-loadbalancer.yaml

ssl을 false로 바꾸면 port가 7000이 되기 때문에 실행할 dashboard도 같이 변경해야한다.

 

kubectl edit service/rook-ceph-mgr-dashboard-loadbalancer -n rook-ceph
```
spec:
  clusterIP: 10.106.234.12
  clusterIPs:
  - 10.106.234.12
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: dashboard
    nodePort: 30900
    port: 7000
    protocol: TCP
    targetPort: 7000
  selector:
    app: rook-ceph-mgr
    mgr_role: active
    rook_cluster: rook-ceph
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}
```

대시보드에 접근하기 위해 type을 nodePort로 변경한 후 원하는 포트번호를 지정하여 수정하여 접근한다.

 

kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o yaml | grep "password:" | awk '{print $2}' | base64 --decode

Ceph ID : admin 

Password는 위 명령어를 통해 얻는다. [rook-ceph가 1.16 버전에서는 디폴트에서 패스워드를 변경하면 나중에 변경된 패스워드로 로그인할 수 없는 버그가 발생하여 디폴트를 사용하는 것을 권장함.]

728x90
TOP