raspberry-kubernetes-node

将树莓派变成Kubernetes的一个节点

前提

我在自己的主机上搭建了一个K8S集群,一个master节点,两个node节点,手边还有三个树莓派,想把他们也并到集群中。昨天我在docker中安装了docker,而kubernetes官网上也有arm的二进制文件,今天打算将这些文件配置到raspberry上,使之成为K8S集群的新节点。

需要指出的是,我原来的集群是X86_64架构的机器,raspberry是arm架构的,他们用的是不一样的镜像,在master节点需要指定不同架构的镜像给不同的node节点。

下载kubernetes node节点

本人使用的是k8s 1.8版本的(master节点是这个版本)$^{[1]}$ K8S node 节点

解压后新建文件夹:

1sudo mkdir -p /opt/kubernetes/{bin,cfg}
2sudo mv kubelet kubectl kube-proxy /opt/kubernetes/bin/

编写Kubernetes配置文件

创建kubeconfig配置文件

 1sudo vim /opt/kubernetes/cfg/kubelet.kubeconfig
 2apiVersion: v1
 3kind: Config
 4clusters:
 5  - cluster:
 6      server: http://{master 节点 IP}:8080
 7    name: local
 8contexts:
 9  - context:
10      cluster: local
11    name: local
12current-context: local

创建配置文件kubeconfig用于kubelet连接master apiserver。

创建自身配置文件

 1sudo vim /opt/kubernetes/cfg/kubelet            
 2# 启用日志标准错误
 3KUBE_LOGTOSTDERR="--logtostderr=true"
 4# 日志级别
 5KUBE_LOG_LEVEL="--v=4"
 6# Kubelet服务IP地址
 7NODE_ADDRESS="--address={本机IP}"
 8# Kubelet服务端口
 9NODE_PORT="--port=10250"
10# 自定义节点名称
11NODE_HOSTNAME="--hostname-override={本机IP}"
12# kubeconfig路径,指定连接API服务器
13KUBELET_KUBECONFIG="--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig"
14# 允许容器请求特权模式,默认false
15KUBE_ALLOW_PRIV="--allow-privileged=false"
16# DNS信息
17KUBELET_DNS_IP="--cluster-dns=172.16.76.2"
18KUBELET_DNS_DOMAIN="--cluster-domain=cluster.local"
19# 禁用使用Swap
20KUBELET_SWAP="--fail-swap-on=false"

创建systemd服务文件

 1sudo vim /lib/systemd/system/kubelet.service
 2[Unit]
 3Description=Kubernetes Kubelet
 4After=docker.service
 5Requires=docker.service
 6[Service]
 7EnvironmentFile=-/opt/kubernetes/cfg/kubelet
 8ExecStart=/opt/kubernetes/bin/kubelet \
 9${KUBE_LOGTOSTDERR} \
10${KUBE_LOG_LEVEL} \
11${NODE_ADDRESS} \
12${NODE_PORT} \
13${NODE_HOSTNAME} \
14${KUBELET_KUBECONFIG} \
15${KUBE_ALLOW_PRIV} \
16${KUBELET_DNS_IP} \
17${KUBELET_DNS_DOMAIN} \
18${KUBELET_SWAP}
19Restart=on-failure
20KillMode=process
21[Install]
22WantedBy=multi-user.target
23
24# systemctl daemon-reload
25# systemctl enable kubelet
26# systemctl restart kubelet

创建kube-proxy配置文件

1sudo  vim /opt/kubernetes/cfg/kube-proxy   
2# 启用日志标准错误
3KUBE_LOGTOSTDERR="--logtostderr=true"
4# 日志级别
5KUBE_LOG_LEVEL="--v=4"
6# 自定义节点名称
7NODE_HOSTNAME="--hostname-override={本机IP}"
8# API服务地址
9KUBE_MASTER="--master=http://{master 节点 IP}:8080"

创建proxy的systemd服务文件

 1sudo vim /lib/systemd/system/kube-proxy.service
 2[Unit]
 3Description=Kubernetes Proxy
 4After=network.target
 5[Service]
 6EnvironmentFile=-/opt/kubernetes/cfg/kube-proxy
 7ExecStart=/opt/kubernetes/bin/kube-proxy \
 8${KUBE_LOGTOSTDERR} \
 9${KUBE_LOG_LEVEL} \
10${NODE_HOSTNAME} \
11${KUBE_MASTER}
12Restart=on-failure
13[Install]
14WantedBy=multi-user.target

最后将/opt/kubernetes/bin 放到PATH变量中。

遇到问题

Failed to start ContainerManager system validation failed - Following Cgroup subsystem not mounted: [memory]

新建文件/etc/default/grub,添加:$^{[2]}$

GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

1sudo update-grub 
2# 如果无法找到 update-grub 命令,你可以通过下面的命令安装它。
3sudo apt-get install grub2-common 

或者更有效的是,在/boot/cmdline.txt之后加入 cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1
再reboot。就可以了。$^{[3]}$

参考文献

[1]Kubernetes Github

[2]如何在linux上通过GRUB添加内核参数

[3]树莓派论坛