KubeEdge安装

前言

KubeEdge分为云端和边缘端节点,大体上需要安装的内容如下。

云端需要安装:

  • docker
  • kubernetes组件
  • cloudcore

边缘端需要安装:

  • docker
  • Mosquitto
  • edgecore

注意边缘端不需要安装kubernetes组件。

由于KubeEdge建立在kubernetes之上,使用kubernetes为联网、应用部署和云与边缘之间的元数据同步提供核心基础设施支持。因此需要安装kubernetes。

Kubernetes默认的容器运行时(Container Runtime)为Docker,因此需要安装Docker。

Mosquitto是一个MQTT协议的代理服务。

操作系统 ip 角色
CentOS 7 192.168.110.100 master,云端
CentOS 7 192.168.110.101 node1,边缘端
CentOS 7 192.168.110.102 node2,边缘端

CentOS 7安装

有以下几点需要说明。

(1)在软件选择时,选择基础设施服务器

(2)在网络和主机名中修改为对应的主机名。

三个服务器分别修改为master、node1、node2。

(3)如果是在虚拟机上安装,建议配置静态ip,否则每次启动时ip可能会变。

网络和主机名中,点击配置,然后常规中勾选可用时自动链接到这个网络

在ipv4设置中配置静态ip。

准备工作

该部分在所有节点上执行。

安装glibc-2.28

使用strings /lib64/libc.so.6 |grep GLIBC_2.28命令查看是否存在glibc2.28版本。

如果不存在,则需要安装glibc2.28,否则后面使用keadm会报错。

首先升级GCC编译器,执行如下命令。

yum -y install centos-release-scl
yum -y install devtoolset-8-gcc devtoolset-8-gcc-c++ devtoolset-8-binutils
scl enable devtoolset-8 bash
echo "source /opt/rh/devtoolset-8/enable" >>/etc/profile

然后升级make,执行如下命令,安装make4.3版本。

wget http://mirrors.ustc.edu.cn/gnu/make/make-4.3.tar.gz
tar -xzf make-4.3.tar.gz
cd make-4.3
sudo ./configure
sudo make
sudo make install
sudo rm -rf /usr/bin/make
sudo cp ./make /usr/bin/
make -v

最后升级glibc,执行如下命令,安装glibc2.28版本。

wget  https://mirror.bjtu.edu.cn/gnu/libc/glibc-2.28.tar.xz --no-check-certificate
tar -xf glibc-2.28.tar.xz -C /usr/local

cd /usr/local/glibc-2.28/
mkdir build
cd build/
yum install -y bison

sudo ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

make
make install

这里编译所用的时间较长。

服务器配置

(1)修改主机名

可以在安装centos系统时就指定三个服务器的主机名。

也可以使用以下命令修改主机名。

hostnamectl set-hostname --static <hostname>

重启后生效。

(2)添加主机名解析

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

在三个节点的/etc/hosts文件中,添加以下内容。

192.168.110.100 master
192.168.110.101 node1
192.168.110.102 node2

(3)确保每个节点的主机名、MAC和product_uuid不同

  • 可以使用命令 ip linkifconfig -a 来获取网络接口的 MAC 地址
  • 可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令查看 product_uuid

(4)时间同步

在三个节点上使用ntpdate同步时间。

ntp常用服务器:

  1. 中国国家授时中心:210.72.145.44
  2. NTP服务器(上海) :ntp.api.bz
  3. 美国:time.nist.gov
  4. 复旦:ntp.fudan.edu.cn
  5. 微软公司授时主机(美国) :time.windows.com
  6. 台警大授时中心(台湾):asia.pool.ntp.org

这里使用命令如下:

ntpdate ntp.api.bz

(5)禁用firewalld服务

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

systemctl stop firewalld
systemctl disable firewalld

(6)禁用selinux

selinux是linux系统下的一个安全服务,但是会造成许多问题。

修改/etc/selinux/config文件,将SELINUX的值设置为disabled。

(7)禁用交换分区

swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用。为了保证kubernetes正常工作,需要禁用swap分区。

修改/etc/fstab文件,将swap一行注释。

(8)修改内核参数

首先要确保br_netfilter模块被内核加载。

#加载br_netfilter模块
sudo modprobe br_netfilter 

#查看br_netfilter模块是否被加载
lsmod | grep br_netfilter

修改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

使用以下命令重新加载配置。

sysctl -p

(9)配置ipvs功能

在Kubernetes中Service有两种代理模型,一种是基于iptables的,一种是基于ipvs的。

两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块。

首先安装ipset和ipvsadm。

yum install ipset ipvsadm -y

添加需要加载的模块写入脚本文件。

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

执行ipvs.modules脚本。

chmod +x /etc/sysconfig/modules/ipvs.modules
/bin/bash /etc/sysconfig/modules/ipvs.modules

查看是否加载成功。

lsmod | grep -e ip_vs -e nf_conntrack_ipv4

(10)重启服务器

重启服务器,以启用上面的更改。

reboot

安装Docker

首先更换Docker镜像源。

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

安装18.06.3版本的Docker,因为这个版本比较稳定,且不用配置额外的参数。

yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y

安装完docker后要启用镜像加速器,国内很多云服务商都提供了国内加速器服务。由于镜像服务可能出现宕机,建议同时配置多个镜像。

添加配置文件,使用镜像加速器。

mkdir /etc/docker
cat <<EOF> /etc/docker/daemon.json
{
	"registry-mirrors": [
	    "https://qsk3lswu.mirror.aliyuncs.com",
		"https://hub-mirror.c.163.com"
	]
}
EOF

重启docker,并且设置开机自启。

systemctl restart docker 
systemctl enable docker

安装kubernetes(K8S)

该部分只在master节点执行。

安装kubernetes相关组件

需要安装kubeadm、kubelet 和 kubectl,尽量使用相同的版本。

  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。

首先更换kubernetes镜像源。

编辑/etc/yum.repos.d/kubernetes.repo文件,添加以下配置。

