Kubeeedge1.12.1安装过程,以及一些踩坑点

一. 云端节点, 计算节点,边缘节点——k8s,docker安装

1.1 检查操作系统的版本
# 此方式下安装kubernetes集群要求Centos版本要在7.5或之上
[root@master ~]# cat /etc/redhat-release
Centos Linux 7.5.1804 (Core)
1.2 主机名解析

为了方便集群节点间的直接调用,在这个配置一下主机名解析,企业中推荐使用内部DNS服务器

# 主机名成解析 编辑三台服务器的/etc/hosts文件,添加下面内容
192.168.227.100 master
192.168.227.101 computenode
192.168.227.102 edgenode
1.3 时间同步

kubernetes要求集群中的节点时间必须精确一直,这里使用chronyd服务从网络同步时间

企业中建议配置内部的会见同步服务器

# 启动chronyd服务
[root@master ~]# systemctl start chronyd
[root@master ~]# systemctl enable chronyd
[root@master ~]# date
1.4 禁用iptable和firewalld服务

kubrnetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

# 1 关闭firewalld服务
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
# 2 关闭iptables服务
[root@master ~]# systemctl stop iptables
[root@master ~]# systemctl disable iptables
1.5 禁用selinux

selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题

# 编辑 /etc/selinux/config 文件,修改SELINUX的值为disable
# 注意修改完毕之后需要重启linux服务,后面会统一重启
SELINUX=disabled
1.6 禁用swap分区

swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用

启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备

但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明

# 编辑分区配置文件/etc/fstab,注释掉swap分区一行
# 注意修改完毕之后需要重启linux服务
vim /etc/fstab
注释掉 /dev/mapper/centos-swap swap
# /dev/mapper/centos-swap swap
1.7 修改linux的内核参数
# 修改linux的内核采纳数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

# 重新加载配置
[root@master ~]# sysctl -p
# 加载网桥过滤模块
[root@master ~]# modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
[root@master ~]# lsmod | grep br_netfilter
br_netfilter
1.8 配置ipvs功能

在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块

# 1.安装ipset和ipvsadm
[root@master ~]# yum install ipset ipvsadm -y
# 2.添加需要加载的模块写入脚本文件
[root@master ~]# cat <<EOF> /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
EOF
# 3.为脚本添加执行权限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
# 4.执行脚本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
# 5.查看对应的模块是否加载成功
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
1.9 安装docker
# 1、切换镜像源
[root@master ~]# yum install -y yum-utils
[root@master ~]# yum -y update
[root@master ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast

# 2、查看当前镜像源中支持的docker版本
[root@master ~]# yum list docker-ce --showduplicates

# 3、安装特定版本的docker-ce
# 必须制定--setopt=obsoletes=0,否则yum会自动安装更高版本
[root@master ~]# yum -y install docker-ce-20.10.21

# 4、添加一个配置文件
#Docker 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用systemd来替代cgroupfs
[root@master ~]# mkdir /etc/docker
[root@master ~]# cat <<EOF> /etc/docker/daemon.json
{
	"exec-opts": ["native.cgroupdriver=systemd"],
	"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF

# 5、启动dokcer
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker
1.10 安装Kubernetes组件
# 1、由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
# 2、编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
			http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

# 3、安装kubeadm、kubelet和kubectl
[root@master ~]# yum -y install kubelet-1.21.3 kubeadm-1.21.3 kubectl-1.21.3

# 4、配置kubelet的cgroup
#编辑/etc/sysconfig/kubelet, 添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

# 5、设置kubelet开机自启
[root@master ~]# systemctl enable kubelet
1.11 准备集群镜像
# 在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看,查看版本
[root@master ~]# kubeadm config images list

# 下载镜像
# 此镜像kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替换方案
images=(
	kube-apiserver:v1.21.3
	kube-controller-manager:v1.21.3
	kube-scheduler:v1.21.3
	kube-proxy:v1.21.3
	pause:3.4.1
	etcd:3.4.13-0
	coredns:1.8.0
)

for imageName in ${images[@]};do
	docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
	docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
	docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName 
done
1.12 集群初始化

下面的操作只需要在master节点上执行即可

# 创建集群
[root@master ~]# kubeadm init \
	--apiserver-advertise-address=192.168.227.100 \  # 这里是IP地址
	--image-repository registry.aliyuncs.com/google_containers \
	--kubernetes-version=v1.21.3 \
	--service-cidr=10.96.0.0/12 \
	--pod-network-cidr=10.244.0.0/16 \
    --apiserver-cert-extra-sans=192.168.227.100
# 创建必要文件
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

下面的操作只需要在compute node节点上执行即可(不要在边缘端执行)

kubeadm join 192.168.61.100:6443 --token 7biry1.wd2n3zl1irxjqh1s \
    --discovery-token-ca-cert-hash sha256:65884ad103ed898e51f4e6d95f96ca6f7ed32ccb387d7d70843428f69c074d0f

在master上查看节点信息

[root@master ~]# kubectl get nodes 状态是NotReady,因为网络没有装
NAME    STATUS   ROLES     AGE   VERSION
master  NotReady  master   6m    v1.21.3
computenode   NotReady   <none>  22s   v1.21.3
1.13 安装网络插件,只在master节点操作即可
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # 保存到桌面传过去
kubectl apply -f kube-flannel.yml

二. 配置云端

2.1 安装Golang(master节点和edgenode节点配置)
# 下载文件 解压Go包
wget https://golang.google.cn/dl/go1.17.linux-amd64.tar.gz
tar -zxf go1.17.linux-amd64.tar.gz -C /usr/local
# 配置环境变量
vim /etc/profile

#golang config
export GOROOT=/usr/local/go 
export GOPATH=/data/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
# 将变量配置生效
source /etc/profile

go version
2.2 安装keadm(按需修改版本号)
wget https://github.com/kubeedge/kubeedge/releases/download/v1.12.1/keadm-v1.12.1-linux-amd64.tar.gz  #下载keadm,根据版本可以到官网下载
tar -zxvf keadm-v1.12.1-linux-amd64.tar.gz # 解压keadm的tar.gz的包

cd keadm-v1.12.1-linux-amd64/keadm/ 

cp keadm /usr/sbin/ #将其配置进入环境变量,方便使用
2.3 keadm init(安装cloudcore)
# 去除污点
kubectl taint node master2 node-role.kubernetes.io/master-
# 二选一(看目录)
./keadm-v1.12.1-linux-amd64/keadm/keadm init --advertise-address="192.168.227.100" --kubeedge-version=1.12.1
./keadm init --advertise-address="192.168.227.100" --kubeedge-version=1.12.1
2.3.1 keadm init 出错解决方案
# 查看kubeedge状态(可以重启试试重新加入)
kubectl get all -nkubeedge

(3.2.2 和 3.2.3)
# /etc/hosts里添加
# GitHub Start
52.74.223.119 github.com
192.30.253.119 gist.github.com
54.169.195.247 api.github.com
185.199.111.153 assets-cdn.github.com
151.101.76.133 raw.githubusercontent.com
151.101.108.133 user-images.githubusercontent.com
151.101.76.133 gist.githubusercontent.com
151.101.76.133 cloud.githubusercontent.com
151.101.76.133 camo.githubusercontent.com
151.101.76.133 avatars0.githubusercontent.com
151.101.76.133 avatars1.githubusercontent.com
151.101.76.133 avatars2.githubusercontent.com
151.101.76.133 avatars3.githubusercontent.com
151.101.76.133 avatars4.githubusercontent.com
151.101.76.133 avatars5.githubusercontent.com
151.101.76.133 avatars6.githubusercontent.com
151.101.76.133 avatars7.githubusercontent.com
151.101.76.133 avatars8.githubusercontent.com
# GitHub End



# 报错的时候可能需要去除kubeedge.json
# 开另外一个终端
kubectl proxy
# 在原来终端
kubectl get ns kubeedge -o json > kubeedge.json # 修改finalize
curl -k -H "Content-Type: application/json" -X PUT --data-binary @kubeedge.json http://127.0.0.1:8001/api/v1/namespaces/kubeedge/finalize
2.4 获取token
keadm gettoken
2.5 配置cloudcore开机自启动服务(后期版本以容器化运行,所以不用配,可以查看端口号10000,10002)
#查看cloudcore启动情况
ps aux|grep cloudcore

#输出如下表示启动:
root     23498  0.1  0.3 1012544 48640 ?       Ssl  May12  13:11 /usr/local/bin/cloudcore

#查看端口 10000 10002 端口都有了
#没有netstat命令,安装:yum install net-tools -y
netstat -tpnl
#如下:
tcp6       0      0 :::10000                :::*                    LISTEN      23498/cloudcore     
tcp6       0      0 :::10002                :::*                    LISTEN      23498/cloudcore     

#查看cloudcore启动状态
systemctl status cloudcore

#如果没有设置开机启动服务则设置 复制开启自启动服务文件
cp /etc/kubeedge/cloudcore.service /etc/systemd/system/cloudcore.service

#添加文件权限
chmod +x /etc/systemd/system/cloudcore.service

#重新加载配置文件
systemctl daemon-reload

#查看cloudcore启动的进程id,然后杀掉
ps aux|grep cloudcore
#输出如下:
root     23498  0.1  0.3 1012544 48640 ?       Ssl  May12  13:12 /usr/local/bin/cloudcore
#杀掉
kill -9 23498

#启动cloudcore
systemctl start cloudcore

#设置开机自启动
systemctl enable cloudcore.service

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

#重新启动cloudcore
systemctl restart cloudcore

三. 配置边缘端

3.1 安装Golang
# 下载文件 解压Go包
wget https://golang.google.cn/dl/go1.17.linux-amd64.tar.gz
tar -zxf go1.17.linux-amd64.tar.gz -C /usr/local
# 配置环境变量
vim /etc/profile

#golang config
export GOROOT=/usr/local/go 
export GOPATH=/data/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
# 将变量配置生效
source /etc/profile

go version
3.2 安装keadm(和master一致)
wget https://github.com/kubeedge/kubeedge/releases/download/v1.21.1/keadm-v1.21.1-linux-amd64.tar.gz  #下载keadm
tar -zxvf keadm-v1.21.1-linux-amd64.tar.gz # 解压keadm的tar.gz的包

cd keadm-v1.21.1-linux-amd64/keadm/ 

cp keadm /usr/sbin/ #将其配置进入环境变量,方便使用
3.3 加入cloud((1.13版本容器运行不是docker需要指定))
./keadm join --cloudcore-ipport=192.168.240.100:10000 --edgenode-name=edge --kubeedge-version=1.13.0 --token=<上面keadm gettoken里面的返回内容>
3.3.1 加入cloud报错
# 边缘节点join时报错后,需要将service,证书,kubeedge/config等相关文件删除后重新join
# 一定要在keadm文件夹下
./keadm reset

# 
3.2.2 3.5
host文件github第一行删除


# Get ImageStatus from image service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.ImageService" image="kubeedge/installation-package:v1.13.0"
# 解决方案:or you could set -r parameter to use docker as your runtime when keadm join
3.3.2 docker修改
# 查看edgecore的日志
journalctl -u edgecore.service -xe

# Aug 12 22:29:23 k8s-edge01 edgecore[1407]: E0812 22:29:23.433701    1407 edged.go:264] init new edged error, misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"
# 说明需要把docker的驱动改为cgroupfs
vim /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=cgroupfs"]
}

# 重启docker,然后查看
systemctl daemon-reload
systemctl restart docker
3.3 云端证书
# F1209 10:30:52.247227 49180 certmanager.go:92] Error: failed to get edge certificate from the cloudcore, error: Get “https://192.168.194.130:30002/edge.crt”: x509: certificate is valid for 10.233.70.40, not 192.168.194.130

# CloudCore安装时配置的advertise-address,为逗号分隔的多个地址,需要提前规划好
vim /etc/kubeedge/config/edgecore.yaml

# 清理证书
kubectl delete secret casecret cloudcoresecret -n kubeedge

#重新启动cloudcore
systemctl restart cloudcore

# 边缘节点重新join

四. edgeX Foundary安装配置

4.1 安装docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.11.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

将可执行权限应用于二进制文件

sudo chmod +x /usr/local/bin/docker-compose

创建软链

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

测试是否安装成功

docker-compose version
4.2 下载yml文件
# 下载完改成docker-compose.yml 即可
wget https://raw.githubusercontent.com/edgexfoundry/developer-scripts/master/releases/edinburgh/compose-files/docker-compose-edinburgh-1.0.1.yml
4.3 下载镜像
docker-compose pull
4.4 启动微服务
docker-compose up -d
4.5 验证容器已启动
docker-compose ps
4.6 访问页面
http://192.168.0.86:4000/#/dashboard # ui界面
http://192.168.0.86:59880/api/v2/event/device/name/Random-Integer-Device (core-data)
http://192.168.0.86:59882/api/v2/device/all (core- command)
http://192.168.0.86:59881/api/v2/deviceprofile/all (core-meta)