树莓派上部署KubeEdge

2、树莓派网络配置

2.1 静态IP地址配置

(1)修改配置文件

目录:/etc/dhcpcd.conf

sudo vim /etc/dhcpcd.conf

(2)在末尾添加如下配置,请完全按照下面的配置

#物理网口,网线接入时的配置信息
interface eth0
static ip_address=x.x.x.x/xx   #配置ip地址  
static routers=x.x.x.x  #配置网关
static domain_name_servers=x.x.x.x  #配置DNS

(3)保存并退出文件。

(4)重新启动树莓派以使更改生效

sudo reboot

(5)重启后,查看ip地址

ip a

2.3 SSH远程登录

(1)使用VNC远程桌面登录
  1. 树莓派命令行窗口输入sudo raspi-config 调出树莓派配置界面
  2. 使用方向键选到Interface Options回车,再选择VNC 回车

  1. 系统询问是否开启VNC,是,回车

  1. 系统提示VNC服务已经打开,确定,回车

  1. 然后会返回到配置主界面

  1. 输入sudo reboot 回车,重启树莓派
  2. 下载VNC安装包
  3. 正常安装后,打开VNC软件,输入连接的地址即可
  4. 弹出输入用户名密码的窗口,
  5. 成功连接到树莓派的窗口

3、离线部署kubeEdge

3.1 kubeEdge与Kubernetes 版本兼容表

Kubernetes 1.20

Kubernetes 1.21

Kubernetes 1.22

Kubernetes 1.23

Kubernetes 1.24

Kubernetes 1.25

Kubernetes 1.26

Kubernetes 1.27

KubeEdge 1.12

-

-

-

-

-

KubeEdge 1.13

+

-

-

-

-

KubeEdge 1.14

+

+

-

-

-

KubeEdge 1.15

+

+

+

+

-

KubeEdge HEAD (master)

+

+

+

+

+

说明:

  • ​✓​​ KubeEdge 和 Kubernetes 的版本是完全兼容的
  • ​+​​ KubeEdge 中有些特性或 API 对象可能在对应的 Kubernetes 版本中不存在
  • ​-​​ Kubernetes 中有些特性或 API 对象可能在对应的 KubeEdge 版本中不可用

3.3 树莓派安装Docker

(1)在线安装(推荐)
#官方脚本:会自动检测当前的系统和版本后,安装docker,只需要在联网情况下,耐心等待
sudo curl -fsSL https://get.docker.com | sh

如果运行上述命令无法在线安装docker,报错如下

报错的原因是:

​sources.list​​​ 文件或 ​​/etc/apt/sources.list.d/​​ 目录下的某些文件包含了指向老旧的或不存在的 Debian Stretch 版本的源。

要解决这个问题,请按照以下步骤操作:

  1. 编辑软件源列表: 打开 ​​/etc/apt/sources.list​​​ 文件进行编辑。您可以使用 ​​nano​​ 或您喜欢的任何文本编辑器:
bashCopy code
sudo nano /etc/apt/sources.list

注释或删除旧的源: 在 ​​sources.list​​​ 文件中,找到所有提及 ​​stretch​​ 的行。这些是旧的源,对于 Buster 或 Bullseye 系统来说已经不再适用。您可以通过在每行前面添加 来注释这些行,或者直接删除它们。

  1. 保存并退出编辑器: 保存更改并退出编辑器。在 ​​nano​​​ 中,您可以通过按 ​​Ctrl+​​​0 然后 ​​Enter​​​ 来保存,然后按 ​​Ctrl+X​​ 退出。
  2. 清理并更新软件包列表: 在更改源之后,运行以下命令清理旧的软件包信息并更新软件包列表:
sudo apt clean
sudo apt update
(2) 离线安装

(1)将上述安装包放入树莓派中的目录,我这里是 /home/wang 目录下

(2)依次执行下面的命令

