Raspberry pi

라즈베리파이 쿨링팬 제어 쿠버네티스 데몬셋으로 실행하기 : nodejs, GPIO 접근권한

[혜안] 2022. 8. 4. 00:10
728x90

라즈베리파이에 달린 쿨링팬을 CPU 온도에 따라 제어하기 위한 모듈을 nodejs 기반으로 제작했습니다.

2022.07.29 - [분류 전체보기] - 라즈베리파이 온도에 따라 냉각팬 조절하기 : nodejs

 

라즈베리파이 온도에 따라 냉각팬 조절하기 : nodejs

 라즈베리파이4를 중고로 영입했는데, 케이스와 냉각팬을 같이 주셨네요. 원래는 생각이 없었다가 꽁짜로 생겼으니 일단 달아보았는데요. 냉각팬이 생각보다 소음이 크더라구요. 온도가 높을

viewise.tistory.com

 

그리고 이걸 도커로 올렸었구요.

2022.07.31 - [Raspberry pi] - 라즈베리파이 쿨링팬 제어 nodejs 도커로 실행하기 :GPIO 접근권한

 

라즈베리파이 쿨링팬 제어 nodejs 도커로 실행하기 :GPIO 접근권한

쿨링팬 제어하는 nodejs 모듈을 열심히 만들었고, 이제 상시 돌아가도록 쿠버네티스 daemon으로 등록해야 합니다. 그 전에 일단 도커 이미지화를 해야 쿠버네티스에 올릴 수 있으니 도커 이미지부

viewise.tistory.com

 

구지 도커로 올린건 쿠버네티스에 데몬셋으로 실행해서, 

나중에 쿠버네티스 클러스터에 추가될 라즈베리파이들에서 자동으로 실행되도록 하기 위함이었습니다.

쿠버네티스는 일단 싱글노드로 설치했습니다.

2022.08.03 - [Raspberry pi] - 라즈베리파이4 쿠버네티스 설치

 

라즈베리파이4 쿠버네티스 설치

결국 라즈비안 64bit를 포기하고 32bit로 설치를 진행했습니다. 설치한 버전은 PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)" NAME="Raspbian GNU/Linux" VERSION_ID="11" VERSION="11 (bullseye)" VERSION_CO..

viewise.tistory.com

우여곡절이 많았지만 성공했죠.

 

이제 드디어 쿨링팬 제어를 쿠버네티스 데몬셋 기반으로 할 수 있게 되었습니다.

 

우선 yaml 파일을 만들어야 겠죠.

docker hub 레포지토리에 올린 이미지를 기반으로 yaml 파일을 작성합니다.

$ k create deployment fan-controller --image=becans/fan_controller:armv7.v0.1 --dry-run=client -o yaml > fan_controller_daemon.ya
ml

 

파일을 열어서 수정을 해줍니다.

$ vi fan_controller_daemon.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  creationTimestamp: null
  labels:
    app: fan-controller
  name: fan-controller
spec:
  selector:
    matchLabels:
      app: fan-controller
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: fan-controller
    spec:      
      containers:
      - image: becans/fan_controller:armv7.v0.1
        name: fan-controller-2jfd5
        securityContext:
          privileged: true
        volumeMounts:
          - name: gpiopath
            mountPath: /sys
      volumes:
      - name: gpiopath
        hostPath:
          path: /sys
          type: Directory

Deployment 관련 옵션은 빼주고, 

권한 상승을 위한 privileged와 volume 공유 옵션을 넣어줍니다. GPIO 제어를 해야하니까요.

 

그리고 현재는 싱글노드이므로 마스터노드에서 pod들이 실행되어야 합니다.

마스터노드의 taints를 모두 빼줍니다.

우선 현재 taints를 확인하고,

$ k describe node raspberrypi4
.
.
.
Taints:             node-role.kubernetes.io/control-plane:NoSchedule
                    node-role.kubernetes.io/master:NoSchedule
.
.
.

제거해줍니다.

$ k taint nodes raspberrypi4 node-role.kubernetes.io/control-plane-
node/raspberrypi4 untainted
$ k taint nodes raspberrypi4 node-role.kubernetes.io/master-
node/raspberrypi4 untainted

 

이제 데몬셋을 실행합니다.

$ k apply -f fan_controller_daemon.yaml

$ k get pod
NAME                   READY   STATUS    RESTARTS   AGE
fan-controller-pzt4f   1/1     Running   0          8s

 

실행에 성공했고, 쿨링팬도 돌아가네요.

그래도 pod 안에 들어가서 로그를 확인해봐야겠죠.

$ k exec -it fan-controller-pzt4f bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@fan-controller-pzt4f:/usr/src/app# tail -f logs/fan_controller.2022-08-03.log
{"level":"info","message":{"contents":[["read config file!!"]],"timestamp":"2022-08-03 15:01:46"}}
{"level":"info","message":{"contents":[["running_sec",300]],"timestamp":"2022-08-03 15:01:46"}}
{"level":"info","message":{"contents":[["interval_sec",30]],"timestamp":"2022-08-03 15:01:46"}}
{"level":"info","message":{"contents":[["cpu temperture",54.53,0]],"timestamp":"2022-08-03 15:01:46"}}
{"level":"info","message":{"contents":[["cpu temperture",54.53,0]],"timestamp":"2022-08-03 15:02:16"}}
{"level":"info","message":{"contents":[["cpu temperture",55.017,1]],"timestamp":"2022-08-03 15:02:46"}}

 

잘 동작하고 있습니다.

 

일단 소기의 목적은 달성했구요, 

다음엔 config map을 사용해서 팬 동작 시간과 온도, 체크주기 등을 설정하는 작업을 추가로 해볼 계획입니다.

728x90