源码编译安装KubeEdge 1.3.1

一、机器信息介绍

[email protected]  docker用户,用于安装k8s master节点及作为KubeEdge的Cloud side
[email protected]  docker用户,用于作为KubeEdge的Edge side
cpu: 2核
内存:4GiB(内存太小会导致编译源码失败)

二、两台主机同时需要的预处理步骤

2.1 配置docker用户免密执行sudo命令(可跳过)
# 1. 切换到root账户
su
# 2. 编辑文件
visudo
# 3. 在文件最后加上下面的命令
docker        ALL=(ALL)       NOPASSWD: ALL
# 4. 切回docker用户
su docker
# 5. 测试docker用户执行sudo命令是否需要输入密码
sudo ls
2.2 关闭防火墙
# 1. 停止防火墙
sudo systemctl stop firewalld
# 2. 关闭防火墙开机自启动
sudo systemctl disable firewalld
2.3 关闭swap
# 1. 编辑文件
sudo vi /etc/fstab
# 2. 注释掉文件中带有swap字样的那一行,如下面的第二行被注释
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=b6c966ba-0040-443b-b036-4dfd6ccf48e6 /boot                   xfs     defaults        0 0
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

# 3. 关闭swap
sudo swapoff -a
2.4 禁用selinux
# 1. 编辑文件
sudo vi /etc/selinux/config
# 2. 修改SELINUX的值,改为disabled,如下
SELINUX=disabled
2.5 设置主机名hosts
# 1. 192.168.17.140主机上编辑文件
sudo vi /etc/hosts
# 2. 修改为如下的内容
127.0.0.1   edge-1
::1         edge-1

# 1. 192.168.17.141主机上编辑文件
sudo vi /etc/hosts
# 2. 修改为如下的内容
127.0.0.1   edge-2
::1         edge-2
2.6 安装docker
# 1. 创建文件
sudo vi /etc/yum.repos.d/docker-ce.repo
# 2. 写入如下内容
[docker-ce-stable]
name=Docker CE Stable - $basearch 
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable 
enabled=1 
gpgcheck=0 
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

# 3. 安装docker
sudo yum install docker-ce-18.06.1.ce-3.el7 -y
# 4. 启动docker
sudo systemctl start docker
# 5. 开机自启动docker
sudo systemctl enable docker
2.7 安装golang
# 1. 下载golang地址,版本为1.14.6
https://golang.org/doc/install?download=go1.14.6.linux-amd64.tar.gz
# 2. 解压,解压之后可以看到一个go目录
tar -xzvf go1.14.6.linux-amd64.tar.gz
# 3. 编辑文件,添加环境变量
sudo vi ~/.bash_profile
# 4. 编辑后的内容如下
export GOPATH=/home/docker/go   # 改为上面解压后的go目录的路径
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$GOPATH/bin
export PATH
# 5. 使环境变量生效
source ~/.bash_profile
# 6. 测试golang环境是否正常
go version
2.8 安装gcc和git(机器上已有的不需要安装)
# 1. 安装gcc
sudo yum install -y gcc
# 2. 验证gcc
gcc version
# 3. 安装git
sudo yum install -y git
# 4. 验证git
git verion

三、安装k8s的master节点(192.168.17.140节点)

3.1 安装kubelet
# 1. 切换到root账户
sudo su
# 2. 编辑文件
vi /etc/yum.repos.d/k8s.repo
# 3. 文件中写入如下内容
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=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
# 4. 执行安装
yum install -y kubelet-1.17.2 kubeadm-1.17.2 kubectl-1.17.2
# 5. 开机启动kubelet
systemctl enable kubelet
3.2 准备镜像
# 1. 拉取apiserver镜像并重新tag
docker image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.2
docker image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.2 k8s.gcr.io/kube-apiserver:v1.17.2

# 2. 拉取kube-controller-manager镜像并重新tag
docker image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.2
docker image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.2 k8s.gcr.io/kube-controller-manager:v1.17.2

# 3. 拉取kube-scheduler镜像并重新tag
docker image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.2
docker image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.2 k8s.gcr.io/kube-scheduler:v1.17.2

# 4. 拉取kube-proxy镜像并重新tag
docker image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.2
docker image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.2 k8s.gcr.io/kube-proxy:v1.17.2

# 5. 拉取pause镜像并重新tag
docker image pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker image tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1

# 6. 拉取etcd镜像并重新tag
docker image pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
docker image tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0

# 7. 拉取coredns镜像并重新tag
docker image pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5
docker image tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5 k8s.gcr.io/coredns:1.6.5
3.3 安装master节点
  1. 执行kubeadm init
kubeadm init   --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.17.140  --kubernetes-version v1.17.2
  1. kubeadm init 成功后