sudo dpkg -i containerd.io_1.4.4-1_armhf.deb 
sudo dpkg -i docker-ce-cli_20.10.6~3-0~debian-buster_armhf.deb
sudo dpkg -i docker-ce_20.10.6~3-0~debian-buster_armhf.deb

在实际过程中,执行第三条命令会报错,如下

解决方法如下

sudo apt-get install iptables

执行上述命令,可能会报错

解决上述报错

apt --fix-broken install

(3)重新执行上述报错的第三条命令

sudo dpkg -i docker-ce_20.10.6~3-0~debian-buster_armhf.deb

(4)验证安装:查看docker版本

docker version

(5)启动docker,并检查docker状态

systemctl start docker
systemctl status docker

3.4 云端(服务器)部署

下载所需要的安装包及源码。官方Release地址: https://github.com/kubeedge/kubeedge/releases。需要说明的是,安装部署Kubeedge时需要保证云端和边端Kubeedge的版本一致。本实验(云端、边端的部署版本为v1.10.0)

(1)安装keadm并解压
tar -zxvf keadm-v1.15.1-linux-amd64.tar.gz

将其配置进入环境变量,方便使用

cd keadm-v1.15.1-linux-amd64/keadm/
cp keadm /usr/local/bin

输入​​keadm version​​,如果能输出版本信息,说明安装成功。如下图所示:

(2)解压 kubeedge 压缩包

将cloudcore和edgecore的二进制文件放置到 ​​/etc/kubeedge​​ 目录下

tar -zxvf kubeedge-v1.15.1-linux-amd64.tar.gz

(3)将 checksum 放置到 /etc/kubeedge 目录下
cp checksum_keadm-v1.15.1-linux-amd64.tar.gz.txt /etc/kubeedge
cp checksum_kubeedge-v1.15.1-linux-amd64.tar.gz.txt /etc/kubeedge

(4)解压源码

将源码中 ​​/build/crds​​​ 中的所有内容拷贝到云端的 ​​/etc/kubeedge/crds​​ 目录

将源码中 ​​/build/tools/cloudcore.service​​​ 文件放置到云端的 ​​/etc/kubeedge​​ 目录

tar -zxvf kubeedge-1.15.1.tar.gz
cp -r apps devices operations policy reliablesyncs router /etc/kubeedge/crds
cp cloudcore.service /etc/kubeedge
(5)安装cloudcore

使用下面的命令

keadm init --advertise-address=x.x.x.x --kubeedge-version=1.15.1 --kube-config=/root/.kube/config
  • advertise-address为 cloudcore 所在的主机 IP地址
  • kubeedge-version表示kubeedge 安装的版本。
  • config 路径指向 kubernetes 的配置路径,默认是​​/root/.kube/config​​,也可设置为 /etc/kubernetes/admin.conf

这一步最好配置连接外网,需要从github上下载一些文件。否则,会安装失败

配置好梯子后,再次执行命令,可以看到,安装成功=

(6)修改 flannel-ds 和 kube-proxy 配置

a) 修改flannels-ds

通过下面命令查看​​kube-system​​ 命名空间中的所有 DaemonSet

kubectl get ds -n kube-system

通过下面命令修改kube-flannel-ds-amd64配置文件

kubectl edit ds kube-flannel-ds-amd64 -n kube-system

将对应的内容修改为下图中红框所示,注意,没有values字段,如果有,将values字段删除。

b) 修改kube-proxy

通过下面的命令修改kube-proxy 配置

kubectl edit ds kube-proxy -n kube-system

将下面的内容添加进kube-proxy的配置文件中,

affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: node-role.kubernetes.io/edge
                    operator: DoesNotExist

3.5 边端(树莓派)部署Kubeedge v1.15.1(成功)

(1)按照3.4节(1)-(3)步执行即可

需要注意的是,树莓派的资源包要下载 arm 的

