본문 바로가기
Backend MLOps/On-premise setting

[k8s] NFS 기반 PersistentVolume 직접 구축하기 - 2

by SteadyForDeep 2023. 9. 2.
반응형

 

 

이 글은 아래 시리즈의 의존성을 가진다.

2023.03.01 - [Backend MLOps/On-premise setting] - [k8s] 쿠버네티스 찍먹 - 1

 

[k8s] 쿠버네티스 찍먹 - 1

우선은 http://www.yes24.com/Product/Goods/102099414 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 - YES24 실무에 바로 적용할 수 있는 컨테이너 인프라 환경 기술!IT 자원을 효율적으로 빠르게 사용할

davi06000.tistory.com

2023.08.17 - [Backend MLOps/On-premise setting] - [k8s] kubeadm 을 이용해서 싱글노드 쿠버네티스 환경 구축 - 1

 

[k8s] kubeadm 을 이용해서 싱글노드 쿠버네티스 환경 구축 - 1

최근 흥미로운 주제가 생겨서 이 시리즈를 적어 본다. 싱글 노드 쿠버네티스를 구성하는 방법은 여러가지가 있다. 쿠버네티스 연습이 필요한 경우 혹은 회사에서 쿠버네티스 환경을 구축해야하

davi06000.tistory.com

2023.08.27 - [Backend MLOps/On-premise setting] - [k8s] 라즈베리파이 클러스터링 -1

 

[클러스터링] 라즈베리파이 클러스터링 -1

라즈베리파이를 4대 사왔다. 연결해서 클러스터링을 연습 해보려고 한다. 필요한 준비물은 아래와 같다. 1. 라즈베리파이 2대 이상 2. microSD card 같은 수량 3. microSD card 리더기 4. hdmi to mini hdmi 케이

davi06000.tistory.com

2023.09.02 - [Backend MLOps/On-premise setting] - [k8s] NFS 기반 PersistentVolume 직접 구축하기 - 1

 

[k8s] NFS 기반 PersistentVolume 직접 구축하기 - 1

이 글은 아래의 시리즈에 의존성을 가진다. 2023.08.27 - [Backend MLOps/On-premise setting] - [k8s] 라즈베리파이 클러스터링 -1 [클러스터링] 라즈베리파이 클러스터링 -1 라즈베리파이를 4대 사왔다. 연결해

davi06000.tistory.com

 

3. nfs pv를 클러스터에 구현하기

 

클러스터 마스터 노드로 가 준다.

이제 아래와 같이 pv 를 클러스터에 생성해 준다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: kube-data
spec:
  capacity:
    storage:
      10Gi
  accessModes:
    - ReadWriteOnce
  storageClassName:
    nfs-pv
  nfs:
    server:
      192.168.0.10
    path:
      "/home/manager/nfs/shared"

alias를 등록하지 않아서 저렇게 선언해 주었다.

생성된 것을 확인할 수 있다.

 

이제 프로메테우스라던지 그라파나의 저장사항을 이쪽으로 옮길 수 있다.

그러면 어떤 이유로 파드가 내려가거나 노드가 꺼지는 경우에도

설정해둔 환경을 안전하게 지킬 수 있고

모아둔 데이터가 날아가지 않도록 할 수 있다.

 

3. 파드들의 pvc 변경

 

아래와 같이 프로메테우스 상태 파일들을 바꿔준다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-deployment
  namespace: monitoring
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus-server
  template:
    metadata:
      labels:
        app: prometheus-server
    spec:
      containers:
      - name: prometheus
        image: prom/prometheus:latest
        securityContext:
          runAsUser: 1000  # UID
          runAsGroup: 1000 # GID
        ports:
        - containerPort: 9090
        args:
          - "--config.file=/etc/prometheus/prometheus.yml"
          - "--storage.tsdb.path=/prometheus"
        volumeMounts:
        - name: prometheus-data
          mountPath: /prometheus
        - name: prometheus-configmap
          mountPath: /etc/prometheus
      volumes:
      - name: prometheus-data
        persistentVolumeClaim:
          claimName: prometheus-nfs-pvc
      - name: prometheus-configmap
        configMap:
          name: prometheus-configmap

 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: prometheus-nfs-pvc
  namespace: monitoring
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: prometheus-nfs-pv

 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: monitoring-data
