k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法

这篇具有很好参考价值的文章主要介绍了k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近在学习边缘计算要用到kubeedge,安装了好多次总会遇到各种各样的问题,因此在这里一一列出,以方便下次安装。则里面可能出错的地方太多,如果有问题,请私信联系。

一、环境准备

节点 IP 环境 软件
云端节点 172.23.70.235 Centos7(>2核4g) kubernetes+cloudcore
边端节点 172.23.70.34 Centos7(>2核4g) kubeedge(edgecore)

二、安装须知

  1. 为简单方便,本次安装仅需要一个k8s云节点,一个kubeedge边节点,两台服务器即可
  2. k8s只需要安装在master节点上,边缘节点不需要
  3. 云边两台服务器都需要安装docker
  4. calico只需要安装在master上,它是节点通信的插件,如果没有这个,master上安装kubeedge的coredns会报错。但是,节点上又不需要安装这个,因为kubeedge针对这个做了自己的通信机制。
  5. 一些插件比如calico、edgemesh、sedna、metric-service还有kuborad等,都是通过yaml文件启动的,所以实际要下载的是k8s的控制工具kubeadm和kubeedge的控制工具keadm。然后提前准备好刚才的yaml文件,启动k8s和kubeedge后,直接根据yaml文件容器创建
  6. 了解image、container、pod等概念,k8s的快速入门了解可以参考该地址,并配有视频:(K8S)快速入门简介:https://k8s.easydoc.net/docs/dRiQjyTY/28366845/6GiNOzyZ/9EX8Cp45
  7. 了解k8s基础指令:容器运行时工具基本用法
  8. 遇到问题要耐心读容器日志,耐心读官方文档,多逛github社区,遇到的问题可能大部分人也会遇到,相信会找到想要的答案。

三、k8s-master节点安装

3.1 前置须知

准备好以上环境后开始安装,这里我们的centos使用的是 centos7.9, 不同版本的系统对k8s影响较大,具体看实际情况而定。 有的还需要更新系统内核。
以下操作仅在k8s-master节点上进行,为避免混乱其他需要在边节点进行的在下个节点再说。

系统配置要求:2c 2g 20g 以上,, cpu 至少为2核,否则k8s初始化无法成功。 建议master节点内存给4g

k8s安装有多种方式:

  1. 使用minikube安装单节点集群,用于测试
  2. 采用工具kubeadm – 我们使用的这种方式(开发环境,机器比较少(几十台以下))
  3. 使用kubespray, google官方提供的工具
  4. 全手动: 二进制安装(运维)
  5. 全自动安装: rancher、kubesphere (大型生产环境,百台,万台机器)

k8s health会依赖一些端口,为了不出现网络问题,我们在虚拟机(master)中开放以下端口:

  1. 6443 主要
  2. 2379
  3. 2380

3.2 k8s环境准备

  • 1、hostname配置
    (配置本机主机名,我们需要设置hostname为 “k8s-master” ,与hosts 相匹配)
# 设置当前机器的hostname
hostnamectl set-hostname k8s-master
# 查看当前机器hostname
hostname
  • 2、hosts配置
vim /etc/hosts

172.23.70.235 k8s-master
172.23.70.34 kubeedge
  • 3、基础依赖包安装
# 基础依赖包安装
 yum -y install wget vim net-tools ntpdate  bash-completion

# 系统时钟同步
# 向阿里云服务器同步时间
ntpdate time1.aliyun.com
# 删除本地时间并设置时区为上海
rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 查看时间
date -R || date
  • 4、关闭防火墙、selinux
 systemctl stop firewalld
 systemctl disable firewalld
 sed -i 's/enforcing/disabled/' /etc/selinux/config
 setenforce 0

  • 5、关闭swap
# 临时关闭Swap
swapoff -a
# 修改 /etc/fstab 删除或者注释掉swap的挂载,可永久关闭swap
sed -i '/swap/s/^/#/' /etc/fstab
# 修改完后我们检测以下,看最后一行swap 都是0 就成功了
free -m
#----------------start----------------------
              total        used        free      shared  buff/cache   available
Mem:           1837         721          69          10        1046         944
Swap:             0           0           0
#-----------------end---------------------

  • 6、网桥过滤
# 网桥过滤
vim /etc/sysctl.conf

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.ipv4.ip_forward=1
net.ipv4.ip_forward_use_pmtu = 0

# 生效命令
sysctl --system
# 查看效果
sysctl -a|grep "ip_forward"

  • 7、开启ipvs
    kubernetes1.8版本开始,新增了kube-proxy对ipvs的支持,性能和追踪问题比iptable强)------ 此步骤为选填项,如果不执行那么默认使用iptables
# 安装IPVS
yum -y install ipset ipvsdm
# 编译ipvs.modules文件
vi /etc/sysconfig/modules/ipvs.modules
# 文件内容如下
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
# 赋予权限并执行
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules &&lsmod | grep -e ip_vs -e nf_conntrack_ipv4
# 重启电脑,检查是否生效
reboot
lsmod | grep ip_vs_rr

3.3 Docker安装

  • docker 换源安装
# 安装yum utils
yum install -y yum-utils
# yum docker-ce config 换源
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
yum -y install docker-ce docker-ce-cli containerd.io
# 启动docker, enable 为必须,k8s会检测docker.service
systemctl enable docker && systemctl start docker

  • docker配置镜像加速
    exec-opts参数配置为native.cgroupdriver=systemd,这一步很重要,下面的镜像地址参考阿里云。
# 创建docker目录
mkdir -p /etc/docker
# 设置镜像源, exec-opts必须指定否则k8s启动报错(cgroup、systemd)
tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://g6t55xi7.mirror.aliyuncs.com"]
}
EOF
# 重启docke并生效镜像加速
systemctl daemon-reload && systemctl restart docker

3.4 Kubernetes安装

  • 配置kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

注意:阿里源并未与官网同步gpg(由于官网未开放同步方式, 可能会有索引gpg检查失败的情况,这时请用如下命令安装)
注意:阿里源并未与官网同步gpg(由于官网未开放同步方式, 可能会有索引gpg检查失败的情况,这时请用如下命令安装)

# 检测可用的k8s版本(--nogpgcheck 忽略gpg检测)
yum list --nogpgcheck  --showduplicates kubeadm --disableexcludes=kubernetes
# 找到我们想要安装的版本,并安装--------------这里我们用1.23.8版本,最新版目前是1.24.0 版本安装启用了docker 会有一些问题。
# 安装kubelet、kubeadm、kubectl 组件--- 这里要注意,docker 版本和 k8s版本有关系,尽量使用支持区间的版本
# yum install --nogpgcheck kubelet-1.23.8 kubeadm-1.23.8 kubectl-1.23.8
yum -y install --nogpgcheck kubelet-1.23.8 kubeadm-1.23.8 kubectl-1.23.8

  • 安装完成后我们检查一下
# 检查kubectl version
kubectl version
##########show start############
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.23.8", GitCommit:"5575935422cc1cf5169dfc8847cb587aa47bac5a", GitTreeState:"clean", BuildDate:"2021-06-16T13:00:45Z", GoVersion:"go1.15.13", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
###########show end###########
# 检查kubeadm版本
kubeadm version
##########show start############
kubeadm version: &version.Info{Major:"1", Minor:"20", GitVersion:"v1.23.8", GitCommit:"5575935422cc1cf5169dfc8847cb587aa47bac5a", GitTreeState:"clean", BuildDate:"2021-06-16T12:58:46Z", GoVersion:"go1.15.13", Compiler:"gc", Platform:"linux/amd64"}
##########show end############

  • 启动k8s服务
# 启动k8s服务
systemctl enable kubelet && systemctl start kubelet
# 查看服务状态
systemctl status kubelet

# 如果不指定版本初始化那么会使用最新的k8s,有可能存在的报错信息如下,需要先手动设置下
# 运行初始化后有可能会报错:
#########错误信息--start###########
[init] Using Kubernetes version: v1.24.2
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR CRI]: container runtime is not running: output: E0627 16:44:11.772277   16359 remote_runtime.go:925] "Status from runtime service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
time="2023-03-27T16:44:11+08:00" level=fatal msg="getting status of runtime: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
#########错误信息--end###########
# 解决方案:
vim /etc/containerd/config.toml
# 从disabled_plugins 数组值中删除 "cri"属性
# 重启容器
systemctl restart containerd

  • k8s master 主节点初始化(仅master节点执行– 这里考虑的是单master)
# 初始化
kubeadm init  \
--image-repository registry.aliyuncs.com/google_containers  \
--apiserver-advertise-address=172.23.70.235  \
--service-cidr=10.222.0.0/16 \
--pod-network-cidr=10.244.0.0/16


#这里补充以下参数说明
--apiserver-advertise-address=172.23.70.235    这个参数就是master主机的IP地址,例如我的Master主机的IP是:172.23.70.235

--image-repository=registry.aliyuncs.com/google_containers  这个是镜像地址,由于国外地址无法访问,故使用的阿里云仓库地址:registry.aliyuncs.com/google_containers

--service-cidr=10.222.0.0/16       这个参数后的IP地址直接就套用10.222.0.0/16 ,以后安装时也套用即可,不要更改

--pod-network-cidr=10.244.0.0/16       k8s内部的pod节点之间网络可以使用的IP段,不能和service-cidr写一样,如果不知道怎么配,就先用这个10.244.0.0/16
还可以指定k8s版本,用以下参数即可
--kubernetes-version=v1.23.8   这个参数是下载的k8s软件版本号

总之,只修改master主机IP,k8s软件版本)



# 初始化过程比较长,需要下载一些资源