在执行拷贝命令时,实际执行后发现树莓派无法自动创建 /etc/kubeedge 目录,因此,需要到/etc目录下手动创建kubeedge目录,随后执行拷贝命令。

(2)安装 MQTT 服务
  1. 下载 mosquitto 服务端和客户端以及依赖包
apt install mosquitto     
apt install mosquitto-clients
  1. 配置 MQTT 服务
  1.   添加配置文件
  2.   在​​/etc/mosquitto/conf.d​​​目录下,添加配置文件​​myconfig.conf​​ 配置文件:
sudo vi /etc/mosquitto/conf.d/myconfig.conf
  1.   复制下面这些配置
#添加 broker 监听端口(很重要,否则只能本机访问)
listener 1883
#-------------------------------------------
# 如果关闭匿名访问,客户端必须使用用户名密码
allow_anonymous true

#指定 用户名-密码 文件
password_file /etc/mosquitto/pwfile.txt
#--------------------------------------------
  1. 添加账户密码
sudo mosquitto_passwd -c /etc/mosquitto/pwfile.txt {用户名}

这里我设置的用户名为cloud 密码为cloud@9000

  1. 启动mosquitto查看运行状态
sudo service mosquitto start
sudo service mosquitto status

(3)将边缘端加入到云端(失败)
  1. 在云端运行 keadm gettoken 将返回 token 令牌,该令牌将在加入边缘节点时使用。

注意,该token有时效性(具体时间不知),请及时获取有效的toekn值

keadm gettoken
b516d9531f4733d6e686186b3215e1c4cf755eae0d76fa49ad62345fa517f11b.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDMwNTAzOTl9.dSSPEdJJGwo6mA1DaFggyy0SyAWxpBC5_obeAnUwQ9Y

  1. 解压源码
  1.   将源码中 ​​./build/tools/edgecore.service​​​ 文件复制到边端主机的 ​​/etc/kubeedge​​ 目录

通过下面的命令让边端纳入云端管理

keadm join --cloudcore-ipport=x.x.x.x:10000 --kubeedge-versinotallow=1.10.0 --token=7338282063b88ec1138c0a9fd9d2ff6c4bd8ff22b25721314dff9eabc06589ed.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDMyMjYwNTB9.CCmXrO5B6itmC2y23u0wk5oCPTawfYZPih4qftTJX1k

其中,

  • cloudcore-ipport表示云端的IP地址和端口号
  • kubeedge-version表示kubeedge版本号
  • token表示从云端获取到的token值

Note:

在 join 后,如果出现报错:

Error: edge node join failed: validate service connection: CRI v1 image API is not implemented for endpoint "unix:///run/containerd/containerd.sock": rpc error: code = Unimplemented desc = unknown service runtime.v1.ImageService

execute keadm command failed: edge node join failed: validate service connection: CRI v1 image API is not implemented for endpoint "unix:///run/containerd/containerd.sock": rpc error: code = Unimplemented desc = unknown service runtime.v1.ImageService

则修改树莓派的/etc/containerd/config.toml 文件,屏蔽如下内容

#disabled_plugins = ["cri"]

修改完成后重启containerd 和 docker

systemctl restart containerd
systemctl restart docker

查看docker和containerd的状态

systemctl status docker

systemctl status containerd

再次执行keadm join命令,发现一直报错