[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

安装v1.17.4版本的kubeadm、kubelet、kubectl。

yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y

编辑/etc/sysconfig/kubelet,添加下面的配置,使用ipvs代理。

KUBE_PROXY_MODE="ipvs"

设置kubelet的开机自启。

systemctl enable kubelet

准备容器镜像

由于默认仓库k8s.gcr.io在国外无法访问,所以需要提前准备好集群所需镜像。

所需镜像可通过下面命令查看:

kubeadm config images list

下载镜像,在阿里云的仓库中下载,然后打标签为k8s.gcr.io,再把原始下载的镜像删掉。

images=(
	kube-apiserver:v1.17.17
	kube-controller-manager:v1.17.17
	kube-scheduler:v1.17.17
	kube-proxy:v1.17.17
	pause:3.1
	etcd:3.4.3-0
	coredns:1.6.5
)

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

集群初始化

kubeadm init \
 --apiserver-advertise-address=192.168.110.100 \
 --service-cidr=10.1.0.0/16 \
 --kubernetes-version=v1.17.17 \
 --pod-network-cidr=10.244.0.0/16

以上命令参数中,apiserver-advertise-address是master节点ip,kubernetes-version需要与上面下载的镜像版本一致,cidr的两个参数都是固定值。

运行成功后,出现以下提示。

按照提示,执行以下命令。

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

使用kubectl get nodes命令,可以看到现在只有master节点,并且状态是NotReady。

安装网络插件

该操作只在master节点上执行,插件使用的是DaemonSet的控制器,它会在每个节点上都运行。

kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可,本次选择flannel。

下载flannel的配置文件。

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

运行安装命令:

kubectl apply -f kube-flannel.yml

安装KubeEdge

安装keadm

在云端和边缘端上都安装keadm。

首先下载keadm。

参考 kubernetes-compatibility 了解 Kubernetes 兼容性来确定安装哪个版本的keadm。

wget https://github.com/kubeedge/kubeedge/releases/download/v1.10.1/keadm-v1.10.1-linux-amd64.tar.gz

服务器连github太慢的话,可以先下载好,再用ftp传到服务器上。

下载后进行解压,并将keadm配置进环境变量,方便使用。

tar -zxvf keadm-v1.10.1-linux-amd64.tar.gz
cd keadm-v1.10.1-linux-amd64/keadm
cp keadm /usr/sbin/

使用keadm version测试是否安装成功。

设置云端

使用keadm初始化,安装cloudcore。

keadm init --advertise-address=192.168.110.100 --kubeedge-version=1.10.1

以上参数分别为master节点地址和要安装的KubeEdge版本。

执行初始化命令,但因为连不上raw.githubusercontent.com出现报错。

可以在报错信息中,看到是在执行下面命令时出现错误:

bash -c cd /etc/kubeedge/ && wget -k --no-check-certificate --progress=bar:force https://github.com/kubeedge/kubeedge/releases/download/v1.10.1/kubeedge-v1.10.1-linux-amd64.tar.gz

这条命令是要下载kubeedge-v1.10.1-linux-amd64.tar.gz文件到/etc/kubeedge/目录中,因此可以手动下载这个文件,然后通过ftp上传到服务器的/etc/kubeedge/目录中。

再执行初始化命令,又在执行下面命令时出现错误:

bash -c cd /etc/kubeedge/ && sudo -E wget -t 5 -k --no-check-certificate https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.10/build/tools/cloudcore.service

这条命令是要下载cloudcore.service文件到/etc/kubeedge/目录中,访问网址发现该文件内容较少,所以直接在/etc/kubeedge/目录下新建文件cloudcore.service,然后将内容复制进去。

再次执行初始化命令,安装成功。

获取token。

keadm gettoken

设置边缘端

首先在边缘端节点上安装Mosquitto,Mosquitto是一个MQTT协议的代理服务。

yum -y update
yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install mosquitto

使用云端的token,加入边缘节点,安装edgecore。

keadm join --cloudcore-ipport=192.168.110.100:10000 --kubeedge-version=1.10.1 --token=f303a9597fbf15c5ad9abe049b24bae92b129b1831c7823039fce994778dbcaf.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTg3MzkwMjV9.McXWKqSeqzZ6YUPCO4c9-FqPOt9FDbKIZmlpsmtkgFo

执行命令后,同样因为连不上raw.githubusercontent.com出现报错。

在报错信息中,看到是在执行下面命令时出现错误:

bash -c cd /etc/kubeedge/ && wget -k --no-check-certificate --progress=bar:force https://github.com/kubeedge/kubeedge/releases/download/v1.10.1/kubeedge-v1.10.1-linux-amd64.tar.gz

这条命令是要下载kubeedge-v1.10.1-linux-amd64.tar.gz文件到/etc/kubeedge/目录中,因此可以手动下载这个文件,然后通过ftp上传到服务器的/etc/kubeedge/目录中。

再次执行keadm join命令,又在执行下面命令时出现错误:

bash -c cd /etc/kubeedge/ && sudo -E wget -t 5 -k --no-check-certificate https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.10/build/tools/edgecore.service

要下载edgecore.service文件到/etc/kubeedge/目录中,访问链接发现这个文件内容不多,所以直接在/etc/kubeedge/目录中新建文件edgecore.service,然后将内容复制进去。

再次执行keadm join命令,edgecore安装成功。

在master节点上使用kubectl get nodes查看,STATUS为ready且ROLES中有edge,则KubeEdge安装成功。

参考资料

Kubernetes文档
KubeEdge文档
Docker-从入门到实践
Kubernetes(K8S) 入门进阶实战完整教程
KubeEdge环境搭建指导书 - CentOS 7.6
kubeEdge v1.7使用keadm安装(半手动安装)
centos /lib64/libc.so.6: version 'GLIBC_2.28' not found

posted @ 2022-10-09 19:50  lnjoy  阅读(1201)  评论(0编辑  收藏  举报