前言
在云原生技术的迅猛发展中,边缘计算逐渐成为备受关注的焦点。KubeEdge 作为一个基于 Kubernetes 的开源边缘计算平台,能够帮助开发者将 Kubernetes 的强大能力扩展到边缘场景中。在智能制造、物联网(IoT)等需要云边协同的场景中,KubeEdge 扮演着重要角色,支持跨越云端和边缘的应用部署与管理。
本篇博客将基于 Ubuntu 22.04 部署 KubeEdge-v1.18.0 环境,并通过实际操作搭建一个完整的云边协同集群。通过本次部署,读者可以深入了解 KubeEdge 的架构设计及其在边缘计算中的应用。
集群介绍
KubeEdge 的架构分为云端和边缘两部分:
- CloudCore:运行在云端,负责管理边缘节点、设备与应用的生命周期,并与 Kubernetes API Server 进行通信。
- EdgeCore:运行在边缘设备上,负责与 CloudCore 进行交互,同时执行本地的计算任务与设备管理。
准备工作
在开始部署之前,我们需要确保以下环境和资源准备就绪:
- Ubuntu 22.04 系统:确保云端和边缘节点均运行 Ubuntu 22.04,并进行基础的系统更新与配置。
- Kubernetes 集群:在云端部署一个 Kubernetes 集群以管理边缘节点,推荐使用 kubeadm 进行初始化。
- 网络环境:确保云端与边缘节点之间的网络互通,以便边缘节点能够顺利访问云端的 CloudCore。
- Containerd 容器运行时:在云端和边缘节点上使用 Containerd 作为容器运行时,以支持 KubeEdge 组件的运行。
集群配置信息
序号 | CPU(核) | 内存(G) | 硬盘(G) | 定位 | 主机名 | IP |
---|---|---|---|---|---|---|
1 | 4 | 8 | 50 | master | k8s-master01 | 192.168.148.150 |
2 | 4 | 8 | 50 | worker | k8s-worker01 | 192.168.148.151 |
3 | 2 | 4 | 25 | edgenode | edgenode-01 | 192.168.148.152 |
接下来,我们将介绍如何逐步完成 KubeEdge-v1.18.0 的部署和配置,并确保集群顺利运行。
1. Ubuntu 22.04 环境创建
在开始部署 KubeEdge-v1.18.0 之前,需要确保云端和边缘节点运行在 Ubuntu 22.04 操作系统上。具体的安装和配置步骤可以参考以下文章:
根据上述文章完成基本操作后,开始对三台主机进一步调整相关配置。
1.1 关闭防火墙
sudo systemctl disable --now ufw
1.2 设置服务器分区
# 设置为亚洲的上海时区
sudo timedatectl set-timezone Asia/Shanghai
# 重启时间同步服务
sudo systemctl restart systemd-timesyncd.service
# 确保时间同步服务正常运行
timedatectl status
1.3 关闭Swap分区
# 临时关闭
sudo swapoff -a
# 永久关闭:注释掉带有'swap'的行目,一般是最后一行
sudo vi /etc/fstab
1.4 关闭SELinux
# 安装policycoreutils软件包
sudo apt install -y policycoreutils
# 检查selinux关闭状态
sestatus
1.5 配置hosts配置文件
sudo vi /etc/hosts
1.6 转发IPv4并让iptables接收到桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
# 运行以下指令确认 br_netfilter 和 overlay 模块被加载
lsmod | grep br_netfilter
lsmod | grep overlay
# 运行以下指令确认 net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables 和 net.ipv4.ip_forward 系统变量在你的 sysctl 配置中被设置为 1
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
2. 安装容器运行时Containerd
在部署 KubeEdge 环境时,容器运行时是至关重要的组件。Containerd 是一个轻量级的容器运行时,它与 Kubernetes 紧密集成,并且在边缘计算场景中表现稳定。建议在 KubeEdge 的高版本中使用 Containerd 作为容器运行时,因为它提供了更好的性能和可靠性。
2.1 更新apt包
sudo apt update
2.2 安装Containerd
curl -LO https://github.com/containerd/containerd/releases/download/v1.7.13/cri-containerd-cni-1.7.13-linux-amd64.tar.gz
# 解压到根目录
sudo tar -zxvf cri-containerd-cni-1.7.13-linux-amd64.tar.gz -C /
# 查看Containerd版本
containerd -v
2.3 配置Containerd
# 创建配置文件目录
sudo mkdir /etc/containerd
# 创建配置文件
containerd config default | sudo tee /etc/containerd/config.toml
# 修改配置文件
sudo vi /etc/containerd/config.toml
# 将sandbox_image 值修改为 registry.aliyuncs.com/google_containers/pause:3.9
# 将SystemdCgroup 值修改为 true
2.4 启动并设置开机自启
sudo systemctl enable --now containerd
3. 安装Kubernetes 1.28.13
3.1 安装依赖
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
3.2 下载K8s软件包仓库的公共签名钥匙
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
3.3 添加K8s apt仓库(仅适用于1.28版本,次要版本请自行修改)
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
3.4 更新apt包
sudo apt-get update
3.5 安装并固定kubelet、kubeadm和kubectl版本
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
3.6 查看kubeadm版本
kubeadm version
3.7 初始化集群(master节点)
这里需要保存生成的token
sudo kubeadm config images pull \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.13 \
--cri-socket=unix:///run/containerd/containerd.sock
- sudo kubeadm config images pull:这个命令用于通过 kubeadm 拉取 Kubernetes 初始化时所需的容器镜像。
- --image-repository=registry.aliyuncs.com/google_containers:指定使用阿里云镜像仓库来拉取镜像。由于在国内访问 Google 的官方镜像仓库较慢或可能受限,因此使用阿里云提供的镜像仓库加速拉取。
- --kubernetes-version=v1.28.13:指定 Kubernetes 版本为 v1.28.13,确保拉取与该版本匹配的容器镜像。
- --cri-socket=unix:///run/containerd/containerd.sock:指定使用 Containerd 作为容器运行时。cri-socket 的路径指向 Containerd 的套接字文件,kubeadm 将通过该路径与 Containerd 交互。
sudo kubeadm init \
--apiserver-advertise-address=192.168.148.150 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.13 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///run/containerd/containerd.sock
- sudo kubeadm init:这是初始化 Kubernetes 集群的命令,kubeadm 会负责启动集群的控制平面(master 节点)。
- --apiserver-advertise-address=192.168.148.150:指定 API 服务器的监听地址,即 Kubernetes 控制平面将绑定到该 IP 地址上,并通过该地址与其他节点通信。这里的 192.168.148.150 是你主节点的内网 IP。
- --image-repository=registry.aliyuncs.com/google_containers:同样使用阿里云镜像仓库加速拉取初始化所需的镜像。
- --kubernetes-version=v1.28.13:指定 Kubernetes 版本为 v1.28.13,确保使用该版本的组件进行初始化。
- --service-cidr=10.96.0.0/12:定义 Kubernetes 服务的 IP 地址范围,默认是 10.96.0.0/12,确保这个范围不会与集群内的其他子网冲突。
- --pod-network-cidr=10.244.0.0/16:定义 Pod 网络的 IP 地址范围,这里使用的是 Flannel 网络插件的默认范围 10.244.0.0/16。后续配置网络插件时,Pod 将会分配该范围内的 IP 地址。
- --cri-socket=unix:///run/containerd/containerd.sock:指定使用 Containerd 作为容器运行时,通过套接字文件与其通信。
3.8 执行init后续三条命令(主节点)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.9 边端加入主节点(worker节点)
sudo kubeadm join 192.168.148.150:6443 --token k0j4kb.zz1ziq97dy89ipx0 --discovery-token-ca-cert-hash sha256:12e5d81e13a8d7b40a9403f7f7205fd60630ef59aa79271e23791a8e90010d4e
3.10 查看k8s集群配置
kubectl get nodes -o wide
3.11 安装calico网络插件
创建calico资源的过程受到网络影响较大,不能确定初始化时长,但这个过程不会自动终止,请耐心等待。
# 安装Tigera Calico操作符和自定义资源定义
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/tigera-operator.yaml
# 下载客户端资源文件
curl -LO https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/custom-resources.yaml
# 修改pod的网段地址
sed -i 's/cidr: 192.168.0.0/cidr: 10.244.0.0/g' custom-resources.yaml
# 创建资源
kubectl create -f custom-resources.yaml
# 监控创建过程
watch kubectl get all -o wide -n calico-system
4. 部署KubeEdge-v1.18.0 Cloudcore
4.1 安装负载均衡器 Metallb(master节点)
Cloudcore需要为Edgecore提供通信地址,LB为Cloudcore提供公网IP或者K8s集群节点相同网段IP地址。
kubectl edit configmap -n kube-system kube-proxy
# 将mode 值修改 “ipvs”
# 将ipvs.strictAPP 值修改为 true
# 重新启动kube-system
kubectl rollout restart daemonset kube-proxy -n kube-system
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
# 创建全局IP地址
vim first-ippool.yaml
# 创建
kubectl apply -f first-ippool.yaml
192.168.148.160-192.168.148.170是虚拟机网段内空闲的ip地址
# 开启二层转发
vim l2forward.yaml
# 创建
kubectl apply -f l2forward.yaml
4.2 使用keadm部署Cloudcore(master节点)
# 下载keadm
wget https://github.com/kubeedge/kubeedge/releases/download/v1.18.0/keadm-v1.18.0-linux-amd64.tar.gz
# 解压
tar -zxvf keadm-v1.18.0-linux-amd64.tar.gz
sudo mv keadm-v1.18.0-linux-amd64/keadm/keadm /usr/local/bin/
sudo keadm init --advertise-address=192.168.148.160 --set iptablesManager.mode="external" --profile version=v1.18.0
- sudo keadm init用于初始化云端节点,也就是启动 CloudCore 服务,负责与边缘节点(EdgeCore)通信并管理它们。
- --advertise-address=192.168.148.160指定 CloudCore 运行所在服务器的 IP 地址(LB分配的地址),也就是其他边缘节点与云端通信时将会连接到的 IP 地址。
- --set iptablesManager.mode="external"配置 iptablesManager 的模式为 "external",表示不使用 KubeEdge 默认的 iptables 管理器,而是依赖外部的网络配置。这意味着集群中的网络规则需要由用户或外部工具来管理。
--profile version=v1.18.0指定要安装的 KubeEdge 版本为 v1.18.0。
这里可能会遇到keadm init的问题(execute keadm command failed: failed to verify k8s component installed, err: failed to build config, err: stat /root/.kube/config: no such file or directory),出现这个错误是因为 keadm init 在初始化时找不到 Kubernetes 的配置文件 /root/.kube/config,通常这个文件是在你成功部署 Kubernetes 集群之后创建的。可以通过以下步骤来解决这个问题:# 检查 kubeconfig 文件 mkdir -p /root/.kube cp -i /etc/kubernetes/admin.conf /root/.kube/config # 设置环境变量 export KUBECONFIG=/etc/kubernetes/admin.conf # 重新运行 keadm init
# 将type 值修改为 LoadBalancer kubectl edit svc cloudcore -n kubeedge
kubectl get daemonset -n kube-system | grep -v NAME | awk '{print $1}' | xargs -n 1 kubectl patch daemonset -n kube-system --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/affinity", "value": {"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution": {"nodeSelectorTerms": [{"matchExpressions":[{"key":"node-role.kubernetes.io/edge", "operator":"DoesNotExist"}]}]}}}}]' kubectl get daemonset -n calico-system | grep -v NAME | awk '{print $1}' | xargs -n 1 kubectl patch daemonset -n calico-system --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/affinity", "value": {"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution": {"nodeSelectorTerms": [{"matchExpressions":[{"key":"node-role.kubernetes.io/edge", "operator":"DoesNotExist"}]}]}}}}]' kubectl get daemonset -n metallb-system | grep -v NAME | awk '{print $1}' | xargs -n 1 kubectl patch daemonset -n metallb-system --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/affinity", "value": {"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution": {"nodeSelectorTerms": [{"matchExpressions":[{"key":"node-role.kubernetes.io/edge", "operator":"DoesNotExist"}]}]}}}}]'
这里可能会遇到问题(error: error loading config file "/etc/kubernetes/admin.conf": open /etc/kubernetes/admin.conf: permission denied),出现这个错误表示你没有权限访问 /etc/kubernetes/admin.conf 文件。可以通过以下命令来解决这个问题:
sudo chmod 644 /etc/kubernetes/admin.conf
这里需要保存生成的tokenkeadm gettoken
4.3 使用keadm部署Edgecore(edgenode节点)
# 下载keadm wget https://github.com/kubeedge/kubeedge/releases/download/v1.18.0/keadm-v1.18.0-linux-amd64.tar.gz # 解压 tar -zxvf keadm-v1.18.0-linux-amd64.tar.gz sudo mv keadm-v1.18.0-linux-amd64/keadm/keadm /usr/local/bin/ # keadm join sudo keadm join --token=$TOKEN --cloudcore-ipport=192.168.148.160:10000 --kubeedge-version=1.18.0
这里可能会遇到镜像拉取的问题。可以通过以下命令来解决这个问题:sudo ctr image pull docker.io/kubeedge/installation-package:v1.18.0
总结
至此,您已经成功完成了 KubeEdge 的部署,搭建了一个强大且灵活的云边协同平台。通过 KubeEdge,您可以在云端高效管理和调度边缘节点上的应用,实现对边缘设备的轻松控制与管理。
望这篇指南能够帮助您顺利完成部署,并为后续的边缘计算应用开发打下坚实基础。如果您在实际使用中遇到任何问题,欢迎查阅官方文档或参与社区讨论,共同推动 KubeEdge 生态的发展!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。