文章

KubeEdge使用keadm工具部署

KubeEdge使用keadm工具部署

KubeEdge使用keadm工具部署

kubeedge安装需要依赖k8s环境。

镜像源配置

1
2
3
4
5
6
7
8
9
10
11
12
13
# 备份当前源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup

# 替换为阿里云源
sudo tee /etc/apt/sources.list > /dev/null <<EOF
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
EOF

# 更新软件包列表
sudo apt update

k8s安装部署

安装docker

安装k8s

使用官方方法

1
2
3
4
5
6
7
8
9
# 添加Kubernetes官方GPG密钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# 添加Kubernetes APT仓库
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 更新并安装
sudo apt update
sudo apt-get install -y kubeadm kubelet kubectl

安装cri-dockerd

Kubernetes v1.24+ 默认使用 CRI(Container Runtime Interface),不再支持 Docker 直接作为容器运行时,需要安装cri-dockerd兼容Docker 下载并安装 cri-dockerd

1
2
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.10/cri-dockerd_0.3.10.3-0.ubuntu-jammy_amd64.deb
sudo dpkg -i cri-dockerd_0.3.10.3-0.ubuntu-jammy_amd64.deb

启动 cri-dockerd

1
2
sudo systemctl enable cri-docker
sudo systemctl start cri-docker

禁用swap

1
2
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

pause镜像准备

手动拉取 pause 镜像(使用阿里云源);打标签,使其匹配 Kubernetes 期望的镜像名

1
2
3
4
sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
sudo docker tag \
  registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 \
  registry.k8s.io/pause:3.9

k8s初始化

使用kubeadm工具初始化k8s。使用cri-dockerd,配置忽略检查报错(还没有安装网络插件),使用国内镜像仓库,日志展示进度详情。

1
2
3
4
5
6
7
kubeadm init \
  --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
  --cri-socket unix:///var/run/cri-dockerd.sock \
  --pod-network-cidr=10.244.0.0/16 \
  --kubernetes-version=v1.29.15 \
  --ignore-preflight-errors=all \
  --v=5
  • 日志输出Your Kubernetes control-plane has initialized successfully!说明成功
  • 问题排查使用sudo journalctl -u kubelet -f查看日志
  • 重启sudo systemctl restart kubelet
  • 重置kubeadm reset --force --cri-socket=unix:///var/run/cri-dockerd.sock

配置 kubectl

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

加载br_netfilter内核模块

Flannel插件用

1
2
sudo modprobe br_netfilter
lsmod | grep br_netfilter

安装 CNI 网络插件(如 Flannel)

1
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

k8s状态检查

1
2
kubectl get nodes
kubectl get pods -n kube-system

kubeedge安装部署

云端主节点部署

依赖镜像建议提前下载

1
2
docker pull kubeedge/cloudcore:v1.21.0
docker pull kubeedge/iptables-manager:v1.21.0

KubeEdge 提供了一个名为 keadm 的命令行工具,方便快速部署 KubeEdge。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 下载最新版本的 keadm
wget https://github.com/kubeedge/kubeedge/releases/download/v1.21.0/keadm-v1.21.0-linux-amd64.tar.gz

# 解压文件
tar -zxvf keadm-v1.21.0-linux-amd64.tar.gz

# 进入解压后的目录
cd keadm-v1.21.0-linux-amd64

# 手动拉取国内镜像并改标签
sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/cloudcore:v1.21.0
sudo docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/cloudcore:v1.21.0 kubeedge/cloudcore:v1.21.0

# 初始化
./keadm/keadm init --kubeedge-version=1.21.0 --v=5

如果失败后重试,建议先重置./keadm/keadm reset

常见问题:单节点集群环境被阻止调度

查看节点状态kubectl get pods -n kubeedge -o widepending状态
检查节点kubectl describe node <your node name> | grep -i taint配置,常见输出Taints: node-role.kubernetes.io/control-plane:NoSchedule
说明该节点默认不允许调度普通 Pod(包括 cloudcore),可以直接移除污点配置kubectl taint node <your node name> node-role.kubernetes.io/control-plane:NoSchedule-

边缘端子节点部署

依赖镜像建议提前下载

1
2
3
docker pull kubeedge/installation-package:v1.21.0
docker pull kubeedge/eclipse-mosquitto:1.6.15
docker pull eclipse-mosquitto:1.6.15

从云端获取令牌,该令牌将在加入边缘节点时使用。

1
./keadm/keadm gettoken

使用keadm join安装edgecore。正常条件,一般在另一台服务器上单独部署边缘端组件。单机环境部署,云端和边缘端共存容易出现问题,需要使用edgenode-name设置节点名称避免冲突,和指定容器运行时引擎

1
2
3
4
5
6
7
8
./keadm/keadm join \
    --cloudcore-ipport=${node_ip}:10000 \
    --token=${TOKEN} \
    --edgenode-name=edge-node-01 \
    --remote-runtime-endpoint=unix:///var/run/cri-dockerd.sock \
	--cgroupdriver=systemd \
	--kubeedge-version=v1.21.0 \
	--v=5

常见问题:边缘端kubelet组件冲突问题

使用journalctl -u edgecore.service -xe查看报错日志如下

1
failed to check the running environment: kubelet should not be running on edge node when starting edgecore

在单机环境下部署,kubelet(Kubernetes主节点组件)和edgecore(KubeEdge边缘节点组件)不能同时运行。需要修改配置。

1
2
3
4
5
6
vi /etc/systemd/system/edgecore.service

# 在[Service]配置项下加入一行
# Environment="CHECK_EDGECORE_ENVIRONMENT=false"

systemctl daemon-reload

kubeedge状态检查

1
kubectl get pods -n kubeedge

参考

本文由作者按照 CC BY 4.0 进行授权