# 1. 切回docker用户
su docker
# 2. 执行以下三条命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.4 安装calico网络插件
# 1. 下载calico的yaml文件
wget https://docs.projectcalico.org/manifests/calico.yaml
# 2. 修改yaml文件参数
sed -i "s#192\.168\.0\.0/16#${POD_SUBNET}#" calico.yaml
# 3. 部署calico插件
kubectl apply -f calico.yaml
3.5 确保集群状态正常
# 1. 等待calico的pod运行正常
kubectl get po -nkube-system
# 2. 查看集群状态
kubectl get node

四、安装mosquitto (192.168.17.141节点)(可选)

# 1. 添加 EPEL 软件库
sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y
# 2. 安装
sudo yum install mosquitto -y
# 3. 验证mosquitto是否正常
## 3.1 开启3个shell终端
## 3.2 第一个shell终端执行
mosquitto
## 3.3 第二个shell终端执行,此时可以看到第一个终端里打印出接收到新的连接的日志
mosquitto_sub -t rimelink
## 3.4 第三个shell终端执行,此时可以看到第一个终端里打印出接收到新的连接的日志,同时第二个shell终端打印出‘hello, mosquitto’
mosquitto_pub -t rimelink -h localhost -m "hello, mosquitto"

五、编译cloudcore和edgecore

# 1. clone源码(可以在17.140主机上clone,然后scp发送到17.141主机上)
git clone https://github.com/kubeedge/kubeedge.git $GOPATH/src/github.com/kubeedge/kubeedge
# 2. 进入目录
cd $GOPATH/src/github.com/kubeedge/kubeedge
# 3. 192.168.17.140节点编辑cloudcore
make all WHAT=cloudcore
# 4. 192.168.17.141节点编译edgecore
make all WHAT=edgecore
# 5. cloudcore编译完成后,复制cloudcore二进制文件
mkdir ~/cloudcore/
cp _output/local/bin/cloudcore ~/cloudcore/

# 6. 创建4个CRD
cd $GOPATH/src/github.com/kubeedge/kubeedge/build/crds/devices

kubectl create -f devices_v1alpha1_devicemodel.yaml
kubectl create -f devices_v1alpha1_device.yaml

cd $GOPATH/src/github.com/kubeedge/kubeedge/build/crds/reliablesyncs

kubectl create -f cluster_objectsync_v1alpha1.yaml
kubectl create -f objectsync_v1alpha1.yaml

# 6. edgecore编译完成后,复制edgecore二进制文件
mkdir ~/edgecore/
cp _output/local/bin/edgecore ~/edgecore/

六、配置并启动cloudcore和edgecore

# 1. 创建配置文件目录(两台主机都需要执行)
sudo mkdir -p /etc/kubeedge/config/
# 2. 修改配置文件目录权限(两台主机都需要执行)
cd /etc
sudo chown -R docker:docker kubeedeg/
# 3. 生成cloud配置文件(17.140主机)
~/cloudcore/cloudcore --defaultconfig > /etc/kubeedge/config/cloudcore.yaml
# 4. 修改cloud配置文件(17.140主机)
vi /etc/kubeedge/config/cloudcore.yaml
kubeAPIConfig.kubeConfig: 修改为/home/docker/.kube/config

# 5. 启动cloudedge(17.140主机)
sudo nohup ./cloudcore > cloudcore.log 2>&1 &

# 6. 查看Secret(17.140主机)
kubectl get secret tokensecret -n kubeedge -oyaml    执行后会有下面的输出:

apiVersion: v1
data:
  tokendata: ODEzNTZjY2MwODIzMmIxMTU0Y2ExYmI5MmRlZjY4YWQwMGQ3ZDcwOTIzYmU3YjcyZWZmOTVlMTdiZTk5MzdkNS5leUpoYkdjaU9pSklVekkxTmlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbGVIQWlPakUxT0RreE5qRTVPRGw5LmpxNENXNk1WNHlUVkpVOWdBUzFqNkRCdE5qeVhQT3gxOHF5RnFfOWQ4WFkK
kind: Secret
metadata:
  creationTimestamp: "2020-05-10T01:53:10Z"
  name: tokensecret
  namespace: kubeedge
  resourceVersion: "19124039"
  selfLink: /api/v1/namespaces/kubeedge/secrets/tokensecret
  uid: 48429ce1-2d5a-4f0e-9ff1-f0f1455a12b4
type: Opaque

首先,在上面的输出中找到tokendata对应的值,即上述的字符串'ODEzNTZjY2MwODIzMmIxMTU0Y2ExYmI5MmRlZjY4YWQwMGQ3ZDcwOTIzYmU3YjcyZWZmOTVlMTdiZTk5MzdkNS5leUpoYkdjaU9pSklVekkxTmlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbGVIQWlPakUxT0RreE5qRTVPRGw5LmpxNENXNk1WNHlUVkpVOWdBUzFqNkRCdE5qeVhQT3gxOHF5RnFfOWQ4WFkK'

