Setup Raspberry Pi for Kubernetes Cluster
Tags: raspberrypi, kubernetes
Published: 2021-10-15 11:02:23

---
title: Setup Raspberry Pi for Kubernetes Cluster
published: true
description: วิธีการติดตั้ง Raspberry Pi และลง Kubernetes แบบ step by step 
tags: raspberry, kubernetes
//cover_image: https://direct_url_to_image.jpg
---

## Why run Kubernetes on Raspberry Pi

- การรัน Kubernetes ด้วย Raspberry Pi น่าจะให้ความรู้ผมมากกว่าการไปรันบน Katacoda หรือ GCP เพราะจะได้เจอปัญหาจริงๆ ในการ setup ลงบน machine จริงๆ ไม่ว่าจะเป็นเรื่องของ version หรือ dependency ต่างๆ

- การรันโปรแกรมบน Raspberry Pi (ต่อไปจะใช้คำว่า Pi เพื่อลดจำนวนการกดคีบอร์ด) ทำให้เราคิดถึงเรื่องปริมาณที่จำกัดของ resource และ dependency เยอะมากๆ เพราะของหลายๆอย่างที่รันได้บน cloud ทั่วๆไป มันรันไม่ได้บน Pi เช่น kubectl (ใน Pi4 เจอ error ว่าไม่รองรับ armhf ซึ่งเข้าใจว่าเป็น CPU ของ Pi4)

- ในระยะยาว เอา development environment มาลง Pi Cluster น่าจะประหยัดเงินช่วยได้เยอะ 

- มีโปรแกรมหลายๆตัวที่รันบน Cloud แล้วเปลืองมากๆ เช่น Open Faas หรือจะลอง Database ใหม่ๆบางตัว เช่น CockroachDB ถ้ามี Pi Cluster แล้ว ก็ลองเล่นได้แบบไม่เสียเงินเยอะ

## Preparation 

- แน่นอนว่าต้องซื้อ Pi ก่อนรุ่นที่แนะนำคือ Pi 4 ซึ่งจะมี Ram ให้เลือก 4GB และ 8GB เลือกเอาที่สบายใจ

- power adapter 

- SD card สำหรับลง Raspbian OS (สามารถซื้อมาพร้อมกับ Pi ได้เลย)

- SD card reader สำหรับ install Raspbian OS ผ่าน Notebook (สามารถซื้อมาพร้อมกับ Pi ได้เลย)คนที่มี Mac Pro รุ่นใหม่ก็น่าจะลำบากหน่อย ต้องไปหา adapter มาเพิ่ม สำหรับผมโชคดีที่ยังมี Mac Air ปี 2013 ซึ่งมีช่องให้เสีย SD card reader อยู่แล้ว

- Argon case (optional)เคสสำหรับใส่ Pi เป็นเคสที่ดูดีและแพงพอๆกับ Pi 4 4GB เลย

- SSD card  (optional)ถ้าซื้อ Argon case มาด้วย มันจะมีช่องให้เสียบ SSD card ก็จะได้ storage เพิ่ม ซึ่งดีกว่าการใช้  SD card แน่นอนอยู่แล้ว

## Setup Raspberry Pi

การติดตั้ง Pi มี 2 วิธีคือ 
1. install ผ่าน monitor 
2. headless install คือเปิดมาใช้งานผ่าน ssh เลยซึ่งผมใช้วิธีนี้

ทั้ง 2 วิธีนี้ต้องเตรียม Raspbian OS ผ่าน SD card เหมือนกันหมด

ขั้นตอน

1) ไปเอา Raspbian image มาจาก https://www.raspberrypi.org/software/operating-systems/ 

2) ใช้โปรแกรม etcher ในการ flash SD card (เหมือนๆกับตอนที่เราจะ write CD … รู้สึกแก่)
https://www.balena.io/etcher/ คือพอเสียบ SD card ไปแล้วมันจะขึ้นมาให้เลือก image เพื่อทำ flash เลย

จบขั้นตอนการเตรียม Raspbian OS 
ตอนนี้ผมได้ SD card ที่มี Raspbian OS แล้ว

3) สำหรับขั้นตอนถัดไปคือเข้าไป edit config ใน SD เพื่อบอกให้ Pi ต่อ wifi ตัวไหนในบ้านเรา