#---------------打印信息 start---------------------
I0628 15:14:20.293469    5655 version.go:255] remote version is much newer: v1.24.2; falling back to: stable-1.23
[init] Using Kubernetes version: v1.23.8
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local localhost.localdomain] and IPs [10.222.0.1 192.168.56.105]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [localhost localhost.localdomain] and IPs [192.168.56.105 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [localhost localhost.localdomain] and IPs [192.168.56.105 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 4.502756 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.23" in namespace kube-system with the configuration for the kubelets in the cluster
NOTE: The "kubelet-config-1.23" naming of the kubelet ConfigMap is deprecated. Once the UnversionedKubeletConfigMap feature gate graduates to Beta the default name will become just "kubelet-config". Kubeadm upgrade will handle this transition transparently.
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node localhost.localdomain as control-plane by adding the labels: [node-role.kubernetes.io/master(deprecated) node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node localhost.localdomain as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: 4yipfl.er9r8aqnq0hpd8a4
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 172.23.70.235:6443 --token 4yipfl.er9r8aqnq0hpd8a4 \
        --discovery-token-ca-cert-hash sha256:afa76da3ced528e667374693fb4b0edd160530c251471ae11ece13c65d3d162a

#---------------打印信息 end---------------------

这里补充以下解释说明:

参数名 示例值 含义
–kubernetes-version –kubernetes-version k8s软件版本号
–apiserver-advertise-address 172.23.70.235 这个参数就是master主机的IP地址
–image-repository registry.aliyuncs.com/google_containers 这个是镜像地址,由于国外地址无法访问,故使用的阿里云仓库地址
–service-cidr 10.222.0.0/16 这个参数后的IP地址直接就套用10.222.0.0/16 ,以后安装时也套用即可,不要更改
–pod-network-cidr 10.244.0.0/16 k8s内部的pod节点之间网络可以使用的IP段,不能和service-cidr写一样,如果不知道怎么配,就先用这个10.244.0.0/16

至此,kubeadm init(master 主节点)安装完成。
还需要进行一些收尾工作,根据kubeadm init log 提示,执行以下命令。

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

然后,我们就可以进行k8s的节点查询

# 查询节点
kubectl get nodes

#------------展示信息 start--------------
NAME           STATUS     ROLES                  AGE     VERSION
k8s-master   NotReady   control-plane,master   6m21s   v1.23.8
#------------展示信息 end----------------

此时, STATUS 是 NotReady状态,因为网络组件还未安装,Pod之间还不能通讯

查看各命名空间下的Pod信息

kubectl get pods --all-namespaces

#------------展示信息 start--------------

NAMESPACE     NAME                                   READY   STATUS    RESTARTS   AGE
kube-system   coredns-6d8c4cb4d-5bjmr                0/1     Pending   0          12m
kube-system   coredns-6d8c4cb4d-7w72l                0/1     Pending   0          12m
kube-system   etcd-k8s-master                        1/1     Running   0          12m
kube-system   kube-apiserver-k8s-master              1/1     Running   0          12m
kube-system   kube-controller-manager-k8s-master     1/1     Running   0          12m
kube-system   kube-proxy-rcsfg                       1/1     Running   0          12m
kube-system   kube-scheduler-k8s-master              1/1     Running   0          12m
#------------展示信息 end----------------

可以看到NDS解析服务coredns的pod还处于Pending状态未运行,也是因为网络组件还没安装。

3.5 网络插件的安装

下面我们进行网络组件的安装

  1. 常用网络插件

这里只简单说明下,推荐使用calico
flannel 和 calico 是常用的网络插件。
calico 的性能更好,使用场景更广一些。
flannel 没有网络策略,不能控制pod的访问。
这里我们用calico插件。

  • 插件安装
# calico插件安装
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# 插件安装过程较慢,请耐心等待
# 安装后我们查看pod状态,直到 所有 STATUS 为 Running 才启动成功
kubectl get pod --all-namespaces

#----------显示如下 start-------------
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-7bc6547ffb-2bnbh   1/1     Running   0          5m57s
kube-system   calico-node-rnhcv                          1/1     Running   0          5m57s
kube-system   coredns-6d8c4cb4d-5bjmr                    1/1     Running   0          90m
kube-system   coredns-6d8c4cb4d-7w72l                    1/1     Running   0          90m
kube-system   etcd-k8s-master                            1/1     Running   0          91m
kube-system   kube-apiserver-k8s-master                  1/1     Running   0          91m
kube-system   kube-controller-manager-k8s-master         1/1     Running   0          91m
kube-system   kube-proxy-rcsfg                           1/1     Running   0          90m
kube-system   kube-scheduler-k8s-master                  1/1     Running   0          91m
#----------显示如下 end---------------

# 查看k8s node 状态
kubectl get nodes

#----------显示如下 start-------------
k8s-master   Ready    control-plane,master   99m   v1.23.8
#----------显示如下 end---------------

支持,安装完成, 如果有条件的话,现在就可以做一个快照了,因为后面的操作很可能会频繁出错,这里多做一些备份是好的习惯。
下面介绍一些其他常用信息。

3.6 k8s常用命令

# 查看k8s 运行日志命令, 这个比较有用,在k8s 启动、kubeadm init、kubeadm join 阶段可以辅助分析问题。
journalctl -xefu kubelet 
# 查看k8s驱动
systemctl show --property=Environment kubelet |cat
# 重启k8s
systemctl restart kubelet
# 启动k8s
systemctl start kubelet
# 停止k8s
systemctl stop kubelet
# 开机自启k8s
systemctl enable kubelet

# dashboard 获取token
kubectl describe secret admin-user -n kubernetes-dashboard

# kubeadm 重置, 有些时候我们在使用kubeadm init 命令时会报错,我们根据错误提示修复问题后需要重新进行 init 操作,因此需要进行reset重置
kubeadm reset

环境信息

# k8s 安装目录
/etc/kubernetes/

总用量 32
-rw-------. 1 root root 5642 628 15:19 admin.conf
-rw-------. 1 root root 5674 628 15:19 controller-manager.conf
-rw-------. 1 root root 1986 628 15:19 kubelet.conf
drwxr-xr-x. 2 root root  113 628 15:19 manifests
drwxr-xr-x. 3 root root 4096 628 15:19 pki
-rw-------. 1 root root 5618 628 15:19 scheduler.conf

# 组件配置文件目录
/etc/kubernetes/manifests/

总用量 16
-rw-------. 1 root root 2310 628 15:19 etcd.yaml
-rw-------. 1 root root 3378 628 15:19 kube-apiserver.yaml
-rw-------. 1 root root 2879 628 15:19 kube-controller-manager.yaml
-rw-------. 1 root root 1464 628 15:19 kube-scheduler.yaml

# 自定义dashboard yaml文件目录
/opt/kube-dashboard/conf/

总用量 8
-rw-r--r--. 1 root root 1124 629 08:41 admin-user-dashboard.yaml
-rw-r--r--. 1 root root  285 629 08:25 k8s-dashboard.yaml

四、安装KubeEdge

还是在k8s-master节点!!!

  • 安装版本:v1.12.1
    如下图所示为kubernetes和Kubeedge版本对应关系,这里安装Kubeedge v1.12.1
    k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法

4.1 安装keadm

如果网络不好,也可采用离线安装。将以下文件下载下来,下载地址:https://github.com/kubeedge/kubeedge/releases/tag/v1.12.1
版本一定要对应,这里别搞错了,都是v1.12.1

k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法
右键复制链接地址(注意架构),节点中输入:

#查看自己的架构
uname -a
# 下载Keadm
wget https://github.com/kubeedge/kubeedge/releases/download/v1.13.0/keadm-v1.13.0-linux-amd64.tar.gz

#解压
tar zxvf keadm-v1.12.1-linux-amd64.tar.gz
#添加执行权限
chmod +x keadm-v1.12.1-linux-amd64/keadm/keadm 
#移动目录
mv keadm-v1.12.1-linux-amd64/keadm/keadm /usr/local/bin/
# 查看keadm是否安装
keadm version

#输出版本信息
version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.1", GitCommit:"919ad5378eaca3cb0c666c22a19db01261cbc9a6", GitTreeState:"clean", BuildDate:"2022-11-02T08:22:56Z", GoVersion:"go1.17", Compiler:"gc", Platform:"linux/amd64"}

4.2 启动Cloudcore

运行以下命令启动cloudecode,修改下面地址为k8s-master主机地址

sudo keadm init --advertise-address=172.23.70.235 --kubeedge-version=1.12.1 

# 查询cloudcore进程,如果查到cloudcore,表明启动成功
ps -ef | grep cloudcore		

出现问题:

execute keadm command failed: timed out waiting for the condition

这是因为cloudcore没有污点容忍,默认master节点是不部署应用的,可以用下面的命令查看污点:

kubectl describe nodes k8s-master | grep Taints

把master的污点删掉

 kubectl taint node k8s-master node-role.kubernetes.io/master-

# 然后重置
keadm reset
#再重新启动

这里很可能会因网络等问题下载不下来,或者运行出错等,可以具体问题具体分析,安装过程中我是在这一步遇到很多问题,但是现在也忘了,主要是网络问题吧,如果这里有问题可以留言一起沟通

查看端口

netstat -tpnl

出现10000,和10002,这两个端口算正常。
k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法
如果安装失败,可以通过以下命令重置,然后重新安装

keadm reset

4.2.1生成证书,后面会用到

# 使用以下命令生成证书
 keadm gettoken

# 输出
9424892067e8fa67b46f826274bfceae786b57ec988d276e345ab473828c2314.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODE3ODQwMTN9.sH06gTP7ugZFuuOzcmKiglMu-GcNLZo1R1J5T2msv5Q

至此,如果不出问题的话云端节点暂时安装完成,可以再打个快照,下面安装边缘节点。


4.3 边缘节点安装

以下在边缘节点操作!,IP为172.23.70.34的机器上

4.3.1 安装docker

前置准备

  • 1、hostname配置
    (配置本机主机名,我们需要设置hostname为 “k8s-master” ,与hosts 相匹配)
# 设置当前机器的hostname
hostnamectl set-hostname kubeedge
# 查看当前机器hostname
hostname
  • 2、hosts配置
vim /etc/hosts

172.23.70.235 k8s-master
172.23.70.34 kubeedge
  • 3、docker 换源安装
# 安装yum utils
yum install -y yum-utils
# yum docker-ce config 换源
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
yum -y install docker-ce docker-ce-cli containerd.io
# 启动docker, enable 为必须,k8s会检测docker.service
systemctl enable docker && systemctl start docker

  • 4、docker配置镜像加速
    exec-opts参数配置为native.cgroupdriver=cgroupfs,这一步很重要,下面的镜像地址参考阿里云。
# 创建docker目录
mkdir -p /etc/docker
# 设置镜像源, exec-opts必须指定否则k8s启动报错(cgroup、systemd)
tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=cgroupfs"],
  "registry-mirrors": ["https://g6t55xi7.mirror.aliyuncs.com"]
}
EOF
# 重启docke并生效镜像加速
systemctl daemon-reload && systemctl restart docker

4.3.2 在边缘节点安装keadm

同理,先下载安装keadm,这个步骤跟云端一样,如下:

# 下载Keadm
wget https://github.com/kubeedge/kubeedge/releases/download/v1.12.1/keadm-v1.12.1-linux-amd64.tar.gz

#解压
tar zxvf keadm-v1.12.1-linux-amd64.tar.gz
#添加执行权限
chmod +x keadm-v1.12.1-linux-amd64/keadm/keadm 
#移动目录
mv keadm-v1.12.1-linux-amd64/keadm/keadm /usr/local/bin/
# 查看keadm是否安装
keadm version

#输出版本信息
version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.1", GitCommit:"919ad5378eaca3cb0c666c22a19db01261cbc9a6", GitTreeState:"clean", BuildDate:"2022-11-02T08:22:56Z", GoVersion:"go1.17", Compiler:"gc", Platform:"linux/amd64"}

4.3.3 加入云节点管理

使用命令

#注意这里是要加入master的IP地址,token是master上四.2.1的步骤获取的
keadm join --cloudcore-ipport=172.23.70.235:10000 --kubeedge-version=1.12.1 --token=6ff1a09e9cc6beca30061ed96b189859e3e43d7932583d1b712adba49b4a28d6.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2Nzk3OTQ1MTV9.xUx5Q4-HcYpvvaSaStmgTmYNhzIgcmtm-Ev-EG5QblQ

这里如果有报错可以参考我其他博客提到的报错解决办法,例如

  • 安装KubeEdge报错Error: edge node join failed: unable to determine image API version: rpc error: code = U
  • KubeEdge安装加入边缘节点报错: error unmarshaling JSON: while decoding JSON: json: cannot unmarshal number into

检查是否安装成功
k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法

如下命令:

#启动edgecore      
systemctl start edgecore    

#设置开机自启
systemctl enable edgecore.service  

#查看edgecore开机启动状态 enabled:开启, disabled:关闭
systemctl is-enabled edgecore

#查看状态     
systemctl status edgecore 

#查看日志
journalctl -u edgecore.service -b

4.4 主节点查看验证(k8s-master)

要求所有的状态都为running或ready。

查看节点状态

# 查看节点状态
kubectl get nodes -o wide

k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法
查看kube-system安装

kubectl get pod -n kube-system

k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法
查看cloudcore安装

# 查看cloudcore安装
kubectl get pod -n kubeedge

k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法
如果状态都为running或ready,则安装完成。下一步开始安装EdgeMesh和Sedna。

4.5 部署可视化KuBoard(可选)

KuBord官网:https://kuboard.cn/install/v3/install-in-k8s.html#%E5%AE%89%E8%A3%85
提供的安装命令如下:

kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml

访问 Kuboard
在浏览器中打开链接 http://172.23.70.235:30080

输入初始用户名和密码,并登录

  • 用户名: admin
  • 密码: Kuboard123

部署完成后,进入30080端口可以看到这个命令,运行

k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法

curl -k 'http://172.23.70.235:30080/kuboard-api/cluster/default/kind/KubernetesCluster/default/resource/installAgentToKubernetes?token=VJr7EYvO0Dvh7eoB8JlYcN7S0GQhnPZE' > kuboard-agent.yaml
kubectl apply -f ./kuboard-agent.yaml

然后就可以看到集群信息了
k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法

五、Sedna安装

以下都是在k8s-master云节点中进行!!!

sedna安装官方文档:https://github.com/kubeedge/sedna/blob/main/docs/setup/install.md
这个文档看似挺简单,实则坑多着呢,我们一一来看。

看要求条件:
k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法
kubectlkubernetesKubeEdge我们都已安装完成,这里文档还提出并且还需要EdgeMesh在运行,所以先安装EdgeMesh

5.1 前置准备

EdgeMesh安装官方文档:https://edgemesh.netlify.app/zh/guide/#%E4%BE%9D%E8%B5%96%E7%8E%AF%E5%A2%83

根据官方文档描述:

  • 步骤1: 去除 K8s master 节点的污点
 kubectl taint nodes --all node-role.kubernetes.io/master-

如果 K8s master 节点上没有部署需要被代理的应用,上面的步骤也可以不执行。

  • 步骤2: 给 Kubernetes API 服务添加过滤标签
kubectl label services kubernetes service.edgemesh.kubeedge.io/service-proxy-name=""
  • 步骤3: 启用 KubeEdge 的边缘 Kube-API 端点服务
    请参考文档 边缘 Kube-API 端点 以启用此服务。边缘 Kube-API 端点

5.1.1 配置边缘 Kube-API 端点

步骤1: 在云端,开启 dynamicController 模块,配置完成后,需要重启 cloudcore

vim /etc/kubeedge/config/cloudcore.yaml
modules:
  ...
  dynamicController:
    enable: true
...

步骤2: 在边缘节点,打开 metaServer 模块(如果你的 KubeEdge < 1.8.0,还需关闭旧版 edgeMesh 模块),配置完成后,需要重启 edgecore

vim /etc/kubeedge/config/edgecore.yaml
modules:
  ...
  edgeMesh:
    enable: false
  ...
  metaManager:
    metaServer:
      enable: true
...

步骤3: 在边缘节点,配置 clusterDNS 和 clusterDomain,配置完成后,需要重启 edgecore

vim /etc/kubeedge/config/edgecore.yaml
modules:
  ...
  edged:
    ...
    tailoredKubeletConfig:
      ...
      clusterDNS:
      - 169.254.96.16
      clusterDomain: cluster.local

提示
步骤3的配置是为了边缘应用能够访问到 EdgeMesh 的 DNS 服务,与边缘 Kube-API 端点本身无关,但为了配置的流畅性,还是放在这里说明。
clusterDNS 设置的值 ‘169.254.96.16’ 来自于 commonConfig 中 bridgeDeviceIP 的默认值,正常情况下无需修改,非得修改请保持两者一致。

步骤4: 最后,在边缘节点,测试边缘 Kube-API 端点功能是否正常

curl 127.0.0.1:10550/api/v1/services
{"apiVersion":"v1","items":[{"apiVersion":"v1","kind":"Service","metadata":{"creat.......

注意
如果返回值是空列表,或者响应时长很久(接近 10s)才拿到返回值,说明你的配置可能有误,请仔细检查。

完成上述步骤之后,KubeEdge 的边缘 Kube-API 端点功能就已经开启了,接着继续部署 EdgeMesh 即可。

5.2 安装EdgeMesh

有两种方式安装,一种是Helm 安装,另一种是手动安装,这种会出问题。 推荐使用手动安装,安装方式如下:

  • 步骤1: 获取 EdgeMesh
git clone https://github.com/kubeedge/edgemesh.git
cd edgemesh
  • 步骤2: 安装 CRDs
 kubectl apply -f build/crds/istio/
customresourcedefinition.apiextensions.k8s.io/destinationrules.networking.istio.io created
customresourcedefinition.apiextensions.k8s.io/gateways.networking.istio.io created
customresourcedefinition.apiextensions.k8s.io/virtualservices.networking.istio.io created
  • 步骤3: 部署 edgemesh-agent
kubectl apply -f build/agent/resources/
serviceaccount/edgemesh-agent created
clusterrole.rbac.authorization.k8s.io/edgemesh-agent created
clusterrolebinding.rbac.authorization.k8s.io/edgemesh-agent created
configmap/edgemesh-agent-cfg created
configmap/edgemesh-agent-psk created
daemonset.apps/edgemesh-agent created

提示
请根据你的 K8s 集群设置 build/agent/resources/04-configmap.yaml 的 relayNodes,并重新生成 PSK 密码。

这里有个提示,我们要修改build/agent/resources/04-configmap.yaml这个文件,使用以下命令:

cd build/agent/resources
vim 04-configmap.yaml

改成如下图所示:
k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法
注意最下面的psk设置,重新另起一个终端,使用以下命令生成psk

openssl rand -base64 32

然后填上去保存,然后重新运行步骤3的部署。

  • 步骤4: 检验部署结果
kubectl get all -n kubeedge -o wide

安装成功如下图所示:
k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法

5.3 云边协同通信测试

如图所示,为验证我们edgemesh是否安装完成,通信是否正常,最好测试一下通信效果。
k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法
跨边云通信 ⭐
处于 edgezone 的 busybox-edge 应用能够访问云上的 tcp-echo-cloud 应用,处于 cloudzone 的 busybox-cloud 应用能够访问边缘的 tcp-echo-edge 应用

测试步骤:

在k8s-master(172.23.70.235)上执行以下命令:

kubectl apply -f examples/cloudzone.yaml
namespace/cloudzone created
deployment.apps/tcp-echo-cloud created
service/tcp-echo-cloud-svc created
deployment.apps/busybox-sleep-cloud created

在kubeedge(172.23.70.34)边缘节点上执行以下命令:

kubectl apply -f examples/edgezone.yaml
namespace/edgezone created
deployment.apps/tcp-echo-edge created
service/tcp-echo-edge-svc created
deployment.apps/busybox-sleep-edge created

这里如果边缘节点没有安装kubectl的话,可能执行失败,

报错提示:cannot stat ‘/etc/kubernetes/admin.conf’: No such file or directory

解决方式:
从k8s-master节点把etc/kubernetes/admin.conf拷贝过来,复制到kubeedge节点。

在k8s-master执行复制文件命令:

scp /etc/kubernetes/admin.conf root@172.23.70.34:/etc/kubernetes/admin.conf

输入密码就能即可。
然后在node节点执行:

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

source ~/.bash_profile

再次验证:

kubectl get pods

如果还不行,那就在node节点再安装以下kubectl,执行如下:

## 配置kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF


# 执行安装
yum -y install --nogpgcheck kubelet-1.23.8 kubeadm-1.23.8 kubectl-1.23.8

# 检查kubectl version
kubectl version

5.3.1 云访问边测试

#执行命令:
 BUSYBOX_POD=$(kubectl get all -n cloudzone | grep pod/busybox | awk '{print $1}')
 kubectl -n cloudzone exec $BUSYBOX_POD -c busybox -i -t -- sh
 telnet tcp-echo-edge-svc.edgezone 2701
Welcome, you are connected to node ke-edge1.
Running on Pod tcp-echo-edge.
In namespace edgezone.
With IP address 172.17.0.2.
Service default.
Hello Edge, I am Cloud.
Hello Edge, I am Cloud.

如图所示:
k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法

5.3.2 边访问云测试

$ BUSYBOX_CID=$(docker ps | grep k8s_busybox_busybox-sleep-edge | awk '{print $1}')
$ docker exec -it $BUSYBOX_CID sh
$ telnet tcp-echo-cloud-svc.cloudzone 2701
Welcome, you are connected to node k8s-master.
Running on Pod tcp-echo-cloud.
In namespace cloudzone.
With IP address 10.244.0.8.
Service default.
Hello Cloud, I am Edge.
Hello Cloud, I am Edge.

如图所示:
k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法
如果都通,说明没问题,可以继续安装Sedna了,否则,请逐个排查。常见问题及解决办法:全网最全EdgeMesh Q&A手册:https://zhuanlan.zhihu.com/p/585749690

5.4 Sedna安装

官网一键化安装seda(不建议,会出错)

# 不建议使用这种方式安装
curl https://raw.githubusercontent.com/kubeedge/sedna/main/scripts/installation/install.sh | SEDNA_ACTION=create bash -
  • 本地安装

下载install.sh文件

wget https://raw.githubusercontent.com/kubeedge/sedna/main/scripts/installation/install.sh

相关的修改

#改名字
mv install.sh offline-install.sh

#修改文件中的一下内容(sh的语法)
1.第28行:TMP_DIR='opt/sedna'
2.第34行:删除  trap "rm -rf '%TMP_DIR'" EXIT
3.第415行:删除  prepare

下载sedna的官网github:https://github.com/kubeedge/sedna/tree/main/build
k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法

git clone https://github.com/kubeedge/sedna.git

#将build和文件夹里的内容一块复制到sedna文件夹下:
cd build/ /opt/sedna/

然后,进入/opt/sedna目录,安装sedna:

#直接进入之前准备好的文件目录运行
SEDNA_ACTION=create bash - offline-install.sh

检查sedna安装状态:

kubectl get pod -n sedna

k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法
如果都为running,则安装成功,如此,就可以愉快的玩增量学习、联邦学习案例了。文章来源地址https://www.toymoban.com/news/detail-434750.html

六、参考资料

  • KubeEdge+Sedna安装全流程(超级避坑、精简版)
  • 全网最全EdgeMesh Q&A手册
  • 安装KubeEdge和Sedna以及热舒适度终身学习案例
  • 安装kube-sedna
  • KubeEdge环境搭建(支持网络插件flannel)
  • kubernetes 的安装与部署
  • kubernetes+KubeEdge云边环境的安装与部署
  • 边缘计算环境搭建之一——kubeedge安装与配置

到了这里,关于k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s 1.27新特性in-place使用方法:避坑指南(官方文档有坑,已提issue)

    按照官方文档试用新版的in-place特性时,一字不差地执行了,但是却出现了执行失败的情况: 执行 kubectl -n qos-example patch pod qos-demo-5 --patch \\\'{\\\"spec\\\":{\\\"containers\\\":[{\\\"name\\\":\\\"qos-demo-ctr-5\\\", \\\"resources\\\":{\\\"requests\\\":{\\\"cpu\\\":\\\"800m\\\"}, \\\"limits\\\":{\\\"cpu\\\":\\\"800m\\\"}}}]}}\\\' 后该pod一直处于 RunContainerError 状态; 使用 kub

    2024年02月08日
    浏览(45)
  • 超详细的kubeedge与kubernetes(k8s)环境配置教程

    注意: 对于kubeedge和k8s的监控可以参考这一篇——通过prometheus和grafana来监管数据; 对于虚拟机环境的搭建可以参考这一篇。 对于搭建所需文件:阿里云盘 本文最后由错误归纳。 文章每周更新,如果喜欢的话可以三联!!! 云端只部署一个master节点,边缘端部署一个edgen

    2024年02月04日
    浏览(43)
  • k8s系列文章一:安装指南

            当使用的Docker容器的数量变得越来越多时,对于端口、Docker容器的管理变得越来越麻烦,这时为方便管理容器,资源管理器随之出现,其中最出名的就是Kubernetes,简称K8s(因K与S间有8个字母),可以说k8s是docker的升级版,可用于docker集群配置管理微服务,同样的集群

    2024年02月05日
    浏览(41)
  • K8S学习指南-minikube的安装

    Minikube 是一个用于在本地开发环境中运行 Kubernetes 集群的工具。它允许开发人员在单个节点上体验 Kubernetes,无需配置复杂的生产环境。本指南将详细介绍在 Windows、CentOS 和 Ubuntu 系统上安装 Minikube 的步骤。 Minikube 需要使用 Hypervisor 来创建虚拟机。推荐使用 Hyper-V 或 VirtualB

    2024年02月04日
    浏览(41)
  • K8s全套快速入门

    google开源的容器化管理工具 机器数量十几台、上百台时,就可以考虑使用k8s 高可用、自动容灾恢复、灰度更新、一键回滚历史版本、方便伸缩扩展等 k8s集群架构: 通常:一主多从 master:主节点,控制平台,不需要很高性能,不跑任务,通常一个就行了,也可以开多个主节

    2024年02月08日
    浏览(38)
  • 深入了解Kubernetes(k8s):安装、使用和Java部署指南(持续更新中)

    Docker和Kubernetes是两个不同的概念和技术,它们在容器化应用和容器编排方面有着不同的功能和作用。 Docker: Docker是一个开源的容器化平台,用于构建、打包和运行应用程序。通过使用Docker,你可以将应用程序及其依赖项打包到一个独立的轻量级容器中,使其可以在不同的环

    2024年02月10日
    浏览(42)
  • K8S学习指南(49)-k8s的证书管理

    Kubernetes(K8s)是一款开源的容器编排平台,具有强大的集群管理和安全机制。在Kubernetes集群中,证书管理是一个关键的安全组成部分,用于保障集群通信的安全性和可信度。本文将深入讨论Kubernetes中的证书管理,包括证书的生成、颁发、续期以及如何在实际应用中进行合理

    2024年01月17日
    浏览(39)
  • K8S学习指南(37)-k8s权限管理对象User

    在Kubernetes(K8s)中,用户(User)是一个重要的权限管理对象,用于表示在集群中执行操作的实体。通过用户,Kubernetes能够对集群中的各种资源进行身份验证和授权。本文将深入研究Kubernetes中的用户对象,包括其基本概念、创建方式以及详细示例。 1. 用户是什么? 在Kubern

    2024年01月23日
    浏览(42)
  • K8S学习指南(28)-k8s存储对象Storage Classes

    随着云原生技术的飞速发展,Kubernetes(简称K8s)已成为容器编排的事实标准,为开发者提供了一个强大而灵活的平台。在Kubernetes中,存储管理是一个至关重要的方面,而Storage Classes(存储类)则是其中一个关键概念。本文将深入探讨K8s中的Storage Classes,详细介绍其原理、用

    2024年02月03日
    浏览(39)
  • k8s指南-Service

    目录: (1)k8s指南-概述 (2)k8s指南-架构 (3)k8s指南-工作负载(1) (4)k8s指南-工作负载(2) (5)k8s指南-工作负载(3) (6)k8s指南-工作负载(4) (7)k8s指南-Service (8)k8s指南-Ingress (9)k8s指南-DNS与服务发现 (10)K8S指南-平滑升级与自动扩缩容 在k8s集群中,虽然每个pod都会被分配一个单独的ip地址,但

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包