【kubeedge+云服务器+树莓派】云端配置
使用阿里云的ecs服务器作为云服务器,最终成功配置的版本如下:
- ubuntu 20.04 (云服务器操作系统)
- k8s v1.21
- kubeedge v1.10.1
注意k8s和kubeedge的版本对应在https://github.com/kubeedge/kubeedge有详细说明:
文章目录
- 【kubeedge+云服务器+树莓派】云端配置
- 1 云主机连接
- 2 关闭云服务器防火墙
- 3 关闭分区交换
- 4 修改主节点名称
- 7 安装docker
- 8 安装k8s 1.21
- 9 初始化k8s
- 10 配置网络
- 11 安装go
- 12 部署edgecloud
- 10 一些经验
- 问题1 镜像pull不下来
- 问题2 出现It seems like the kubelet isn't running or healthy
1 云主机连接
2 关闭云服务器防火墙
sudo systemctl stop ufw
sudo systemctl disable ufw
3 关闭分区交换
先查看分区情况
sudo swapon -s # 查看分区情况
输入后没有任何反应,应该是没有配置的原因。
通过free -h
查看内存确认一下
这里显示Swap都是0表示确实没有配置swpa分区。
按照网上的教程永久禁用分区,然而/etc/fstab打开看了一下本来就没有swap内容,所以不用注释。
sudo swapoff -a
# 永久禁用swap分区
sudo vi /etc/fstab
# 打开后注释swap分区那一行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IaWqhlY4-1678779659240)(:/5afdd9be2f61491b80ac579264123185)]
4 修改主节点名称
修改主节点名称并不只是为了辨识方便,如果不进行修改,在使用kubesphere安装k8s集群的时候会报错,且这个错误原因比较含糊,
# 查看节点名称
hostnamectl set-hostname master
# 修改节点名称为master
7 安装docker
- 更新软件并安装必要的系统工具
sudo apt-get -y update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common # 使apt支持ssl传输 还有一些不太清楚
- 安装GPG证书,如果不安装则没有权限从软件源下载Docker:
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
这一步包括后面用了apt-get 好像都会报这个warning,但是应该不用管。
- 写入软件源信息(通过这个软件源下载Docker):
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
- 开始下载Docker:
sudo apt-get -y update
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun # 这一步耗时比较久,如果一直没反应可以尝试其他docker安装方法。
这里是安装完后的一些版本信息。
- 修改镜像源
sudo vim /etc/docker/daemon.json
添加以下内容,registry-mirrors为镜像源,后续docker拉取镜像的时候,会通过这个镜像源进行拉取,解决国内无法访问外网镜像站的问题。
exec-opts设定执行选项,设定docker为systemd技术(k8s集群需要)。
注意:树莓派安装docker时,默认系统是cgroup的,且不支持systemd,如果不匹配的话可能会出现边缘节点连接上但master看不到,此处如果docker默认是systemd要改成cgroup或直接将有systemd的那行删除
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com",
"https://quay-mirror.qiniu.com"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
重新载入daemon:
sudo systemctl daemon-reload
重启docker:
sudo systemctl restart docker
查看修改后的docker Cgroup的参数,为systemd即修改成功:
docker info | grep Cgroup
8 安装k8s 1.21
安装完了 docker 就可以下载 k8s 的三个主要组件kubelet、kubeadm以及kubectl了。
kubelet: k8s 的核心服务
kubeadm: 这个是用于快速安装 k8s 的一个集成工具,我们在master1和node1上的 k8s 部署都将使用它来完成。
kubectl: k8s 的命令行工具,部署完成之后后续的操作都要用它来执行
其实这三个的下载很简单,直接用apt-get就好了,但是因为某些原因,它们的下载地址不存在了。所以我们需要用国内的镜像站来下载,也很简单。
由于前面装docker时已经装了一些系统必要的应用了,比如允许apt使用ssl传输等。这里可以直接进行安装。
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
# 下载gpg 密钥
vim /etc/apt/sources.list.d/kubernetes.list
# 添加下面的镜像源
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
sudo apt-get update # 更新源
sudo apt install kubectl=1.21.0-00 kubelet=1.21.0-00 kubeadm=1.21.0-00 # 安装三件套
sudo apt-mark hold kubelet kubeadm kubectl
查看版本 这里是1.21
kubectl version
9 初始化k8s
这里如果带上了apiserver-advertise-address 会一直卡住,然后timeout。应该是阿里云服务器使用vpc的问题。本来我担心这会影响集群的搭建,但是实际上kubeedge边端加入集群并不需要边端有公网ip,也不需要云端绑定在一个公网ip上,vpc网络不会产生影响。
注:
apiserver-advertise-address填你的公网ip
pod-network-cidr 可以自己定义,不会配置可以按下面的来
正常使用:
kubeadm init --apiserver-advertise-address=47.115.223.XXX --pod-network-cidr 172.16.0.0/16 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version v1.21.0 --ignore-preflight-errors=all
# 一直卡住然后timeout
出问题后改成:
kubeadm init --pod-network-cidr 172.16.0.0/16 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version v1.21.0 --ignore-preflight-errors=all
出现成功提示。
然后按照提示输入保存config:
##把必要的config复制到根目录下
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
此时可以看到部署的节点了
kubectl get nodes # 这里能看到master了 但是是notready 毕竟没有配置网络
10 配置网络
这里使用的是calico :
wget https://docs.projectcalico.org/v3.11/manifests/calico.yaml
vim calico.yaml
修改CIDR地址
#CALICO_IPV4POOL_CIDR=172.16.0.0/16 下面是vim命令
/CIDR # 找到这一行然后再将内容换成上面的pod cidr
#提示 如果不搜索很难肉眼定位到这一行
配置网络如下:
kubectl apply -f calico.yaml
此时你的master节点至少应该是Ready状态
kubectl get nodes #显示ready 如果没有ready 过一会再试一下就可以了
11 安装go
sudo wget https://dl.google.com/go/go1.18.3.linux-amd64.tar.gz
后续也可以更改版本号为自己想要下载的版本,如果下载不下来或者想要知道更多go的版本信息请访问https://studygolang.com/dl
sudo tar -zxvf go1.18.3.linux-amd64.tar.gz -C /usr/local/ #解压
sudo cp /usr/local/go/bin/go /usr/local/bin/go # 添加进环境变量
判断是否安装成功
go version
12 部署edgecloud
部署edgecloud需要使用keadm来部署,keadm会自动帮我们下载需要的文件,但是因为网络问题,这一块的安装强烈建议先挂去github上把需要的文件下载下来,通ftp传输到服务器相应文件夹上,然后部署时它会自动跳过这些需要下载步骤,这样会很快。不然如果你的服务器连不上github,是不可能安装成功的。
我是参考上面这篇文章进行的操作。
首先安装keadm
以v1.10.1为例,先去github下载好keadm的tar.gz文件,通过ftp传输到服务器上的root文件夹里。
下载方法是去https://github.com/kubeedge/kubeedge/releases找到对应的版本。
解压之后发现文件夹里面核心就是一个二进制的keamd文件,将这个文件配置到环境变量。如下:
tar -zxvf keadm-v1.10.1-linux-amd64.tar.gz
cd keadm-v1.10.1-linux-amd64/keadm && chmod +x keadm && mv keadm /usr/local/bin
安装好keadm之后,下一步是为部署做准备。
思路:
首先目标是部署edgecloud时,它本来会自己从github上拉一下文件到/etc/kubeedge,因为访问不到所以安装失败。因此我们需要在/etc/kubeedge中把文件都给它安排明白,这样部署时就可以一路跳过下载阶段了。
首先我们需要一个结构图(图中版本是v1.10.0 这只是个例子)
这是一个/etc/kubeedge 需要的文件结构树。可以看到包括kubeedge的安装包和一些配置文件。我们要做的就是把这个把这几个配置文件都给他通过ftp传到服务器上,然后cp到目录里相应的位置上,这样后面部署的时候就可以跳过下载了。
比如我使用的版本是v1.10.1,我去官网的release中找到这个版本,并按如下步骤进行操作:
1.下载release界面的kubeedge-v1.10.1-linux-amd64.tar.gz (根据你系统来选安装包),ftp传到服务器的/etc/kubeedge中去。
2.下载release界面的source code,然后打开进入build/crds文件夹找到配置文件,ftp把整个crd文件夹传输到/etc/kubeedge中
3.把source code 中的build/tools/cloudcore.service 丢进/etc/kubeedge
4.到上一步大概率就可以执行初始化命令了,其他文件一般可以轻松下载下来。
然后执行初始化命令
keadm init --kubeedge-version=1.10.1 --advertise-address=47.115.223.xxx # 这里填你的公网ip
# kubeedge要求这里需要暴露给边端一个可以访问的公网ip
输入
ps -elf | grep cloudcore #如果输出cloudcore就说明ok了
10 一些经验
初始化k8s要注意一下k8s的版本。网上现在大多数教程都是类似下面的命令行
sudo kubeadm init --pod-network-cidr 172.16.0.0/16 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--apiserver-advertise-address 172.20.20.200 \
--apiserver-bind-port 6443
直接使用以上命令行在1.22+版本以上的kubenetes上部署有可能会失败,可能要使用配置文件来初始化集群。如果是1.24以上都不支持docker了,需要查看相关教程。
此外之前使用ubuntu 22.04版本时出现了下面的问题,可以提供参考:
进行初始化,这里 --ignore-preflight-errors=all是因为我使用的云服务器内存只有2g,所以会有警告提示,这里忽略掉。
kubeadm init --apiserver-advertise-address=47.115.223.184 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version v1.21.0 --ignore-preflight-errors=all
还有如果使用ubuntu 18.04 及更低时,安装keadm后发现使用keadm命令失败,提示缺少 glibc2.28,这是因为18.04只支持到2.27,可能是因为我使用的keadm版本太新,和系统不匹配?这里如果出现同样的问题,可以考虑和我一样使用ubuntu 20.04。
还有一些问题可以在里找到答案。
以下是一些部署时踩的坑,包括使用某些版本系统时可能出现的问题,仅供参考。
问题1 镜像pull不下来
然后使用下列语句查看需要的镜像
kubeadm config images list # 查看需要的镜像
这里可以看到前缀是k8s,国外的网站这样肯定是访问不到的,这是因为默认没有配置源,虽然我前面的init配置了源但是还是报错了。说明这里还是有问题,但是没关系,先配置一下。
先把默认配置导出来看一下:
kubeadm config print init-defaults>kubeadm.yaml #导出配置
sudo vim kubeadm.yaml #修改配置
然后主要改三个地方
一个是本机的地址advertiseAddress: 47.115.223.xxx改成自己的
name: master 改成master
imageRepository: registry.aliyuncs.com/google_container 配置源
这样待会用这个配置文件来初始化 就不用再输入那一串很长的命令行了。
再重新看一下需求的镜像
kubeadm config images pull --config=kubeadm.yaml #用自定义的配置文件看需求的镜像
可以看到前缀正常了,按道理这样配置好,docker应该都能pull下来。
这里使用kubeadm config images pull 提取pull一下看一下是否能成功
果然失败了,这说明问题不出现在配置源上面,仔细看应该是coredns:v1.8.0这个东西出了问题,说明这个源可能没有这个版本或者什么原因。
解决方法:
直接使用docker pull下来再用tag改名。
docker pull coredns/coredns:1.8.0
docker tag coredns/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
# 改名要和前面需求的镜像文件名字一模一样
然后再初始化,由于我们配置了文件直接使用配置文件进行初始化,其实是一样的。
kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=all
这样发现第一个错误就没有了,也就是所有需求的镜像都pull下来了。
问题2 出现It seems like the kubelet isn’t running or healthy
这个路径没有配置的话需要添加进去
笔者在Ubuntu22.04Sever中安装时,出现了这种情况,
先去查看下你的: /etc/systemd/system/kubelet.service.d下是否有10-kubeadm.conf.如果没有需要创建这个文件,并复制如下内容。
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
如有有这个文件,则在文件中加入如代码
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --fail-swap-on=false"
重新启动kubelet.service
systemctl daemon-reload
systemctl restart kubelet.service