keadm join --cloudcore-ipport=x.x.x.x:10000 --edgenode-name=node --kubeedge-version=1.15.1 --token=b516d9531f4733d6e686186b3215e1c4cf7551b.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDMwOTM1OTl9.PgiQOP4hZ53rLNXAfkz-OhAH8f6Y_s1f6l3VRfMwNMw
I1220 10:55:28.958155   20291 command.go:901] 1. Check KubeEdge edgecore process status
I1220 10:55:28.981833   20291 command.go:901] 2. Check if the management directory is clean
I1220 10:55:28.982136   20291 join.go:107] 3. Create the necessary directories
I1220 10:55:28.994820   20291 join.go:184] 4. Pull Images
Pulling docker.io/kubeedge/installation-package:v1.15.1 ...
Successfully pulled docker.io/kubeedge/installation-package:v1.15.1
Pulling docker.io/library/eclipse-mosquitto:1.6.15 ...
Successfully pulled docker.io/library/eclipse-mosquitto:1.6.15
Pulling docker.io/kubeedge/pause:3.6 ...
Successfully pulled docker.io/kubeedge/pause:3.6
I1220 10:55:28.999712   20291 join.go:184] 5. Copy resources from the image to the management directory
E1220 10:55:49.000381   20291 remote_runtime.go:176] "RunPodSandbox from runtime service failed" err="rpc error: code = DeadlineExceeded desc = context deadline exceeded"
Error: edge node join failed: copy resources failed: rpc error: code = DeadlineExceeded desc = context deadline exceeded
execute keadm command failed:  edge node join failed: copy resources failed: rpc error: code = DeadlineExceeded desc = context deadline exceeded

经查看kubeedge的github和KubeSphere官方论坛上也有相同的问题

​https://github.com/kubeedge/kubeedge/issues/4740​

​https://ask.kubesphere.io/forum/d/22982-kubesphere34k8sban-ben-v1239kubeedgejia-ru-bao-cuo​

尝试各种解决方案,均失败。因此,使用kubeedge v1.10.0进行部署安装

(4)将边缘端加入到云端
树莓派作为边缘节点加入云端需要以下修改

(1)keadm版本边缘端和云端要一致(即使用Kubeedge v1.15.1提供的keadm)

(2)修改Containerd配置文件

按照3.7 节(1)a)中步骤,修改Containerd配置文件,路径如下,可直接使用提供的config.toml文件,替换原有的config.toml文件。需要注意的是,树莓派使用Docker作为容器运行时,containerd的二进制文件路径有所不同,需要修改config.toml配置文件中​​ExecStart​​字段的值为​​/usr/bin/containerd​

/etc/containerd/config.toml

(3)安装并配置cni插件

按照3.7 节(1)c)中的步骤执行即可

(4)将边缘节点加入云端

按照3.7节(4)中的步骤执行即可

(5)边缘节点加入后,在云端查看节点状态

可以看到,树莓派作为边缘节点已成功加入云端,状态为Ready,并且Kubeedge版本为v1.15.1

(5)部署计数器案例(web-controller-app)-失败

按照4.1节内容分别在云端和边端部署计数器案例,结果发现Kubeedge v1.15.1版本不能够像Kubeedge v1.10.0版本,在边缘端启动kubeedge-pi-counter的容器。因此。无法验证云边协同的有效性。

3.6 边端(树莓派)部署Kubeedge v1.10.0(成功)

(1)配置docker

安装docker后,需要在 /etc/docker 目录下创建daemon.json 文件,添加下面的内容(使用 systemd 驱动)

{
    "exec-opts": ["native.cgroupdriver=systemd"]
}

配置完成后,重启docker

systemctl restart docker

检查docker是否正常运行

systemctl status docker

(2)按照3.4节(1)-(3)步执行即可

需要注意的是,树莓派的资源包要下载 arm版本的 的

在执行拷贝命令时,实际执行后发现树莓派无法自动创建 /etc/kubeedge 目录,因此,需要到/etc目录下手动创建kubeedge目录,随后执行拷贝命令。

(3)按照3.5节(2)安装MQTT服务
(4)将边缘节点加入到云端
  1. 在云端运行 keadm gettoken 将返回 token 令牌,该令牌将在加入边缘节点时使用。

注意,该token有时效性(具体时间不知),请及时获取有效的toekn值

