47

在树莓派上建立kubernetes集群 - ShenHengheng's Blog

 5 years ago
source link: https://readailib.com/2019/01/07/kubernetes/raspberrypi/build-a-kubernetes-cluster/?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在树莓派上建立kubernetes集群

Posted by ShenHengheng on 2019-01-07

IMG_0468.jpg

最近学了Kubernetes一段时间后,突然想在自己的树莓派上玩玩,搭建一个集群出来,玩过树莓派的同学都知道,树莓派作为一个“卡片电脑式”的嵌入式电脑,它的性能是非常有限的,内存和CPU对于我们传统的机器智能是远远不可及的,因此我在这里PO出我为什么要做树莓派的kubernetes研究:

打造一个具有边缘智能的系统,可以在上面部署边缘级别的微服务组件,包括传感器的采集服务、控制和计算单元为核心的服务!

这里的实验环境为 1 个kubernetes master和 3 个 worker节点,共计 4 个树莓派节点。为了方便,这里的主机名以及IP地址如下:

  • edge-master, IP:172.16.3.1
  • edge-node1, IP:172.16.3.17
  • edge-node2, IP:172.16.3.32
  • edge-node3, IP:172.16.3.3

这里我没有使用静态IP,因此IP地址是有可能变的,因此为了稳定,建议设置成静态IP。但为了教程的完整性,我也会说明如何设置静态IP。

这里主要参考了下面的教程:

系统准备(TL;DR)

这里的准备系统是要准备树莓派操作系统,一般来讲运行kubernetes这么大的系统,最好的系统选择方式为轻量级的操作系统,这里推荐两个操作系统:

这里为了方便,我使用了 Raspbian Stretch Lite 系统作为我的边缘设备操作系统,下载地址: https://www.raspberrypi.org/downloads/raspbian/

树莓派系统安装都是一个样,安装教程可以参考:https://www.shenhengheng.xyz/files/respberry_doc.pdf

安装完成之后,需要初始化下面的操作,包括更改主机名,密码,连接wifi,设置docker网络代理,还有设置静态IP等。

初始化系统

  • 更改主机名,修改密码以及连接Wi-Fi等工作都可以通过 raspi-config 命令来完成。

Master节点设置

设置静态IP

$ cat << EOF >> /etc/dhcpcd.conf
profile static_eth0
static ip_address=192.168.0.100/24
static routers=192.168.0.1
static domain_name_servers=8.8.8.8
EOF

安装100,101,102,103 的格式设置其他的树莓派节点IP地址

设置网络代理

因为后期会需要下载kubeadm,kubelete,docker等软件,因此需要设置网络代理,通过代理下载软件。

$ export http_proxy="http://172.14.1.54:1080"
$ export https_proxy="http://172.14.1.54:1080"

安装docker

这个步骤依赖于上面的网络代理设置的,如果设置成功了,那么这步才可能成功执行。

$ curl -sSL get.docker.com | sh && sudo usermod pi -aG docker
$ newgrp docker

关闭swap

$ sudo dphys-swapfile swapoff && \
  sudo dphys-swapfile uninstall && \
  sudo update-rc.d dphys-swapfile remove

这个步骤是为了后面的 kubeadm init 成功执行!具体的缘由可以参考我之前的文章:https://www.41sh.cn/?id=8

为了检测是否成功关闭,可以执行下面的命令,如果成功执行了,那么下面的命令将不会有任何的输出。

$ sudo swapon --summary

编辑 /boot/cmdline.txt

打开 /boot/cmdline.txt,并在末尾添加如下指令。

cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory

该步骤执行完成后,一定要重启!否则后面会有错误。

安装kubernetes

该步骤也同样依赖于设置网络代理那一步骤!

$ sudo su # 切换到root用户
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \
echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list && \
apt-get update -q && \
apt-get install -qy kubeadm=1.10.2-00 kubectl=1.10.2-00 kubelet=1.10.2-00

1). 这里有个小坑,切到root用户后,需要重新配置网络代理,然后就可以使用了。

$ export http_proxy="http://172.14.1.54:1080"
$ export https_proxy="http://172.14.1.54:1080"

2). 使用root时,不用加sudo前缀,这个已经踩了很多次了

如果安装最新版本,不用指定版本。可以直接使用下面的命令:

$ apt-get install -qy kubeadm kubectl kubelet

修改docker的网络代理

这一步非常重要!因为我们可能需要pull很多国内不能访问的镜像,因此需要设置docker网络代理,因为默认情况下,docker服务不是通过systemctl管理的,因此需要创建一个系统服务,具体的命令如下:

$ mkdir -pv /etc/systemd/system/docker.service.d
$ cat << EOF >> /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://172.16.3.12:1080/" "HTTPS_PROXY=http://172.16.3.12:1080/"
EOF 
$ systemctl daemon-reload
$ systemctl restart docker

参考:https://docs.docker.com/config/daemon/systemd/

预先pull镜像

$ kubeadm config images pull -v3

初始化master节点

$ kubeadm init --token-ttl=0 --pod-network-cidr=10.244.0.0/16

这步如果成功的话,会打印下面的消息:

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 172.16.3.1:6443 --token xo78oj.02cia85vdh285aqj --discovery-token-ca-cert-hash sha256:9517c72036f8261ac912adaf8339b65583fdaa7dbb8dd60054c6e84e8880a3fd

然后根据输出的提示,执行下面的语句:

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

上面的语句需要在pi用户下执行!否则不管用!

这步完成之后,执行下面的命令,你会发现master节点NotReady的消息,这是因为我们的网络需要依赖于flannel网络组件!

Setup networking with Weave Net or Flannel

Some users have reported stability issues with Weave Net on ARMHF. These issues do not appear to affect x86_64 (regular PCs/VMs). You may want to try Flannel instead of Weave Net for your RPi cluster.

Weave Net

Install Weave Net network driver

$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

If you run into any issues with Weaveworks’ networking then flannel is also a popular choice for the ARM platform.

Flannel (alternative)

Apply the Flannel driver on the master:

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/c5d10c8/Documentation/kube-flannel.yml

On each node that joins including the master:

$ sudo sysctl net.bridge.bridge-nf-call-iptables=1

其他节点设置

其他节点和master类似,最后需要执行下面的命令就可以了!

$ kubeadm join 172.16.3.1:6443 --token xo78oj.02cia85vdh285aqj --discovery-token-ca-cert-hash sha256:9517c72036f8261ac912adaf8339b65583fdaa7dbb8dd60054c6e84e8880a3fd


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK