【kubeedge+云服务器+树莓派】云端配置

使用阿里云的ecs服务器作为云服务器,最终成功配置的版本如下:

  • ubuntu 20.04 (云服务器操作系统)
  • k8s v1.21
  • kubeedge v1.10.1

注意k8s和kubeedge的版本对应在https://github.com/kubeedge/kubeedge有详细说明:

edge 安装 javascript edge 安装包没反应_kubernetes


文章目录

  • 【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 云主机连接

edge 安装 javascript edge 安装包没反应_云原生_02

2 关闭云服务器防火墙

sudo systemctl stop ufw
sudo systemctl disable ufw

edge 安装 javascript edge 安装包没反应_edge 安装 javascript_03

3 关闭分区交换

先查看分区情况

sudo swapon -s # 查看分区情况

输入后没有任何反应,应该是没有配置的原因。

通过free -h 查看内存确认一下

edge 安装 javascript edge 安装包没反应_云原生_04

这里显示Swap都是0表示确实没有配置swpa分区。

按照网上的教程永久禁用分区,然而/etc/fstab打开看了一下本来就没有swap内容,所以不用注释。

sudo swapoff -a
# 永久禁用swap分区
sudo vi /etc/fstab
# 打开后注释swap分区那一行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IaWqhlY4-1678779659240)(:/5afdd9be2f61491b80ac579264123185)]

4 修改主节点名称

修改主节点名称并不只是为了辨识方便,如果不进行修改,在使用kubesphere安装k8s集群的时候会报错,且这个错误原因比较含糊,

# 查看节点名称

edge 安装 javascript edge 安装包没反应_docker_05

hostnamectl set-hostname master 
# 修改节点名称为master

7 安装docker

  1. 更新软件并安装必要的系统工具
sudo apt-get -y update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common # 使apt支持ssl传输 还有一些不太清楚
  1. 安装GPG证书,如果不安装则没有权限从软件源下载Docker:
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

edge 安装 javascript edge 安装包没反应_linux_06

这一步包括后面用了apt-get 好像都会报这个warning,但是应该不用管。

  1. 写入软件源信息(通过这个软件源下载Docker):
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
  1. 开始下载Docker:
sudo apt-get -y update
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun # 这一步耗时比较久,如果一直没反应可以尝试其他docker安装方法。

这里是安装完后的一些版本信息。

edge 安装 javascript edge 安装包没反应_linux_07

  1. 修改镜像源
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

edge 安装 javascript edge 安装包没反应_edge 安装 javascript_08

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

edge 安装 javascript edge 安装包没反应_docker_09

查看版本 这里是1.21

kubectl version

edge 安装 javascript edge 安装包没反应_linux_10

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

edge 安装 javascript edge 安装包没反应_linux_11

出现成功提示。
然后按照提示输入保存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找到对应的版本。

edge 安装 javascript edge 安装包没反应_docker_12

解压之后发现文件夹里面核心就是一个二进制的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 这只是个例子)

edge 安装 javascript edge 安装包没反应_linux_13

这是一个/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中

edge 安装 javascript edge 安装包没反应_edge 安装 javascript_14

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

edge 安装 javascript edge 安装包没反应_云原生_15

输入

ps -elf | grep cloudcore #如果输出cloudcore就说明ok了

edge 安装 javascript edge 安装包没反应_云原生_16

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,所以会有警告提示,这里忽略掉。

edge 安装 javascript edge 安装包没反应_docker_17

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不下来

edge 安装 javascript edge 安装包没反应_docker_18

然后使用下列语句查看需要的镜像

kubeadm config images list # 查看需要的镜像

edge 安装 javascript edge 安装包没反应_kubernetes_19

这里可以看到前缀是k8s,国外的网站这样肯定是访问不到的,这是因为默认没有配置源,虽然我前面的init配置了源但是还是报错了。说明这里还是有问题,但是没关系,先配置一下。
先把默认配置导出来看一下:

kubeadm config print init-defaults>kubeadm.yaml  #导出配置
sudo vim kubeadm.yaml #修改配置

然后主要改三个地方

edge 安装 javascript edge 安装包没反应_linux_20

一个是本机的地址advertiseAddress: 47.115.223.xxx改成自己的
name: master 改成master
imageRepository: registry.aliyuncs.com/google_container 配置源
这样待会用这个配置文件来初始化 就不用再输入那一串很长的命令行了。

再重新看一下需求的镜像

kubeadm config images pull --config=kubeadm.yaml #用自定义的配置文件看需求的镜像

可以看到前缀正常了,按道理这样配置好,docker应该都能pull下来。

edge 安装 javascript edge 安装包没反应_edge 安装 javascript_21

这里使用kubeadm config images pull 提取pull一下看一下是否能成功

edge 安装 javascript edge 安装包没反应_docker_22

果然失败了,这说明问题不出现在配置源上面,仔细看应该是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

edge 安装 javascript edge 安装包没反应_云原生_23

这个路径没有配置的话需要添加进去
笔者在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

edge 安装 javascript edge 安装包没反应_linux_24