keadm gettoken
7338282063b88ec1138c0a9fd9d2ff6c4bd8ff22b25721314dff9eabc06589ed.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDMyMjYwNTB9.CCmXrO5B6itmC2y23u0wk5oCPTawfYZPih4qftTJX1k

  1. 解压源码
  1.   将源码中 ​​./build/tools/edgecore.service​​​ 文件复制到边端主机的 ​​/etc/kubeedge​​ 目录
  2.   通过下面的命令让边端纳入云端管理
  1. 通过下面的命令让边端纳入云端管理
keadm join --cloudcore-ipport=10.8.59.200:10000 --cgroupdriver=systemd --edgenode-name=raspberrypi --kubeedge-versinotallow=1.10.0 --token=7338282063b88ec1138c0a9fd9d2ff6c4bd8ff22b25721314dff9eabc06589ed.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDMyMjYwNTB9.CCmXrO5B6itmC2y23u0wk5oCPTawfYZPih4qftTJX1k

其中,

  • cloudcore-ipport表示云端的IP地址和端口号
  • cgroupdriver指定边端节点以systemd方式运行
  • edgenode-name表示边端节点的名称
  • kubeedge-version表示kubeedge版本号
  • token表示从云端获取到的token值
  1. 在边缘端运行下面的命令检查edgecore服务状态
service edgecore status

  1. 在云端运行下面的命令查看边缘节点是否加入
kubectl get nodes

可以看到边缘节点raspberrypi已经加入到云端

3.7 边端(服务器)部署Kubeedge v1.15.1(成功)

先决条件

kubeedge云端、边端部署要求kubeedge版本相同。本实验云端、边端均使用kubeedge v1.15.1。云端部署按照3.4节即可。

(1)离线安装Containerd

使用下面的命令查看Ubuntu在线仓库中Containerd

apt-cache madison containerd

可以看到,Containerd版本比较旧,于是使用github仓库中的新版本,使用二进制方式部署。

离线安装Containerd需要三个安装包和一个配置文件:Containerd、Containerd的Service文件、runc、cni插件。官方GitHub地址分别如下

containerd:https://github.com/containerd/containerd/releases

containerd的Service文件:https://github.com/containerd/containerd/blob/v1.7.11/containerd.service

runc:https://github.com/opencontainers/runc/releases

cni插件:https://github.com/containernetworking/plugins/releases

a) 安装Containerd

解压缩并将containerd执行文件放入系统默认命令路径下