spec:
  capacity:
    storage:
      1Gi
  accessModes:
    - ReadWriteOnce
  storageClassName:
    prometheus-nfs-pv
  nfs:
    server:
      192.168.0.10
    path:
      "/home/manager/nfs/shared/prometheus/"

 

이렇게 해 주고 중요한 점은 nfs 서버에 "/home/manager/nfs/shared/prometheus/" 가 없다면 만들어 줘야 한다는 것이다.

위의 선언들로는 해당 경로를 만들 수 없다.

 

이런식으로 경로문제가 발생하면 경로를 직접 만들어주고

파드를 지워서 다시 시작하면 된다.

프로메테우스의 정보가 nfs 노드에 잘 저장되고 있다.

 

이런걸 보면 참 경이로운 툴이라는 생각이 든다.

 

그라파나도 수정해 주자.

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana
  namespace: monitoring
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      name: grafana
      labels:
        app: grafana
    spec:
      containers:
      - name: grafana
        image: grafana/grafana:latest
        ports:
        - name: grafana
          containerPort: 3000
        resources:
          limits:
            memory: "1Gi"
            cpu: "1000m"
          requests:
            memory: 500M
            cpu: "500m"
        volumeMounts:
          - mountPath: /var/lib/grafana
            name: grafana-storage
          - mountPath: /etc/grafana/provisioning/datasources
            name: grafana-datasources
            readOnly: false
      volumes:
        - name: grafana-storage
          persistantVolumeClaim:
            claimName: grafana-pvc
        - name: grafana-datasources
          configMap:
              defaultMode: 420
              name: grafana-datasources

 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: grafana-pvc
  namespace: monitoring
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: grafana-nfs-pv

 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: monitoring-data
spec:
  capacity:
    storage:
      1Gi
  accessModes:
    - ReadWriteOnce
  storageClassName:
    grafana-nfs-pv
  nfs:
    server:
      192.168.0.10
    path:
      "/home/manager/nfs/shared/grafana"

처음에 이렇게 해주면 그라파나의 권한 오류가 발생한다.

 

GF_PATHS_DATA='/var/lib/grafana' is not writable.
You may have issues with file permissions, more information here: http://docs.grafana.org/installation/docker/#migrate-to-v51-or-later
mkdir: can't create directory '/var/lib/grafana/plugins': Permission denied

그 이유는 그라파나 유저가 nfs서버의 쓰기권한 밖에 있기 때문이다.

따라서 nfs 서버로 가서 grafana가 쓰기동작을 할 디렉토리에 권한을 준다.

그라파나의 유저는 기본적으로 472 group id, 472 user id 를 가지므로 아래처럼 설정을 해준다.

 

sudo chown -R 472:472 /path/to/nfs/share/grafana

이렇게 설정이나 데이터를 저장해야

만들어둔 데시보드가 날아가지 않고 그대로 유지된다.

그리고 그라파나의 유저를 만들어도 그대로 유지된다.

 

100 * (1 - sum by(instance) (rate(node_cpu_seconds_total{mode="idle"}[$__rate_interval])) / 4)

 

위와 같은 쿼리를 수행하는 그라파나 데시보드를 만들어 보자.

 

전반적으로 마스터 노드의 cpu 점유율이 높게 나오고 파드가 뜬 노드의 cpu 사용량이 높아졌다가 감소한 것을 볼 수 있다.

 

이제 이 설정을 유지하는지 그라파나 파드를 지워보자.

 

이렇게 파드를 지우고 새로 띄워도

 

그라파나의 상태가 유지되는 것을 볼 수 있다.

 

반응형

댓글