KubeEdge 部署记录(2020.4.13)

需要组件

云端:kubernetes V1.16, kubectl, kubelet, kubeadm, docker, gcc, make, golang, keadm

边端:golang 1.16, docker 19.03, keadmV1.16

PS:Kubeedge安装最重要的是各组件版本必须相互对应,或者采用低版本,很多问题都是因为版本不对造成的

kubernetes 部署(必须)

关闭防火墙和自启动
sudo systemctl stop ufw
sudo systemctl disable ufw
禁用SELinux

编辑文件/etc/selinux/config,将SELINUX修改为disabled,如下:

官网1.3 上说这样能关,但是我的系统上没有这个文件,我就没管它,后面好像也没报错

关闭系统Swap

在 /etc/fstab 中将swap那一行注释掉

sed -i 's/.*swap.*/#&/' /etc/fstab
 sudo swapoff -a

通过free -m 看到swap的确被关闭了

安装docker(docker版本一定要对齐!)

卸载旧版本

sudo apt-get remove docker  docker-engine  docker.io
安装相关软件
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates          
curl gnupg-agent software-properties-common
增加软件源GPG密钥

增加软件源GPG密钥

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add 
添加软件源(unbuntu 是amd、树莓派是arm)
sudo add-apt-repository \
    "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
安装

安装

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

docker换源阿里云
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://fmrhlw3f.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo reboot

cloud节点部署k8s

由于kubeedge是基于kubernetes组件的,所以在云端部署上,kubenertes是必须的;

安装kubeadm、kubeadm、kubectl
sudo apt-get update && sudo apt-get install -y ca-certificates curl software-properties-common apt-transport-https curl
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF 
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
配置内核参数
sudo cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
EOF

sysctl --system
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf

在准备工作全部完成后,就可以在主节点上使用kubeadm init命令,不过这里还要加三个参数,–image-repository指定了阿里云镜像,–pod-network-cidr指明pod网络可以使用的IP地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配CIDRs,–kubernetes-version指明k8s的版本:

kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.18.5

在这里插入图片描述

Q1:这里当时我改动了hostname 结果造成了整个yaml文件都错误了,花了2个小时愣是没弄明白怎么回事,最后用了kubeadm reset,因为他整个配置都是写在yaml文件里的,所以hostname的改动就会影响到配置问题!

Q2:第二个出现的问题是kubectl一直都处在6443端口占用且IP地址不对其的情况,这是因为 kubernetes创建以后,$HOME/.kube 这个文件里的config文件配置不正确,而且会一直影响,哪怕你卸载重装kubectl都没用!

解决办法:

kubeadm join 192.168.14.138:6443 --token scrncy.jyjcdkki0d0n6nun --discovery-token-ca-cert-hash sha256:1d48ef921c67522537b4c9c31dc8281308d7454ad3d8cbbffcbc9e2dabbfd652

配置完成以后一定要执行脚本文件~
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

这样可以主动覆盖之前没改动过的cinfig文件(因为之前kubeadm reset的时候所有配置都变动了)

配置Flannel

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 
查看
kubectl get nodes 
kubectl get pods --all-namespaces

创建POD验证

kubeedge Cloud端部署

安装golang(左栏跳转)

wget https://golang.google.cn/dl/go1.15.6.linux-amd64.tar.gz

tar -zxvf go1.14.4.linux-amd64.tar.gz -C /usr/local 

#配置用户环境
sudo vim /etc/profile
#文件末尾加上
export GOROOT=/usr/local/go
export GOPATH=/data/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
#刷新
source /etc/profile
mkdir -p /data/gopath && cd /data/gopath
mkdir -p src pkg bin

#配置root 环境变量
sudo vim /etc/sudoers
#在secure_path中添加
:/usr/local/go/bin:/data/gopath/bin

#检查go环境
go --version
sudo go --version

安装make,gcc

sudo apt-get install make gcc

如果报错显示

Depends: *** (= 4:9.3.0-1ubuntu2) but 4:10.2.0-1ubuntu1 is to be installed

可以尝试通过 sudo apt purge *** 然后重新安装