4) สร้างไฟล์ `ssh` ที่ root ของ SD (ไฟล์นี้น่าจะมีอยู่แล้วนะ)

5) สร้างไฟล์ `wpa_supplicant.conf` ที่ root ของ SD ข้อมูลในไฟล์จะเป็นดังนี้

```conf
country=US
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="NETWORK-NAME"
    psk="NETWORK-PASSWORD"
}
```

ซึ่ง `NETWORK-NAME` คือ ชื่อของ wifi ที่เราต้องการใช้ Pi ต่อ และ `NETWORK-PASSWORD` คือ password ที่ใช้ connect wifi นั่นเอง

6) เอา SD เสียบเข้า Pi แล้วต่อ power adapter เลยเจ้า Pi จะ connect กับ wifi ที่เรากำหนดไว้ใน `wpa_supplicant.conf`

7) ทีนี้เราต้อง ssh เข้าไปใน Pi ซึ่งเราจำเป้นจะต้องรู้จัก IP ของ Pi ก่อนสำหรับ OSX เราใช้โปรแกรม IP Scanner https://apps.apple.com/th/app/ip-scanner/id404167149?mt=12 
ซึ่งพอเปิดโปรแกรม มันจะลิสรายการ device ภายใน network ของเราทั้งหมด เราจะเจอ ip ของ Pi ภายใต้ชื่อ Raspberry Pi

8) พอได้ ip มาแล้ว เพื่อไม่ให้ Pi ของเราได้ ip ชุดใหม่ เราควรจะต้องทำ static ip ซึ่งเราสามารถไปค้นหาวิธีทำได้ใน google เลย เช่นผมที่ใช้ True ก็จะหาว่า "True wifi add static ip"

9) เมื่อทำ static ip แล้วก็สร้าง domain mapping ใน `/etc/hosts` 

```
127.0.0.1    localhost
192.168.1.41 pi-master.local
```

อันนี้สมมุติว่าผมมี Pi ip = `192.168.1.41` และจะใช้ domain เป็น `pi-master.local`

10) ssh เข้า Pi ซึ่งมันจะถามหา password โดย default password คือ raspberry

```
ssh pi@pi-master.local
```

## Update and Upgrade 

เป็นประเพณี เมื่อเราได้ server ใหม่ เราควรจะต้อง update repo

```
sudo apt update && sudo apt upgrade -qy --no-install-recommends
sudo apt install rpi-eeprom  -y
sudo reboot
```

และ reboot เพื่อความมั่นใจ 1 ที

## Install Docker 

```
curl -sSL https://get.docker.com | sh
sudo reboot
```

เป็นประเพณีของ Docker เช่นกันที่ลงแล้วต้อง reboot 

เสร็จแล้วเราควรจะเพิ่ม user เราลง docker group เพราะตามปกติเมื่อ install เสร็จ มันจะสร้าง user group สำหรับ docker runner 

```sh 
sudo usermod -aG docker $USER 
```

## install Kubernetes (k3s)

ตอนแรกพยายามจะ install official kubectl แต่ว่าได้ error ว่ามันรองรับ `armhf` (เข้าใจว่าเป็นสถาปัตยกรรม CPU ของ Pi4) จึงต้องใช้ k3s แทน

```sh
curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
k3s --version 
```

ซึ่งการรัน Kubernetes บน Pi นั้นจะต้องเพิ่ม config ใน `/boot/cmdline.txt`
โดยเพิ่ม `cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1` ลงท้ายไฟล์

ลองตรวจสอบ

```sh
k3s kubectl get node
```

ซึ่งมันควรจะคืนค่า node ของ Pi มาให้เรา

```
NAME          STATUS   ROLES                  AGE     VERSION
raspberrypi   Ready    control-plane,master   5h40m   v1.21.5+k3s2
```

ตอนนี้ผมจะได้ Pi รองรับการทำ Kubernetes Cluster ได้แล้ว

ในโพสถัดไปผมจะลองสร้าง app บน cluster ตัวนี้ และอยากจะลองใช้เครื่อง Mac เป็น work node สำหรับ cluster นี้ เพื่อจำลองการมีหลายๆ node ก่อนที่จะซื้อเคสและ Pi มาเพิ่ม :D 

---

สิ่งที่ผมคิดว่าควรจะต้องไปดูเพิ่มอีก

- security setup on Raspberry Pi ~ เพราะตอนนี้ access ด้วย default account