用 Kubernetes 替换掉了树莓派上的 docker-compose
2021-01-31 更新:多跑了几个服务,K8s 经常 100% CPU 占用,太卡了,我又换回了docker-compose。
我树莓派上的各种服务,之前大多数都是基于 docker-compose 跑起来的。 总体来说,其实还不错。不用像直接用 docker 那样需要写长长的命令行,而是把环境变量、目录挂载、端口映射等信息写在 YAML 配置文件中。
比如下面是我的 transmission 下载客户端的 docker-compose 配置文件:
pi:transmission → vim docker-compose.yml
raspberrypi:transmission → cat docker-compose.yml
---
version: "2"
services:
transmission:
image: linuxserver/transmission
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- USER=transmission
- PASS=************
volumes:
- ./config:/config
- ./downloads:/downloads
- ./watch:/watch
ports:
# web ui
- 8767:9091
# torrent port
- 8999:51413
- 8999:51413/udp
restart: unless-stopped
可以看到,非常的简洁明了。而且不出意外地,也工作得非常好。
但是这个五一假期,我做了一件事: 把 docker-compose 干掉了,用了 K8s 代替。
差不多花了整整两天来搞这么东西,遇到了大量的网络问题。非常好,我对网络(像是 ifconfig、route、ip、iptables)的熟悉程度提到了新的高度。没有白折腾。
其实,准备来说不是 K8s,而是 K3s。 K3s 和 K8s 的功能几乎一样。只是少了一些不是特别实用的功能,而且对嵌入式更友好。 比起 K8s 来说,少了很多的 CPU 和内存占用。 没错,我就是在树莓派上跑的 K3s。
下面看看我把上面的 transmission 的 docker-compose 文件转换成 k8s 的 deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: transmission
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: transmission
template:
metadata:
labels:
app.kubernetes.io/name: transmission
spec:
containers:
- name: transmission
image: linuxserver/transmission
env:
- name: PUID
value: "1000"
- name: PGID
value: "1000"
- name: TZ
value: "Asia/Shanghai"
- name: USER
value: transmission
- name: PASS
value: ************
volumeMounts:
- name: config
mountPath: /config
- name: downloads
mountPath: /downloads
- name: watch
mountPath: /watch
volumes:
- name: config
hostPath:
path: /home/pi/servers/transmission/config
type: Directory
- name: downloads
hostPath:
path: /home/pi/servers/transmission/downloads
type: Directory
- name: watch
hostPath:
path: /home/pi/servers/transmission/watch
type: Directory
---
apiVersion: v1
kind: Service
metadata:
name: transmission
spec:
type: NodePort
ports:
- name: peer-tcp
protocol: TCP
nodePort: 8999
port: 9002
targetPort: 51413
- name: peer-udp
protocol: UDP
nodePort: 8999
port: 9001
targetPort: 51413
- name: web
protocol: TCP
nodePort: 8767
port: 8767
targetPort: 9091
selector:
app.kubernetes.io/name: transmission
复杂了很多,是不是?哪个写起来更舒服?当然是 docker-compose 啊。
那么问题来了,我为什么要用 K8s 替换掉 docker-compose?
答案很简单:因为相对于 Kubernetes 来说, docker-compose 简直无人问津。
学了一项技能,但是工作上用不到,有什么用?换句话说,这项技能不能变现。白学了。 其实也没这么极端,只是目前来说,多花时间钻研 K8s(Kubernetes) 的收益远大于 docker-compose。 前几年感觉一直挺浑浑噩噩的,学了一些乱七八糟的东西。你,不要再瞎搞了。
睡觉了,这几天差不多搞了几个通宵,太累了。竟然出现了黑眼圈,而且很严重。 噢对了,明天公司为斋月节(Ramadan)搞活动,还得去值班。能调两天休那种。。。你懂我的意思吧?
晚安,おやすみ。(最近在学日语,iPhone 的键盘很好输入。)