如果sudo apt purge ***不被允许,可以尝试将ubuntu换回原来的国外源,重新安装

下载源码

git clone https://gitee.com/ly10208/kubeedge.git $GOPATH/src/github.com/kubeedge/kubeedge

编译keadm
cd $GOPATH/src/github.com/kubeedge/kubeedge
make all WHAT=keadm

#若make报错没有权限可以考虑 在前面加上sudo

创建cloud节点
./_output/local/bin/keadm init

If 无法连接网络可以添加一段:
wget -k --no-check-certificate --progress=bar:force https://raw.githubusercontent.com/kubeedge/kubeedge/master/build/crds/devices/devices_v1alpha1_device.yaml

wget -k --no-check-certificate --progress=bar:force https://raw.githubusercontent.com/kubeedge/kubeedge/master/build/crds/router/router_v1_rule.yaml

wget -k --no-check-certificate --progress=bar:force  https://github.com/kubeedge/kubeedge/releases/download/v1.6.1/kubeedge-v1.6.1-linux-amd64.tar.gz

wget https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.6/build/tools/edgecore.service

然后就可以下载了

在这里插入图片描述

查看cloudcore状态
/var/log/kubeedge/cloudcore.log 查看运行情况

运行正常即可

获取token
./_output/local/bin/keadm gettoken
#输出
13b4a17d7f1d66c50bc5367d03c0faa948aa862f032745f1f50ba6aeacb06907.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MjEzMjc4NzZ9.e7Wcst1k0CrTinv7hO84bN2J3QIOQGz-PdMzvpW0bh0


kubeedge Edge端部署

安装golang(左栏跳转到下面)
下载 https://golang.google.cn/dl/go1.15.6.linux-armd64.tar.gz 并上传到树莓派上,注意树莓派是arm架构的cpu,需要下载arm版本的压缩包
安装 make、gcc

一模一

部署edgecore
下载源码,并编译
同上

创建edge节点
cd $GOPATH/src/github.com/kubeedge/kubeedge

./_output/local/bin/keadm join --cloudcore-ipport="192.168.14.138:10000" --token=13b4a17d7f1d66c50bc5367d03c0faa948aa862f032745f1f50ba6aeacb06907.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MjEzMjc4NzZ9.e7Wcst1k0CrTinv7hO84bN2J3QIOQGz-PdMzvpW0bh0

查看边缘节点运行记录

systemctl status edgecore 查看运行情况

journalctl -u edgecore -n 100 查看日志

journalctl -u edgecore.service -b

在这里插入图片描述

至此edge node节点已经成功加入

其他问题

-IP虚拟机地址漂移问题

背景信息:
在Vmware中安装Ubuntu后(NAT方式),使用期间,IP地址会无规则变化(末位加1或减1),导致Xshell连接总是需要重新配置,为此将IP配置为固定IP,使该问题得到解决。

windows

1.ipconfig

在这里插入图片描述

记住自己的gateway地址,很重要

2.windows 的网络连接,选择

在这里插入图片描述

  1. 【属性】-【IPv4】-【使用下面的IP地址】
    在这里插入图片描述

VMware workstation Pro

4.【编辑】-【虚拟网络编辑器】
在这里插入图片描述

5.【DHCP设置】

在这里插入图片描述

IP范围192.168.63.128-192.168.63.254

6.【NAT设置】

在这里插入图片描述

【DNS设置】

在这里插入图片描述

7.终端

sudo vi /etc/network/interfaces
auto ens33

iface ens33 inet static 

address 192.168.14.138

netmask 255.255.255.0

gateway	192.168.14.2

dns-nameserver 114.114.114.114   202.96.128.143
 sudo vi /etc/resolv.conf
nameserver 114.114.114.114

nameserver 202.96.128.143

IP范围192.168.63.128-192.168.63.254;网关为上图中的;nameserver为上图中的

/etc/init.d/networking restart

8.ping www.baidu.com

–IP方案2

ubuntu 20.04 设置静态ip方法
2. 确认你要修改的网卡号

先确认你要修改的网卡号,假设你的服务器有多张网卡:

ubuntu2004:~$ ip addr

我的服务器配置如下:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN ``group` `default` `qlen 1000``link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00``inet 127.0.0.1/8 scope host lo``valid_lft forever preferred_lft forever``inet6 ::1/128 scope host``valid_lft forever preferred_lft forever``2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP ``group` `default` `qlen 1000``link/ether 00:0c:29:f1:b5:e1 brd ff:ff:ff:ff:ff:ff``inet 172.16.87.140/24 brd 172.16.87.255 scope global dynamic ens33``valid_lft 1500sec preferred_lft 1500sec``inet6 fe80::20c:29ff:fef1:b5e1/64 scope link``valid_lft forever preferred_lft forever

img

3. 默认的网卡配置文件

默认情况下,网络使用DHCP

ubuntu1804:~$ cat /etc/netplan/50-cloud-init.yaml``配置文件内容如下` `network:``  ``ethernets:``    ``ens33:``      ``dhcp4: yes``      ``addresses: []` `  ``version: 2


4. ubuntu20.04设置静态IP

需要把配置文件修改为以下内容:

ubuntu1804:~$ sudo vi /etc/netplan/50-cloud-init.yaml

假设IP地址修改为192.168.1.100,子网掩码24位即255.255.255.0,网关设置为192.168.1.1,DNS1:223.5.5.5,DNS2:223.6.6.6

network:``  ``ethernets:``    ``ens33:``      ``dhcp4: no``      ``addresses: [192.168.1.100/24]``      ``optional: ``true``      ``gateway4: 192.168.1.1``      ``nameservers:``          ``addresses: [223.5.5.5,223.6.6.6]` `  ``version: 2

ubuntu20.04配置静态ip

5. 应用新配置
ubuntu1804:~$ sudo netplan apply

使用ip addr检查新地址

ubuntu2004:~$ ip addr

ubuntu20.04设置静态ip

6. 测试网络连通性
ubuntu1804:~$ ping 192.168.1.100

ubuntu20.04配置静态ip

-Golang 安装

安装

首先,可以直接用命令行来安装最新版本的go:

apt install golang

apt-get install golang-go这样安装版本可能过低。
go version查看版本为 1.6.2
apt-get 卸载此版本重新安装

重新安装
    1. 去官网查看最新版链接 https://studygolang.com/dl
      比如我要下的是 https://studygolang.com/dl/golang/go1.11.linux-amd64.tar.gz
    1. 下载
      wget https://studygolang.com/dl/golang/go1.16.3.linux-amd64.tar.gz
    1. 解压缩
      tar -zxvf go1.11.linux-amd64.tar.gz -C /usr/lib
    1. 设置添加环境变量
      vi /etc/profile 在最后面添加如下配置
export GOPATH=/opt/gopath
export GOROOT=/usr/lib/go
export GOARCH=386
export GOOS=linux
export GOTOOLS=$GOROOT/pkg/tool
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
    1. 执行
      source /etc/profile
    1. 查看版本
      go version
      结果 go version go1.11 linux/amd64

测试

配置完后,测试能够正常编译go文件,首先创建helloworld包和对应go源文件:

$ mkdir -p go/src/helloworld
$ cd go/src/helloworld
$ touch helloworld.go

向源文件写入代码:

package main
import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}

之后开始编译:

$ cd $HOME/go/src/helloworld
$ go build

此时可能会出现权限报错can’t load package:…permission denied
需要为目录添加权限:

chmod 755 -R $HOME/go

编译通过后会生成对应可执行文件

$ cd $HOME/go/src/helloworld
$ go build
$ ls
helloworld  helloworld.go
$ ./helloworld
hello, world

编译通过能够正常打印。

-安装指定docker版本

卸载docker旧版本

$ sudo apt-get remove docker docker-engine docker-ce docker.io
$ sudo apt-get update

安装包以使得apt可以通过HTTP使用存储库

田间Docker官方的GPC密钥

$ sudo apt-get install -y apt-transport-

使用下面的命令来设置stable存储库:

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"https ca-certificates curl software-properties-common