tar xf containerd-1.7.11-linux-amd64.tar.gz
cp -r bin/* /usr/local/bin/

生成Containerd配置文件

containerd config default > /etc/containerd/config.toml

修改配置文件

# 65行:sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8" 【修改pause容器镜像为国内】
# 137行:SystemdCgroup = true 【让Runc使用system cgroup驱动,对容器进行资源划分,隔离。】

完整的config.toml文件如下

暂时无法在飞书文档外展示此内容

配置Systemd管理Containerd,下载containerd对应版本(这里使用的是Containerd1.7.11版本)的Service文件,将文件的内容完整的复制到下面的路径:

vim /usr/lib/systemd/system/containerd.service

containerd.service完整内容如下:

# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
#uncomment to enable the experimental sbservice (sandboxed) version of containerd/cri integration
#Environment="ENABLE_CRI_SANDBOXES=sandboxed"
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target

docker安装的containerd.server文件

# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target

启动Containerd

systemctl start containerd

如果启动报错

执行命令

systemctl unmask containerd.service

重新启动Containerd,并检查Containerd的状态

b) 安装runc
install -m 755 runc.amd64 /usr/local/sbin/runc
c) 安装cni插件

创建相关目录并解压

mkdir /opt/cni/bin -p
tar xf cni-plugins-linux-amd64-v1.4.0.tgz -C /opt/cni/bin/

配置cni插件

mkdir -p /etc/cni/net.d
cd /etc/cni/net.d
touch 10-mynet.conf

将下面的内容写入10-mynet.conf文件中

{
        "cniVersion": "1.0.0",
        "name": "mynet",
        "type": "bridge",
        "bridge": "cni0",
        "isGateway": true,
        "ipMasq": true,
        "ipam": {
                "type": "host-local",
                "subnet": "10.224.0.0/16",
                "routes": [
                        { "dst": "0.0.0.0/0" }
                ]
        }
}

配置完重启containerd并查看Containerd状态

systemctl daemon-reload
systemctl restart containerd
systemctl status containerd
d)验证安装
ctr --help

(2)安装nerdctl

nerdctl为Containerd的客户端工具,使用效果与docker命令的语法一致

官方GitHub地址:https://github.com/containerd/nerdctl/releases

  1. 解压nerdctl安装包
tar xvf nerdctl-1.7.2-linux-amd64.tar.gz
  1. 拷贝nerdctl到系统二进制命令路径下
cp nerdctl /usr/local/bin/
  1. 验证安装
nerdctl version

(3)安装buildkit

buildkit为Containerd的构建镜像工具

官方GitHub地址:https://github.com/moby/buildkit

  1. 解压buildkit安装包
tar zxvf buildkit-v0.9.3.linux-amd64.tar.gz  -C /usr/local/
  1. 配置buildkit

创建配置文件夹

mkdir -p /etc/buildkit/

写入​​buildkitd.toml​​配置文件

cat > /etc/buildkit/buildkitd.toml << 'EOF'

debug = true
# root is where all buildkit state is stored.
root = "/var/lib/buildkit"
# insecure-entitlements allows insecure entitlements, disabled by default.
insecure-entitlements = [ "network.host", "security.insecure" ]

[worker.oci]
  enabled = true
  platforms = [ "linux/amd64", "linux/arm64" ]
  snapshotter = "auto"
  rootless = false
  noProcessSandbox = false
  gc = true
  gckeepstorage = 9000
  max-parallelism = 4

  [[worker.oci.gcpolicy]]
    keepBytes = 512000000
    keepDuration = 172800
    filters = [ "type==source.local", "type==exec.cachemount", "type==source.git.checkout"]

[registry."19.15.14.158:31104"]
  mirrors = ["19.15.14.158:31104"]
  http = true       #使用http协议
  insecure = true    #不验证安全证书
[registry."mmzwwwdocker.xxxxxx.com:31104"]
  mirrors = ["mmzwwwdocker.xxxxxxx.com:31104"]
  http = true  #使用http协议
  insecure = true  #不验证安全证书
EOF

写入​​buildkit.service​​配置文件

cat > /etc/systemd/system/buildkit.service << 'EOF'
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit

[Service]
ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true

[Install]
WantedBy=multi-user.target
EOF
  1. 启动​​buildkit​​并检查状态
systemctl daemon-reload
systemctl enable buildkit
systemctl start buildkit
systemctl status buildkit

(4)将边缘节点加入云端

a) 在云端获取token值

在云端执行下面命令获取token

keadm gettoken

获取到的token值如下。注意,该token有时效性(具体时间不知),请及时获取有效的toekn值

2d1d47085173d521355c07b662987abbb1d20b3ea4fed43602399051ee814e1a.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDM1Nzk5NjV9.8GSe1qx4D2MD2hl2YTjC2dOmIoB5k_sWZ91koH1sQHw

b)边缘节点加入云端

说明:在实际验证过程中发现,Kubeedge v1.15.1在将边缘节点加入云端时,不能像Kubeedge v1.10.0版本在/etc/kubeedge目录下提前放入相关的配置文件等(离线安装)。v1.15.1版本在执行keadm join时,检测/etc/kubeedge文件夹是否为空,若不为空,会提醒删除/etc/kubeedge目录下的文件并中断操作,无法继续。

  1. 使用下面的命令将边缘节点加入云端(这一步需要连接外网,下面的命令会下载包括必要的镜像、配置文件等)
keadm join --cloudcore-ipport=x.x.x.x:10000 --cgroupdriver=systemd --edgenode-name=edgenode01 --kubeedge-versinotallow=1.15.1 --token=2d1d47085173d521355c07b662987abbb1d20b3ea4fed43602399051ee814e1a.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDM3OTQ0MjJ9.FHNJ1TRQd4NAFDqk4IPn5RLY1uLohtIHWJsJF8QKpwU

其中,

  • cloudcore-ipport表示云端的IP地址和端口号
  • cgroupdriver指定边端节点以systemd方式运行
  • edgenode-name表示边端节点的名称
  • kubeedge-version表示kubeedge版本号
  • token表示从云端获取到的token值

若加入时报错:

查看容器

ctr -n k8s.io containers ls

删除容器

ctr -n k8s.io containers rm [容器ID]

重启containerd

systemctl daemon-reload
systemctl restart containerd

根据上图的内容,可以发现边缘节点已成功加入云端

  1. 在云端查看node状态

可以看到边缘节点edgenode已经加入到云端,并且Kubeedge版本为 v1.15.1

(5)部署计数器案例(web-controller-app)-失败

按照4.1节内容分别在云端和边端部署计数器案例,结果发现Kubeedge v1.15.1版本不能够像Kubeedge v1.10.0版本,在边缘端启动kubeedge-pi-counter的容器。因此。无法验证云边协同的有效性。

4、Kubeedge使用

4.1 计数器案例(web-controller-app)

先决条件

边缘节点加入kubernetes集群,云端和边端均处于ready状态

以下实验云端和边端均使用 Kubeedge v1.10.0版本

(1)边缘端(树莓派)配置go环境
  1. 从官方(https://go.dev/dl/)下载go安装包(armv6l的包)

  1. 解压安装包
sudo  tar -zxvf go1.21.5.linux-amd64.tar.gz
  1. 将解压出的内容移动至 /usr/local/go目录下
sudo  mv go /usr/local/go
  1. 配置环境变量:vi ~/.bashrc命令 打开文件,在文件最后增加:
export GOPATH=/home/go
export PATH=/usr/local/go/bin:$PATH:$GOPATH/bin
  1. 使环境变量生效,执行下面命令
source  ~/.bashrc
  1. 安装完成,执行:go version 命令,查看当前安装golang版本。

(2)云端(服务器)配置go环境

按照4.1节的(1)配置即可,需要注意的是,go安装包为arm64位的

(3)实验
a) 云端安装web-controller-app

下载示例代码

git clone https://github.com/kubeedge/examples.git $GOPATH/src/github.com/kubeedge/examples

进入crds文件夹,创建计数器模型

cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
kubectl create -f kubeedge-counter-model.yaml

根据计数器应用运行的节点(边缘节点),修改配置文件kubeedge-counter-instance.yaml,这里将节点(边缘节点)名称改为raspberrypi

vim  kubeedge-counter-instance.yaml

修改后的内容如下(标黄的为修改的内容)

apiVersion: devices.kubeedge.io/v1alpha2
kind: Device
metadata:
 name: counter
labels:
        description: 'counter'
spec:
deviceModelRef:
        name: counter-model
nodeSelector:
        nodeSelectorTerms:
        - matchExpressions:
          - key: 'kubernetes.io/hostname'
            operator: In
            values:
            - raspberrypi

status:
 twins:
- propertyName: status
  desired:
    metadata:
      type: string
    value: 'ON'
  reported:
    metadata:
      type: string
    value: '0'

将设备从云端拉起

kubectl create -f kubeedge-counter-instance.yaml

部署云端应用,应该在服务器中打开相应的端口,将web运行在此端口,进入云端应用目录,修改main程序

cd ..
cd web-controller-app
vim main.go

将端口修改为开放的端口,我这里开放端口为3089

beego.Run(":3089")

编译、构建并拉起镜像

make all
make docker
cd ..
cd crds
kubectl apply -f kubeedge-web-controller-app.yaml
b) 树莓派部署应用

下载示例代码

git clone https://github.com/kubeedge/examples.git $GOPATH/src/github.com/kubeedge/examples

进入应用文件夹counter-mapper

cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/counter-mapper

直接编译生成镜像

make all
make docker
c) 服务器部署应用
cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds

修改kubeedge-pi-counter-app.yaml文件

vi kubeedge-pi-counter-app.yaml

修改之后的YAML文件如下(保证Pod 只在 ​​edge​​ 节点上运行)

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: kubeedge-pi-counter
  name: kubeedge-pi-counter
  namespace: default
spec:
  selector:
    matchLabels:
      k8s-app: kubeedge-pi-counter
  template:
    metadata:
      labels:
        k8s-app: kubeedge-pi-counter
    spec:
      nodeSelector:
        node-role.kubernetes.io/edge: ""
      hostNetwork: true
      containers:
      - name: kubeedge-pi-counter
        image: kubeedge/kubeedge-pi-counter:v1.0.0
        imagePullPolicy: IfNotPresent
      restartPolicy: Always

部署应用

kubectl apply -f kubeedge-pi-counter-app.yaml
d) 查看云端(服务器)和边端(树莓派)状态

服务器端:

  1. 查看pod状态
kubectl get pods -o wide
  1. 查看设备部署情况
kubectl get device

边缘端:

  1. 查看容器状态
docker ps

e) 实验结果

在浏览器访问云端IP:3089端口号

选择ON运行

点击ON运行后,在边缘端输出容器日志

参考资料

​https://blog.csdn.net/weixin_43859148/article/details/129256557​

​https://blog.csdn.net/tengxuen1998/article/details/128744468​

​https://blog.csdn.net/MacWx/article/details/129530878​

​https://blog.csdn.net/weixin_47758895/article/details/130526709​

​https://blog.csdn.net/zhangsanbin/article/details/112546915​

​https://blog.csdn.net/m0_49598182/article/details/127333136​

​https://blog.csdn.net/Obese_Tiger/article/details/104741606​

​https://blog.csdn.net/m0_49598182/article/details/127332972​

​https://blog.csdn.net/v6543210/article/details/125280148​

​https://blog.csdn.net/Obese_Tiger/article/details/104802926​

​https://blog.csdn.net/ecloud_developer/article/details/120528942​

​https://blog.csdn.net/bhniunan/article/details/104783321​

​https://zhuanlan.zhihu.com/p/114716305​

​https://zhuanlan.zhihu.com/p/114716305​

​阿里云+树莓派搭建KubeEdge,成功运行计数器示例_kubeedge实战-CSDN博客​

​边缘计算底座KubeEdge(二):实战体验_device nodeselectorterms matchexpressions-CSDN博客​

​kubeedge-web-demo - 掘金​

​blog.csdn.net​

​https://blog.csdn.net/luck099/article/details/131233362​

​https://www.cnblogs.com/punchlinux/p/16496094.html​

​Containerd 错误报错解决Failed to start containerd container runtime.-CSDN博客​

​kubeedge v1.15 部署安装-CSDN博客​

​containerd_v1.6.0+nerdctl+buildkit 二进制安装,支持多CPU并发构建_yum 安装nerdctl-CSDN博客​

​kubeedge-temperature-demo 示例_kubeedge temperature-CSDN博客​

​kubeedge v1.15 部署安装-CSDN博客​

​超详细,简单的Containerd的安装步骤_containerd安装-CSDN博客​

​CentOS 7报错:Failed to start xxx.service: Unit is masked_failed to start ntpd.service: unit is masked.​

​Containerd安装与使用 - PunchLinux - 博客园​

​containerd_v1.6.0+nerdctl+buildkit 二进制安装,支持多CPU并发构建_yum 安装nerdctl-CSDN博客​

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值