
아주 아주 특별한 상황이 있습니다. 당신은 라즈베리파이에 PWM 냉각팬을 설치했습니다. 근데 팬을 어떻게 다룰지 모르겠네요. 그런 당신을 위한 유용한 도구, pifanctl이 있습니다. 여러분이 하실 일은 팬을 연결한 핀 변호를 입력하고, 원하는 온도를 입력하는 것 뿐입니다. 그럼 pifanctl이 PWM 모터를 제어하게 됩니다. 설정 온도와 보드의 온도 차가 크다면 팬은 점점 빨리 동작하고, 원하는 온도에 도달하면 천천히 멈추게 됩니다. 라즈베리파이에서 명령어로 쓸 수도 있고, 도커나 쿠버네티스에서도 쓸 수 있습니다. 이 포스팅에서는 제가 만들고 있는 오픈소스 프로젝트인 'pifanctl: Raspberry Pi Fan Controller'을 소개합니다.
✨ 1. pifanctl 소개
pifanctl은 라즈베리파이 제어를 위해 파이썬으로 만든 작은 프로젝트입니다. pifanctl은 리눅스에서 라즈베리 파이의 온도 정보을 읽고, RPi.GPIO 모듈을 이용하여 연결된 PWM 팬을 제어합니다. 아주 간단한 기능이죠. 서버처럼 실행하면 온도를 모니터링하면서 팬 속도를 제어합니다. 저는 이 기능을 사용자가 '아주 편하게' 사용하는 것에 초점을 두어 개발하였습니다.
GitHub - jyje/pifanctl: 🥧 pifanctl: A Raspberry Pi Fan Controller. A CLI for PWM Fan Controlling of Raspberry Pi
🥧 pifanctl: A Raspberry Pi Fan Controller. A CLI for PWM Fan Controlling of Raspberry Pi - jyje/pifanctl
github.com
1.1. 장점
🤔 왜 이걸 써야할까요? 라즈베리 파이를 식히기 위해 해야하는 매우 귀찮은 일들을 간편하게 해결해줍니다.
라즈베리파이는 발열에 취약한 작은 컴퓨터입니다. 따로 냉각하지 않는다면 금방 뜨거워지고 느려집니다. 그래서 냉각을 하고 싶은데요. 저는 좀 큰 PWM 녹투아 팬을 구해왔습니다. (아주 아주 특별한 환경인 것을 잘 알고 있습니다 🥹)
![]() |
![]() |
그냥 전원만 올리고 사용해도 됩니다. 그럼 팬은 24시간 최대속도로 돌아가고, 생각보다 소리가 큽니다. 저는 조용한 녹투아팬의 장점을 살려서 필요한 만큼만 돌리고 싶었어요. 그럼 컴퓨터의 온도를 알고 팬의 속도를 조절할 수 있어야 합니다. 이걸 코드로 짜는 건 AI 도구로 어렵지 않겠지만, 매우 귀찮은 일이죠. 또, 라즈베리 파이를 초기화 할 때마다 설정을 다시해줘야 합니다 🧐🧐
이 프로젝트는 앞서 설명드린 과정을 간편하게 할 수 있는 도구입니다. 원하는 온도를 설정하면 모니터링을 시작합니다. 그리고 뜨거운 컴퓨터를 식혀주고 목표 온도에 도달하면 팬을 종료합니다.
그럼 본격적으로 소개드리겠습니다.
1.2. 지원 환경
라즈베리파이에서 실행할 수 있습니다. 일반 리눅스에서는 명령어 테스트만 가능합니다.
사용 환경은 다음과 같습니다.
- 명령어: 코드를 직접 실행시킬 수 있고, CLI 처럼 설치하여 사용할 수 있습니다.
- 컨테이너: 컨테이너 환경에서도 쓸 수 있습니다. 도커와 쿠버네티스에서 사용할 수 있습니다.
이 프로젝트는 단일 라즈베리 파이부터 클러스터로 구성된 라즈베리 파이 모두를 지원하는 프로젝트 입니다. 물리적인 사용 환경이 특별하기 때문에, 사용자가 최대한 편하게 쓸 수 있도록 고민하였습니다.
🔧 2. 설치법
최신 설치법은 프로젝트의 README에 소개되어 있습니다. 이 포스팅에서는 한국어로 간단히 다시 소개드립니다.
아래 설치법 중 하나를 선택하시면 됩니다. 모두 설치할 필요 없어요!
2.1. 단일 라즈베리 파이: 커맨드라인 (CLI) 설치법
라즈베리 파이에서 직접 실행하거나, SSH로 접속합니다. 다음 명령어를 실행해주세요:
curl -fsSL https://raw.githubusercontent.com/jyje/pifanctl/main/install.sh -o install-pifanctl.sh
chmod +x install-pifanctl.sh
./install-pifanctl.sh
rm install-pifanctl.sh
실행이 끝나면
pifanctl --help
명령어로 사용법을 볼 수 있습니다. 도움말은 오픈소스인 typer를 이용하여 세련되게 만들고자 했습니다.
지금은 `status`, `start` 명령어를 쓸 수 있습니다. `enable`, `disable`으로 demon 설정을 추가할 예정이고, `config`로 설정 저장을 지원할 계획입니다.
`start` 명령어에 대한 도움말은 다음과 같습니다.
팬을 작동하는 예시는 다음과 같습니다.
pifanctl start --pwm-refresh-interval 2 --target-temperature 40
위 과정들이 직접 스크립트로 작성하는 번거로움을 줄여줍니다.
2.2. 단일 라즈베리 파이: 도커 실행법
도커를 이용하면 설치없이 pifanctl을 바로 쓸 수 있습니다. 라즈베리 파이에 도커를 설치한 다음 명령어를 실행합니다.
docker run --privileged -it ghcr.io/jyje/pifanctl python main.py start --help
CLI 방식과 동일한 명령어로 쓸 수 있습니다. 현재는 도커 명령어에서 `pifanctl` 대신 `python main.py` 라는 명령어를 사용해야 합니다.
현재 시스템 정보를 가져오기 위해서 `--privileged` 옵션을 사용합니다. 이는 보안 취약점이 될 수 있기 때문에, 사용하지 않고도 시스템 정보를 불러올 수 있게 개선할 계획입니다.
도커를 이용해 팬을 동작시키는 예제는 다음과 같습니다.
docker run --privileged -it ghcr.io/jyje/pifanctl python main.py start --pwm-refresh-interval 2 --target-temperature 40
2.3. 다중 라즈베리파이: 쿠버네티스 실행법
쿠버네티스에서도 pifanctl을 쓸 수 있습니다. 쿠버네티스에서 다음 명령어를 실행합니다.
kubectl create namespace pifanctl
kubectl apply -n pifanctl -f https://raw.githubusercontent.com/jyje/pifanctl/main/k8s/manifests/deployments.yaml
그리고 파드의 로그를 확인하면 다음과 같이 동작하는 것을 볼 수 있습니다.
쿠버네티스 Deployments 리소스의 구성은 다음과 같습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: pifanctl
spec:
selector:
matchLabels:
app: pifanctl
template:
metadata:
labels:
app: pifanctl
spec:
containers:
- name: main
image: ghcr.io/jyje/pifanctl:latest
command: ["python", "main.py", "start"]
## 환경변수를 통해 동작 설정을 할 수 있습니다.
env:
- name: PIN
value: "18"
- name: LOG_LEVEL
value: INFO
- name: PWM_REFRESH_INTERVAL
value: "30"
- name: TARGET_TEMPERATURE
value: "50"
resources:
limits:
memory: 128Mi
cpu: 500m
securityContext:
privileged: true
## INFO: 노드가 여러 대일 경우 팬이 연결된 라즈베리파이를 nodeSelector로 선택해야 합니다.
# nodeSelector:
# kubernetes.io/hostname: raspi-40 # change to your own hostname
위 리소스를 원하는 환경에 맞게 커스텀하시면 됩니다. Argo CD를 이용하여 배포할 수도 있습니다.
아직 헬름차트는 개발의 필요가 없어 보입니다. 매니페스트만으로도 충분히 커스텀할 수 있습니다.
🛣️ 3. pifanctl 기획/로드맵
이걸 만들게 된 이유와 기획에 대해서 간단히 말씀드리고 포스팅을 마치겠습니다.
3.1. 이유
이 프로젝트를 시작한 이유입니다.
- 단기 프로젝트: 개인적인 사정으로 최근 2달 정도 몹시 바빴습니다. 이제는 정리되어서 다음 일을 시작하기 전, 단기 프로젝트를 진행하고 싶었습니다. 배포할 수 있게 마무리 할 수 있어서 기쁘네요.
- 숙련도 키우기: 저는 GitHub을 그리 잘 하지 않았습니다. GitHub Actions, Fork & PR, API Secret 같은 것들을 알고는 있지만, 숙달하지는 못했거든요. 자신있게 '저 깃헙 잘 써요'라고 말하긴 어려웠습니다. GitHub의 생태계의 여러 기능을 반복해서 사용해보고 싶었습니다. 그래서 지금은 잘 하냐구요? 한참 멀었습니다 ☺️
- 홈랩 가꾸기: 라즈베리 파이로 구성된 홈랩 쿠버네티스에서 GitHub ARC를 이용한 CI, Argo CD를 이용한 CD를 모두 지원하고 싶었습니다. 개발 과정에서 GitHub ARC를 적극 사용했습니다.
3.2. 기획
라즈베리 파이에서 GPIO를 이용해 PWM 팬을 제어하는 최소가치상품(MVP)을 만들었습니다. 그리고 CI/CD를 위한 환경을 구성했습니다.
- MVP 완성: 작은 기능을 수행하는 앱을 만들고, 배포, 업그레이드 까지 가능한 완성품을 만들었습니다. 성공 경험을 해보니 많은 보람이 느껴집니다.
- GitHub ARC: 이 도구는 완전 커스텀 CI 환경을 제공하는 도구입니다. RPi.GPIO 라는 pypi 패키지를 설치할 때 라즈베리 파이가 아니면 실패하였습니다. 따라서 라즈베리 파이 클러스터에 GitHub ARC를 설치하여 CI/CD를 수행할 수 있도록 하였습니다. 이번에 공부를 했으니 향후 업무에 적극 도입하고 싶습니다.
GitHub - actions/actions-runner-controller: Kubernetes controller for GitHub Actions self-hosted runners
Kubernetes controller for GitHub Actions self-hosted runners - actions/actions-runner-controller
github.com
3.3. 로드맵
계획 중인 추가기능은 크게 2가지 입니다.
- 단일 라즈베리 파이 추가기능: 데몬 서비스 등록/삭제를 지원하려합니다. 그럼 라즈베리 파이가 켜지면 자동으로 온도관리를 시작합니다.
- 쿠버네티스 추가기능: Prometheus 연동 혹은 정보 수집 에이전트를 개발하여, 모든 노드의 온도를 관리합니다.
- 보안이슈 해결: 컨테이너 환경에서 시스템 정보를 읽기 위해 `--privileged` 옵션을 사용하고 있습니다. 이는 보안취약점이 될 수 있습니다. `--privileged`를 사용하지 않고도 원하는 동작을 할 수 있게 합니다.
프로젝트를 키우면서 DevOps 관련 지식을 새로 배우고 적용하는 기회가 되었으면 좋겠습니다. 후속 포스팅으로 GitHub ARC 및 인프라 관련 이야기도 하고 싶네요.
읽어주셔서 감사합니다.
'DevOps' 카테고리의 다른 글
🛥️ Kind#1: 멀티 노드 클러스터 생성하는 명령어 정리 (0) | 2025.01.07 |
---|---|
⚓️ Helm#1: pull 명령어 정리 (2) | 2024.12.27 |
🧑💻 Amazon EKS Hybrid Nodes: EKS 하이브리드 노드를 리뷰합니다 (0) | 2024.12.21 |
🍩 호머(Homer)#2: 호머로 만든 쿠버네티스 네이티브 대시보드를 소개합니다 (0) | 2024.11.26 |
🐙 GitOps#2: Argo CD와 Git으로 커스텀 차트 배포하기 (2) | 2024.11.25 |
어제보다 오늘 더 공부 잘하는 코딩냥이. 어제보다 오늘 더 일 잘하는 코딩냥이.
포스팅이 좋았다면, 오류를 발견했다면, 더 좋은 아이디어가 있다면 댓글 부탁드립니다!