再更新一下apt包索引:
$ sudo apt-get update

安装最新版本的Docker CE:

$ sudo apt-get install -y docker-ce

在生产系统上,可能会需要应该安装一个特定版本的Docker CE,而不是总是使用最新版本:
列出可用的版本:

$ apt-cache madison docker-ce

在这里插入图片描述

选择要安装的特定版本,第二列是版本字符串,第三列是存储库名称,它指示包来自哪个存储库,以及扩展它的稳定性级别。要安装一个特定的版本,将版本字符串附加到包名中,并通过等号(=)分隔它们:

$ sudo apt-get install docker-ce=<VERSION>
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get install docker-ce=18.03.1~ce-0~ubuntu
验证docker

若未启动,则启动docker服务:

$ sudo systemctl start docker

经典的hello world:

$ sudo docker run hello-world

5、docker命令使用

1 docker查看信息#docker info

2 docker查看镜像# docker images

3 docker 列出run的容器:#docker ps -a

4 pull docker镜像:#docker pull xxxxx

5 运行docker 容器
    docker run xxxxx 
    docker run -p 8080:80 --name 自定义名称 -it 镜像名称  /bin/bash

6 退出docker 容器但不停止运行:Ctrl+P+Q

7 停止docker 容器运行:#docker stop CONTAINERID

8 删除docker 容器#docker rm CONTAINERID

9 删除docker镜像:#docker rmi imageID

10 启动docker容器:#docker start CONTAINERID

-ubuntu下修改IP地址

1、打开文件

sudo vim /etc/network/interfaces 

注释auto lo和iface lo inet loopback两段代码添加以下代码

auto ens33
iface ens33 inet static
address 192.168.1.244   #ip地址
netmask 255.255.255.0  #子网掩码
gateway 192.168.1.1    #网关
dns-nameserver 114.114.114.114   #dns服务器
:wq保存退出

2、重启网络:sudo /etc/init.d/networking restart

-显示当前主机名(hostname)

要查看当前主机名(hostname),请在hostnamectl不使用任何参数的情况下调用命令:

hostnamectl

如何在Ubuntu 20.04上更改主机名(hostname)

在此示例中,当前主机名(hostname)设置为ubuntu2004.localdomain

更改系统主机名(hostname)

更改系统主机名(hostname)是一个简单的过程。语法如下:

sudo hostnamectl set-hostname host.example.com
sudo hostnamectl set-hostname "Your Pretty HostName" --pretty
sudo hostnamectl set-hostname host.example.com --static
sudo hostnamectl set-hostname host.example.com --transient

例如,要将系统静态主机名(hostname)更改为www.iplayio.cn,可以使用以下命令:

sudo hostnamectl set-hostname www.iplayio.cn

您也可以选择设置漂亮的主机名(hostname):

sudo hostnamectl set-hostname "IPlayIO's laptop" --pretty

hostnamectl不产生输出。成功时,返回0,否则返回非零失败代码。

静态主机名(hostname)存储在中/etc/hostname,漂亮主机名(hostname)存储在/etc/machine-infofile中。

您不应该在同一网络中的两台不同计算机上使用相同的主机名(hostname)。

在大多数系统上,主机名(hostname)映射到127.0.0.1/etc/hosts。打开文件,将旧的主机名(hostname)更改为新的主机名(hostname)。

127.0.0.1   localhost
127.0.0.1   www.iplayio.cn

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

如果在云实例上运行Ubuntu,并且cloud-init已安装软件包,则还需要编辑该/etc/cloud/cloud.cfg文件。通常,该软件包通常默认安装在云提供商提供的映像中,并且用于处理云实例的初始化。

如果系统上存在该文件,请打开它:

sudo nano /etc/cloud/cloud.cfg

搜索preserve_hostname,并将值从更改falsetrue

# This will cause the set+update hostname module to not operate (if true)
preserve_hostname: true

保存文件并关闭编辑器。

-验证更改

要验证主机名(hostname)是否已完全更改,请输入以下hostnamectl命令:

hostnamectl

