离线重装k8s-mef
k8s 1.22.12离线安装
k8s和kubeedge的cloudcore组件安装于云侧节点上
首先导入需要的全部docker容器镜像:
包括 k8s的组件7个(kube-images目录)
1
|
docker load < coredns_v1.8.4.tar |
2
|
docker load < etcd_3.5.0-0.tar |
3
|
docker load < pause_3.5.tar |
4
|
docker load < kube-apiserver_v1.22.12.tar |
5
|
docker load < kube-controller-manager_v1.22.12.tar |
6
|
docker load < kube-proxy_v1.22.12.tar |
7
|
docker load < kube-scheduler_v1.22.12.tar |
和calico组件4个(plugin/calico目录)
1
|
docker load < calico-cni-v3.17.6.tar |
2
|
docker load < calico-kube-controllers-v3.17.6.tar |
3
|
docker load < calico-node-v3.17.6.tar |
4
|
docker load < calico-pod2daemon-flexvol-v3.17.6.tar |
接下来依次执行:
- cni二进制安装
新建cni路径
1
|
mkdir -p /opt/cni/bin |
将cni对应压缩包内内容解压至新建的路径 并添加执行权限
-
crictl二进制安装
将crictl对应压缩包内二进制解压至用户path /usr/local/bin 并添加执行权限 -
将kubeadm、kubelet、kubectl二进制放入系统path /usr/bin 并添加执行权限
-
配置文件以及启动kubelet服务
1
|
# 对应 10-kubeadm.conf |
2
|
mkdir -p /etc/systemd/system/kubelet.service.d/ |
1
|
# 对应 kubelet.service |
2
|
mkdir -p /etc/systemd/system/ |
创建服务路径,并将安装包中的k8s目录下的配置文件依次将文件放入之后,启动kubelet系统服务
1
|
systemctl enable --now kubelet |
5.检查docker 设置
kubelet需要和docker拥有的相同的cgroup才能正常运行,kubelet默认配置文件中cgroup设置为 systemd 和docker默认的 cgroupfs
由于多数linux发行版中cgroup也为systemd,因此k8s社区推荐配置为与系统一致,检查/etc/docker/daemon.json路径下的配置文件是否配置为systemd
1
|
# 如果没有相关配置 则需要创建路径 |
2
|
vim /etc/docker/daemon.json |
1
|
# 修改native.cgroupdriver为systemd |
2
|
{ |
3
|
··· |
4
|
"exec-opts": ["native.cgroupdriver=systemd"], |
5
|
··· |
6
|
} |
1
|
systemctl daemon-reload |
2
|
systemctl restart docker |
- 通过kubeadm执行k8s初始化
1
|
# 首先关闭swap分区 |
2
|
swapoff -a |
3
|
|
4
|
# 重置k8s及相关路径 |
5
|
kubeadm reset |
6
|
rm -rf /etc/cni/net.d |
7
|
rm -rf /root/.kube/ |
8
|
|
9
|
# 禁用代理 |
10
|
unset http_proxy |
11
|
unset https_proxy |
12
|
|
13
|
# 通过kubeadm执行初始化化,配置版本信息、网络端口以及apiserver的地址(即本机地址) |
14
|
kubeadm init --kubernetes-version=v1.22.12 --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=51.38.66.67 |
安装日志会显示缺失的相关工具软件 如socat和conntrack-tools等,缺失时请先安装后再执行k8s初始化
启动成功的情况会显示以下结果
如果因为各种原因导致k8s初始化失败,在排除其他问题之后重新初始化之前需要先清理之前失败的各项初始化数据。
1
|
# 重置k8s及相关路径 |
2
|
kubeadm reset |
3
|
|
4
|
# 再次执行初始化 |
5
|
kubeadm init --kubernetes-version=v1.22.12 --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=51.38.66.67 |
根据回显的内容,创建k8s默认配置文件路径,完成此项配置后kubectl可以获取集群信息
1
|
mkdir -p $HOME/.kube |
2
|
cp -f /etc/kubernetes/admin.conf $HOME/.kube/config |
3
|
chown $(id -u):$(id -g) $HOME/.kube/config |
此时通过kubectl获取节点和pod时会发现节点未就绪,且coredns未能正常运行
- 配置calico
1
|
# 完成相关镜像导入之后,直接通过kubectl启动calico.yaml |
2
|
# 路径为安装包内 k8s目录内的 plugin/calico/ 子目录内 |
3
|
|
4
|
kubectl apply -f calico.yaml |
如果未配置相关主节点标签,会导致calico相关的controller和node镜像无法启动
k8s默认主节点不能用于容器部署,需要去掉相关标签
1
|
kubectl taint nodes --all node-role.kubernetes.io/master- |
完成以上步骤之后可以通过kubectl查询当前节点及pod,安装成功的话全部kubesystem命名空间下pod均会处于正常运行状态
部分相关问题排查:
- 设备重启之后,kubelet服务启动失败,告警为不支持交换分区,由于部分系统重启会重置分区,需要重新关闭swap分区
1
|
swapoff -a |
- kubelet服务报错
安装时报错
通过检查kubelet服务日志进行排查
1
|
journalctl -u kubelet |
如果未提前检查docker的cgroup设置 可能情况为docker和k8s的cgroup设置不相同
需要修改docker配置
1
|
# 如果没有相关配置 则需要创建路径 |
2
|
vim /etc/docker/daemon.json |
1
|
# 修改native.cgroupdriver为systemd |
2
|
{ |
3
|
··· |
4
|
"exec-opts": ["native.cgroupdriver=systemd"], |
5
|
··· |
6
|
} |
1
|
systemctl daemon-reload |
2
|
systemctl restart docker |
检查节点注册成功后,kubelet启动成功
-
coredns无法启动:
缺少网络插件,在calico成功运行之后即可成功解决 -
calico相关的controller和node镜像无法启动
k8s默认主节点不能用于容器部署,需要去掉相关标签
1
|
kubectl taint nodes --all node-role.kubernetes.io/master- |
2
|
kubeedge(版本1.12.1)安装
kubeedge最方便的安装方式为通过keadm二进制安装, 然而keadm安装过程需要连接外部https代理在线安装,尚未解决代理tls问题,因此一下采用手动离线安装方式
云侧安装
首先通过kubectl安装离线包中的kubeedge用于设备管理的CRD配置文件
1
|
kubectl apply -f cluster_objectsync_v1alpha1.yaml |
2
|
kubectl apply -f devices_v1alpha2_device.yaml |
3
|
kubectl apply -f devices_v1alpha2_devicemodel.yaml |
4
|
kubectl apply -f objectsync_v1alpha1.yaml |
5
|
kubectl apply -f router_v1_rule.yaml |
6
|
kubectl apply -f router_v1_ruleEndpoint.yaml |
1
|
# 创建kubeedge工作目录, 如果存在对应目录 请清理目录下的./ca/ 和 ./certs/ |
2
|
mkdir -p /etc/kubeedge/ |
将软件包中的cloudcore二进制文件放入 /usr/local/bin/ 目录并添加执行权限
1
|
# /etc/kubeedge/config/ 目录需要手动创建 |
2
|
mkdir -p /etc/kubeedge/config/ |
3
|
|
4
|
# 生成cloudcore最小配置 |
5
|
cloudcore --minconfig > /etc/kubeedge/config/cloudcore.yaml |
修改cloudcore.yaml配置文件:
添加kubeAPIConfig项 用于导入k8s配置
设置advertiseAddress为云侧IP地址
将cloudhub下的 https.enable 项设置为true 开启cloudhub
完成配置后需要使用到离线包内的证书生成脚本(位置为离线包kubeedge目录下) certgen.sh
keadm安装的时候自动会执行脚本,手动二进制安装过程,在社区文档中未提及,此步骤不可缺
1
|
# 将该脚本放置于任意目录,并执行最后的ip地址为云侧ip |
2
|
chmod +x ./certgen.sh |
3
|
bash certgen.sh genCertAndKey server /etc/kubeedge/certs 51.38.66.67 |
执行以上脚本之后,可以在/etc/kubeedge/目录下看到生成的/ca/目录和/certs/目录, 及其中的具体证书内容
注意,使用证书生成脚本的时候需要设置正确的设备时间,防止出现证书时间问题
完成以上配置之后, 即可通过以下命令启动cloudcore云侧
1
|
# 配置文件路径和日志路径可按需更改 |
2
|
cloudcore --config /etc/kubeedge/config/cloudcore.yaml > cloudcore.log 2>&1 & |
如果其运行日志出现以下输出,表示云侧启动正常
此时可以通过以下命令获取边侧所需要的的token,将会在接下来的边侧部署中使用
1
|
kubectl get secret -nkubeedge tokensecret -o=jsonpath='{.data.tokendata}' | base64 -d |
以上步骤及包括MEF云侧需要安装的环境部分,如果需要通过MEF
边侧部署
以下步骤为部署开源kubeedge边侧edgecore方式,需要原生使用开源edgecore或者MEF仅调试节点管理及应用管理需要使用此类部署方式,如果是需要搭建完整MEF云边系统,请使用MEF的installer进行边侧的安装部署
如果选用其他版本的kubeedge,请使用相同版本包内的云侧cloudcore和边侧edgecore, kubeedge兼容性参考官方文档:https://github.com/kubeedge/kubeedge#kubernetes-compatibility
1
|
# 创建kubeedge工作目录, 如果存在对应目录 请清理目录下的./ca/ 和 ./certs/ |
2
|
mkdir -p /etc/kubeedge/ |
将软件包中的edgecore二进制文件放入 /usr/local/bin/ 目录并添加执行权限
1
|
# 生成edgecore最小配置 |
2
|
edgecore --minconfig > /etc/kubeedge/config/edgecore.yaml |
修改edgecore配置文件:
edgehub部分
enable项修改为true
修改httpserver和websocket为云侧ip地址
修改token为从cloudcore处获取的token
edged部分
hostnameOverride可以配置边侧节点的名称,注意k8s节点名称必须唯一,否则会导致注册失败
podSandboxImage需要配置为可用的pause镜像,可以使用k8s搭建时的pause_3.5.tar导入的镜像
其他选项根据需要进行配置
1
|
# 配置文件路径和日志路径可按需更改 |
2
|
edgecore --config /etc/kubeedge/config/edgecore.yaml >> edgecore.log 2>&1 & |
如果日志文件出现以下输出,表示边侧已正常连接云侧
此时云侧k8s能够获取节点信息, 若节点状态就绪,则安装成功。
1
|
kubectl get node |
补充部分, 如果需要将k8s主节点作为MEF云侧使用,在云侧安装功能未开发完成时,需要以下前置操作
需要执行以下命令:
1
|
# 创建主节点标签 |
2
|
kubectl label nodes ${主机节点名} masterselector=dls-master-node |
3
|
# 创建mindx-edge用户空间 |
4
|
kubectl create ns mindx-edge |
5
|
# 创建云侧用户 |
6
|
useradd -d /home/ MEFCenter -u 8000 -m |
7
|
# 创建日志目录 |
8
|
mkdir -p /var/log/mindx-edge/edge-manager |
9
|
chmod -R 750 /var/log/mindx-edge/edge-manager |
10
|
chown -R MEFCenter:MEFCenter /var/log/mindx-edge/edge-manager |
未验证功能及待后续补充:
当边侧节点连接上集群之后,云侧可以正常部署应用到边侧,以下未验证项影响待确定:
k8s会自动下发kube-proxy以及先前部署的calico的daemonset到边侧节点,目前这两个pod可以不拉起
1.12.1版本kubeedge会在云侧部署cloudcore的应用,其生效方式和作用目前未知
待补充:
以上软件系统服务化部署可根据需求自行设置
[WARN] 2023/09/25 18:11:14.465569 CST 1 kubeclient/kubeclient.go:121 modify kube-system components failed, get system daemonset error: Get \"https://51.38.69.45:6443/apis/apps/v1/namespaces/kube-system/daemonsets\": dial tcp 51.38.69.45:6443: connect: no route to host
关闭访问墙,即可
firewall-cmd --zone=public --add-port=6443/tcp
firewall-cmd --reload
1.k8s (提前下载镜像)
kubeadm reset
kubeadm init 最好可以指定version
执行kubeadm init ,可以指定版本 kubeadm init
kubeadm init --kubernetes-version=v1.17.3 --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=$masterIP
masterIP:用本机IP替换。
参数中192.168.0.0/16跟后续的Pod network add-on相关,这里我们选择的是Calico,详细信息可以参见官方文档:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
cp -i admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
2. calico(提前下载镜像)
find / -name calico.yaml
kubectl apply -f calico.yaml
3.去隔离
kubectl taint nodes --all node-role.kubernetes.io/master-\
kubectl get pods -n kube-system
kubectl label nodes masterselector=dls-master-node
kubectl get node --show-labels
4.mef
kubectl create ns mindx-edge
mkdir -p /var/log/mindx-edge/edge-manager
chmod -R 750 /var/log/mindx-edge/edge-manager
chown -R MEFCenter:MEFCenter /var/log/mindx-edge/edge-manager
5.crd
kubectl api-resources --api-group=apiextensions.k8s.io -o wide
查看
sed -n "/v1/p" devices_v1alpha2_device.yaml
修改
sed -i "s/io\/v1/io\/v1beta1/g" devices_v1alpha2_device.yaml
忽悠校验
kubectl apply --validate=false -f devices_v1alpha2_device.yaml
本文来自博客园,作者:易先讯,转载请注明原文链接:https://www.cnblogs.com/gongxianjin/p/17288905.html