然后,在17.140主机上执行下面的命令解码改字符串:
echo ODEzNTZjY2MwODIzMmIxMTU0Y2ExYmI5MmRlZjY4YWQwMGQ3ZDcwOTIzYmU3YjcyZWZmOTVlMTdiZTk5MzdkNS5leUpoYkdjaU9pSklVekkxTmlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbGVIQWlPakUxT0RreE5qRTVPRGw5LmpxNENXNk1WNHlUVkpVOWdBUzFqNkRCdE5qeVhQT3gxOHF5RnFfOWQ4WFkK | base64 -d

最后,可以得到下面的输出,下面的输出需要配置到edgecore的配置文件中:
81356ccc08232b1154ca1bb92def68ad00d7d70923be7b72eff95e17be9937d5.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1ODkxNjE5ODl9.jq4CW6MV4yTVJU9gAS1j6DBtNjyXPOx18qyFq_9d8XY

# 7. 生成edge配置文件(17.141主机)
~/edgecore/edgecore --defaultconfig > /etc/kubeedge/config/edgecore.yaml
# 8. 编辑edge配置文件(17.141主机)
vi /etc/kubeedge/config/edgecore.yaml
modules.edgehub.httpServer: 修改为https://192.168.17.140:10002
modules.edgehub.quic.server: 修改为192.168.17.140:10001
modules.edgehub.websocket.server: 修改为192.168.17.140:10000
modules.edgeHub.token: 修改为上面我们解码后的字符串,直接粘贴字符串即可,不需要带引号

# 9. 运行edgecore(17.141主机)
sudo nohup ./edgecore > edgecore.log 2>&1 &

七、查看节点状态(17.140节点)

# 1. 查看节点
[docker@edge-1 cloudcore]$ kubectl get node 
NAME     STATUS   ROLES        AGE   VERSION
edge-1   Ready    master       29h   v1.17.2
edge-2   Ready    agent,edge   27m   v1.17.1-kubeedge-v1.4.0-beta.0.4+51616fd02c6c07

# 2. 发布测试Deployment
kubectl apply -f $GOPATH/src/github.com/kubeedge/kubeedge/build/deployment.yaml
# 3. 查看Pod状态
[docker@edge-1 build]$ kubectl get po 
NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-55cfcf74d-sn2d5   1/1     Running   0          48s
# 4. 查看Deployment状态
[docker@edge-1 build]$ kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1/1     1            1           2m54s
# 5. 由于这个测试Deployment使用的直接是主机网络,我们可以在浏览器中直接访问:http://192.168.17.141:80,可以看到Nginx的主页

写在最后

1. 配置cloudcore为systemd启动:
      首先,复制cloudcore的启动文件:
      # sudo cp $GOPATH/src/github.com/kubeedge/kubeedge/build/tools/cloudcore.service /usr/lib/systemd/system/
      然后,编辑cloudcore.service文件:
      ExecStart=/home/docker/cloudcore/cloudcore   #修改为cloudcore的二进制文件所在目录
      最后,systemd启动cloudcore
      # sudo systemctl start cloudcore   # 启动
      # sudo systemctl enable cloudcore   # 开机自启动
      # sudo journalctl -ex | grep cloudcore  # 查看日志

2. 可能因为直接clone的源码,所以KubeEdge的版本变成了v1.4.0-beta
3. 第一次发布测试Deployment的时候,Pod处于Pending状态很久,过了一二十分钟之后running,可能是拉镜像时间较长
4. 机器掉电后,ETCD无法成功启动,报错信息为:
      failed to find database snapshot file (snap: snapshot file doesn't exist)
      由于只是测试环境,因此只能清理掉所有的ETCD的备份:
      首先,停掉ETCD,由于ETCD是以Pod形式运行的,我们需要把ETCD的yaml文件移到其他目录下以停止ETCD容器
      # cd /etc/kubernetes/manifests/
      # mv etcd.yaml /home/docker/
      然后,开始清理ETCD的备份
      # cd /var/lib/etcd/member/snap/
      [root@edge-1 snap]# ls
      0000000000000002-000000000003c4ae.snap  0000000000000002-0000000000041bce.snap   0000000000000003-0000000000046d45.snap
      0000000000000002-000000000003f089.snap  0000000000000002-0000000000044634.snap  db
      # rm -rf *
      最后把ETCD的yaml文件移回
      # cd /etc/kubernetes/manifests/
      # mv /home/docker/etcd.yaml .
      移回后ETCD正常启动,而且之前发布的Deployment还在,没有丢失

参考:

【1】安装k8s集群
【2】安装calico插件
【3】获取基础镜像
【4】安装mosquitto
【5】官方文档

你可能感兴趣的:(源码编译安装KubeEdge 1.3.1)