您的新主机名(hostname)将显示在终端上:

   Static hostname: www.iplayio.cn
   Pretty hostname: IPlayIO's desktop
         Icon name: computer-vm
           Chassis: vm
        Machine ID: a04e3543f3da460294926b7c41e87a0d
           Boot ID: aa31b274703440dfb622ef2bd84c52cb
    Virtualization: oracle
  Operating System: Ubuntu 20.04 LTS
            Kernel: Linux 5.4.0-26-generic
      Architecture: x86-64
结论

我们已向您展示了如何在Ubuntu 20.04安装上轻松更改主机名(hostname)而不重启机器。

有多种原因可能导致您需要更改主机名(hostname)。最常见的是在创建实例后自动设置主机名(hostname)的情况

-解决get不到集群的方法

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

-过期tokkent重新获得指令

当你的token忘了或者过期,解决办法如下:

1.先获取token

#如果过期可先执行此命令
kubeadm token create    #重新生成token
#列出token
kubeadm token list  | awk -F" " '{print $1}' |tail -n 1

2.获取CA公钥的哈希值

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed  's/^ .* //'

3.从节点加入集群

kubeadm join 192.168.40.8:6443 --token token填这里   --discovery-token-ca-cert-hash sha256:哈希值填这里

-向Kubernetes集群添加/移除Node

  1. Minion Node操作前准备

    #关闭防火墙
    systemctl stop firewalld
    #禁止防火墙开机启动
    systemctl disable firewalld
    #检查selinux
    getenforce
    Disabled
    #端口检查
    #关闭防火墙
    systemctl disable firewalld
    systemctl stop firewalld
    systemctl status firewalld
    
  2. Kubernetes集群中添加Node

    在kubeadm init初始化操作完成时,系统最后给出了将节点加入集群的命令:

    kubeadm join 10.0.0.39:6443 --token 4g0p8w.w5p29ukwvitim2ti 
    --discovery-token-ca-cert-hash sha256:21d0adbfcb409dca97e655641573b2ee51c
    77a212f194e20a307cb459e5f77c8
    

    说明:这条命令一定保存好,因为后期没法重现的!!
    在swarm1(Minion Node)上操作:

    kubeadm join 10.0.0.39:6443 --token 4g0p8w.w5p29ukwvitim2ti 
    --discovery-token-ca-cert-hash sha256:21d0adbfcb409dca97e655641573b2ee51c
    77a212f194e20a307cb459e5f77c8
    

    在swarm2(Master)上操作:

    kubectl get nodes
    NAME      STATUS    ROLES     AGE       VERSION
    swarm1    Ready     <none>    3h        v1.10.0
    swarm2    Ready     master    3h        v1.10.0
    

    swarm1加入集群很是顺利!

  3. Kubernetes集群中移除Node

    在master节点上执行:

    kubectl drain edge1 --delete-local-data --force --ignore-daemonsets
    kubectl delete node edge1
    

    在node2上执行:

    kubeadm reset
    
  4. 添加Node出现的问题
    #Minion Node一直处于notReady状态,如:

    kubectl get nodes
    NAME      STATUS     ROLES     AGE       VERSION
    swarm1    NotReady   <none>    3h        v1.10.0
    swarm2    Ready      master    3h        v1.10.0
    

    #原因
    (1)启动kubelet的时候,会pull以下两个镜像(gcr.io/**),因为天朝网络一般翻不了墙,不能成功pull,所以要自己找到这两个docker镜像。点击images自行下载使用!

    k8s.gcr.io/kube-proxy-amd64   v1.10.0             6e6237849607        3 weeks ago         97.1 MB
    k8s.gcr.io/pause-amd64        3.1                 da86e6ba6ca1        4 months ago        742 kB
    

    (2)使用Kubeadm工具搭建的Kubernetes集群,已经默认集成了安全策略,所以要将Master Node节点/etc/kubernetes/pki下的所有文件复制到Minion Node相同目录下一份。所以在Master Node上执行:

    scp /etc/kubernetes/pki/* root@{minion-ip}:/etc/kubernetes/pki
    
Logo

开源、云原生的融合云平台

更多推荐