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远程桌面登录
- 树莓派命令行窗口输入sudo raspi-config 调出树莓派配置界面
- 使用方向键选到Interface Options回车,再选择VNC 回车
- 系统询问是否开启VNC,是,回车
- 系统提示VNC服务已经打开,确定,回车
- 然后会返回到配置主界面
- 输入sudo reboot 回车,重启树莓派
- 下载VNC安装包
- 正常安装后,打开VNC软件,输入连接的地址即可
- 弹出输入用户名密码的窗口,
- 成功连接到树莓派的窗口
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 版本的源。
要解决这个问题,请按照以下步骤操作:
- 编辑软件源列表: 打开
/etc/apt/sources.list
文件进行编辑。您可以使用 nano
或您喜欢的任何文本编辑器:
bashCopy code
sudo nano /etc/apt/sources.list
注释或删除旧的源: 在 sources.list
文件中,找到所有提及 stretch
的行。这些是旧的源,对于 Buster 或 Bullseye 系统来说已经不再适用。您可以通过在每行前面添加 来注释这些行,或者直接删除它们。
- 保存并退出编辑器: 保存更改并退出编辑器。在
nano
中,您可以通过按 Ctrl+
0 然后 Enter
来保存,然后按 Ctrl+X
退出。 - 清理并更新软件包列表: 在更改源之后,运行以下命令清理旧的软件包信息并更新软件包列表:
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 服务
- 下载 mosquitto 服务端和客户端以及依赖包
apt install mosquitto
apt install mosquitto-clients
- 配置 MQTT 服务
- 添加配置文件
- 在
/etc/mosquitto/conf.d
目录下,添加配置文件myconfig.conf
配置文件:
sudo vi /etc/mosquitto/conf.d/myconfig.conf
- 复制下面这些配置
#添加 broker 监听端口(很重要,否则只能本机访问)
listener 1883
#-------------------------------------------
# 如果关闭匿名访问,客户端必须使用用户名密码
allow_anonymous true
#指定 用户名-密码 文件
password_file /etc/mosquitto/pwfile.txt
#--------------------------------------------
- 添加账户密码
sudo mosquitto_passwd -c /etc/mosquitto/pwfile.txt {用户名}
这里我设置的用户名为cloud 密码为cloud@9000
- 启动mosquitto查看运行状态
sudo service mosquitto start
sudo service mosquitto status
(3)将边缘端加入到云端(失败)
- 在云端运行 keadm gettoken 将返回 token 令牌,该令牌将在加入边缘节点时使用。
注意,该token有时效性(具体时间不知),请及时获取有效的toekn值
keadm gettoken
b516d9531f4733d6e686186b3215e1c4cf755eae0d76fa49ad62345fa517f11b.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDMwNTAzOTl9.dSSPEdJJGwo6mA1DaFggyy0SyAWxpBC5_obeAnUwQ9Y
- 解压源码
- 将源码中
./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
尝试各种解决方案,均失败。因此,使用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)将边缘节点加入到云端
- 在云端运行 keadm gettoken 将返回 token 令牌,该令牌将在加入边缘节点时使用。
注意,该token有时效性(具体时间不知),请及时获取有效的toekn值
keadm gettoken
7338282063b88ec1138c0a9fd9d2ff6c4bd8ff22b25721314dff9eabc06589ed.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDMyMjYwNTB9.CCmXrO5B6itmC2y23u0wk5oCPTawfYZPih4qftTJX1k
- 解压源码
- 将源码中
./build/tools/edgecore.service
文件复制到边端主机的 /etc/kubeedge
目录 - 通过下面的命令让边端纳入云端管理
- 通过下面的命令让边端纳入云端管理
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值
- 在边缘端运行下面的命令检查edgecore服务状态
service edgecore status
- 在云端运行下面的命令查看边缘节点是否加入
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
- 解压nerdctl安装包
tar xvf nerdctl-1.7.2-linux-amd64.tar.gz
- 拷贝nerdctl到系统二进制命令路径下
cp nerdctl /usr/local/bin/
- 验证安装
nerdctl version
(3)安装buildkit
buildkit为Containerd的构建镜像工具
官方GitHub地址:https://github.com/moby/buildkit
- 解压buildkit安装包
tar zxvf buildkit-v0.9.3.linux-amd64.tar.gz -C /usr/local/
- 配置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
- 启动
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目录下的文件并中断操作,无法继续。
- 使用下面的命令将边缘节点加入云端(这一步需要连接外网,下面的命令会下载包括必要的镜像、配置文件等)
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
根据上图的内容,可以发现边缘节点已成功加入云端
- 在云端查看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环境
- 从官方(https://go.dev/dl/)下载go安装包(armv6l的包)
- 解压安装包
sudo tar -zxvf go1.21.5.linux-amd64.tar.gz
- 将解压出的内容移动至 /usr/local/go目录下
sudo mv go /usr/local/go
- 配置环境变量:vi ~/.bashrc命令 打开文件,在文件最后增加:
export GOPATH=/home/go
export PATH=/usr/local/go/bin:$PATH:$GOPATH/bin
- 使环境变量生效,执行下面命令
source ~/.bashrc
- 安装完成,执行: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) 查看云端(服务器)和边端(树莓派)状态
服务器端:
- 查看pod状态
kubectl get pods -o wide
- 查看设备部署情况
kubectl get device
边缘端:
- 查看容器状态
docker ps
e) 实验结果
在浏览器访问云端IP:3089端口号
选择ON运行
点击ON运行后,在边缘端输出容器日志
参考资料
https://zhuanlan.zhihu.com/p/114716305
https://zhuanlan.zhihu.com/p/114716305
阿里云+树莓派搭建KubeEdge,成功运行计数器示例_kubeedge实战-CSDN博客
边缘计算底座KubeEdge(二):实战体验_device nodeselectorterms matchexpressions-CSDN博客
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博客
Containerd安装与使用 - PunchLinux - 博客园
containerd_v1.6.0+nerdctl+buildkit 二进制安装,支持多CPU并发构建_yum 安装nerdctl-CSDN博客