一、中心端安装
(一)进入安装目录
cd /home/jingansi/k8s/init/kubeedge-cloudcore
(二)修改values.yaml配置文件
修改advertiseAddress的配置
modules:
cloudHub:
advertiseAddress:
- "172.21.30.105" #ip修改为第一台服务器(server-1)的ip
(三)执行安装/升级脚本
sh kubeedge-update.sh
(四)验证服务是否正常
kubectl get pod -nkubeedge
(五)验证cloudcore版本是否为v1.12.1
kubectl get pod -nkubeedge |grep cloudcore |awk '{print $1}' |kubectl describe pod -nkubeedge |grep Image:
[图片上传失败...(image-6eea2c-1697706644925)]
(六)安装keadm
1.进入kubeedge目录
cd /home/jingansi/k8s/init/kubeedge/v1.12.1
2.执行keadm安装脚本
sh keadm-install.sh
3.验证是否安装成功
keadm version
二、边缘端安装
(一)边缘节点安装
1.在中心端获取token,复制token
方式一:在kubesphere -> 节点 -> 边缘节点 -> 添加 -> 复制下图中--token的内容
[图片上传失败...(image-3996a3-1697706644925)]
方式二:在中心端服务器执行命令获取
sudo keadm gettoken
2.在边缘端安装keadm
(1)复制中心端/home/jingansi/k8s/init/kubeedge/edge目录下所有文件到边缘节点
安装包上传到边缘节点 /home/jingansi/kubeedge/edge目录下
cd /home/jingansi/kubeedge/edge
(2)进入安装目录(arm架构进入arm目录,x86架构进入x86目录)
cd /home/jingansi/kubeedge/edge/arm
或
cd /home/jingansi/kubeedge/edge/x86
(3)安装keadm
sudo sh keadm-install.sh
3.边缘节点加入集群
(1)修改edge-install.sh(这步直接跳过,无需修改)
edgeNodeName=$1
edgenodeIp=$2
cloudcoreIp=$3
token=$4
if [ ! -n "$edgeNodeName" ]; then
echo "边缘节点名称不能为空"
exit
fi
if [ ! -n "$edgenodeIp" ]; then
echo "边缘节点ip不能为空"
exit
fi
if [ ! -n "$cloudcoreIp" ]; then
echo "中心端ip不能为空"
exit
fi
if [ ! -n "$token" ]; then
echo "token不能为空"
exit
fi
sudo keadm join --kubeedge-version=v1.12.1 \
--cloudcore-ipport=$cloudcoreIp:30000 \
--certport=30002 \
--edgenode-name=$edgeNodeName \
--token $token
--cloudcore-ipport 为中心节点ip
--edgenode-ip 为 边缘节点ip
--edgenode-name 为边缘节点名称
--token 为中心节点复制的token(从中心端 sudo keadm gettoken获取)
--kubeedge-version=为安装的版本号,一般不用改
(2)执行安装
sudo sh edge-install.sh edgenode-lcfc1(边缘节点名称) 172.21.30.233(边缘节点ip) 172.21.30.105(中心端ip) dsadadasdasdas.dsadasdsa(token)
第一个参数: 边缘节点名称 必填
第二个参数: 边缘节点ip 必填
第三个参数: 中心端ip 必填
第二个参数: 中心端的token 必填
如果加入失败,执行reset 命名后,重新安装
sudo keadm reset
出现提示输入 yes
或者删除/etc/kubeedge目录
rm -rf /etc/kubeedge
如果reset 命名无法删除,则直接删除/etc/kubeedge目录
rm -rf /etc/kubeedge
4.在中心节点给新加入的边缘设备打污点
kubectl taint node edgenode-lcfc1(边缘设备名称) node-role.kubernetes.io/edge="":NoSchedule
5.安装完成后,修改边缘节点配置
(1)在边缘节点,打开 metaServer 模块
sudo vim /etc/kubeedge/config/edgecore.yaml
修改下面的地方
modules:
..
edgeMesh:
enable: false
..
metaManager:
metaServer:
enable: true
..
(2)在边缘节点,配置 clusterDNS 和 clusterDomain,并重启 edgecore
sudo vim /etc/kubeedge/config/edgecore.yaml
修改为下面这样
kubeedge版本大于v1.12.0 clusterDNS和clusterDomain按这样配置:
modules:
...
edged:
...
tailoredKubeletConfig:
...
clusterDNS:
- 169.254.96.16
clusterDomain: cluster.local
...
edgeStream:
enable: true
server: 172.21.30.105:30004(端口从10004 改成 30004)
#在kind: EdgeCore 下面添加如下内容:
...
kind: EdgeCore
featureGates:
requireAuthorization: true
...
中心端查看边缘端log配置如下:
[图片上传失败...(image-5556e8-1697706644925)]
(3)重启kubeedge
systemctl restart edgecore
6.边缘节点加入集群后,部分 Pod 在调度至该边缘节点上后可能会一直处于 Pending 状态。
这是由于部分守护进程集(例如,Calico)有强容忍度,您需要使用以下脚本手动 Patch Pod 以防止它们调度至该边缘节点。
cd /home/jingansi/k8s/init/kubeedge/v1.12.1/
sh patch.sh
如果没有上面的脚本,解决方式见下面:五、常见问题
(二)修改中心节点配置
1.编辑cloudcore配置
kubectl edit cm cloudcore -nkubeedge
2.修改如下配置
dynamicController:
enable: true //由false改为true
3.重启中心端cloudcore
kubectl get pod -nkubeedge |grep cloudcore |awk '{print $1}' |xargs kubectl delete pod -nkubeedge
或者:
kubectl rollout restart deploy cloudcore -n kubeedge
三、中心节点安装edgemesh(删除edgemesh时有一点概率会导致中心端网络崩溃,因此暂时不建议安装)
edgemesh可以让边缘端/中心端以服务名的方式访问中心端/边缘端的应用
1.进入安装目录
cd /home/jingansi/k8s/init/edgemesh
2.修改values.yaml
去掉下面的配置的注释
kubeAPIConfig:
metaServer:
security:
requireAuthorization: true
insecureSkipTLSVerify: true
3.启动edgemesh
sudo sh edgemesh-install.sh
四、应用部署到边缘端(示例)
1.部署应用到边缘端:deployment.yaml中指定部署的节点。
nodeName值为要部署的边缘节点的名称
[图片上传失败...(image-d32165-1697706644925)]
部署:kubectl apply
2.部署到边缘节点的 Pod 需要配置容忍污点
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "node-role.kubernetes.io/edge"
operator: "Exists"
effect: "NoSchedule"
五、常见问题
边缘节点加入集群后,部分 Pod 在调度至该边缘节点上后可能会一直处于 Pending 状态。由于部分守护进程集(例如,Calico)有强容忍度,您需要在中心端服务器使用以下脚本手动 Patch Pod 以防止它们调度至该边缘节点。
执行已有脚本:
sh /home/jingansi/k8s/init/kubeedge/v1.12.1/kubeedge/patch.sh
如果没有上面那个脚本,则手动保存下面的内容到 .sh 文件中并执行
#!/bin/bash
NodeSelectorPatchJson='{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/master": "","node-role.kubernetes.io/worker": ""}}}}}'
NoShedulePatchJson='{"spec":{"template":{"spec":{"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/edge","operator":"DoesNotExist"}]}]}}}}}}}'
edgenode="edgenode"
if [ $1 ]; then
edgenode="$1"
fi
namespaces=($(kubectl get pods -A -o wide |egrep -i $edgenode | awk '{print $1}' ))
pods=($(kubectl get pods -A -o wide |egrep -i $edgenode | awk '{print $2}' ))
length=${#namespaces[@]}
for((i=0;i<$length;i++));
do
ns=${namespaces[$i]}
pod=${pods[$i]}
resources=$(kubectl -n $ns describe pod $pod | grep "Controlled By" |awk '{print $3}')
echo "Patching for ns:"${namespaces[$i]}",resources:"$resources
kubectl -n $ns patch $resources --type merge --patch "$NoShedulePatchJson"
sleep 1
done