前言:本文包含了docker和k8s的安装过程,适用于新接触这部分的同学安装,同时也实现了kubeedge1.3的新版本特性,kubectl logs 边缘节点pod。第一次写博客,可能会有纰漏之处,欢迎大家指正,同时也欢迎大家留言交流!
-------------------------------------------------------2020.8.7更新-----------------------------------------
不知什么缘故,kubeedge1.3.*按照原来的安装步骤会报错,在启动cloudcore和edgecore的时候会报错证书不存在,需要把cloudcore.yaml中modules. cloudStream和edgecore.yaml中modules. edgeStream改成false。这样做唯一的影响是云端无法查看边缘端pod的日志。此外,注意到kubeedge社区发布了1.4.0-beta版本,可能近期1.4正式版本就要正式发布了,期待有一些支持logs更好的解决办法。看到官网的趋势是用keadm来部署kubeedge,后期争取出个教程。
-------------------------------------------------------------------end------------------------------------------
本文参考了如下内容:
https://blog.csdn.net/subfate/article/details/106463852
https://docs.kubeedge.io/en/latest/configuration/kubeedge.html
安装说明:
安装方式:源码编译
操作系统:ubuntu16.04 系统架构:amd64(X86架构)
云节点:192.168.17.50 处理器内核总数4 4G内存 40G硬盘
边缘节点:192.168.17.60 处理器内核总数4 4G内存 40G硬盘
版本说明:
Docker版本:docker-ce19.03
K8S版本:kubernetes v1.17.5
GO版本:go1.12.5
注:本文全程使用root权限,若使用普通用户权限,有些命令可能没有运行权限,需在前面加上sudo,若已切换至root权限,命令前sudo可省略。另,本文中涉及到具体的文件、节点名称、IP时,请依据自身情况进行替换。
# 切换至root权限
sudo -s
一、kubeedge版本依赖
1. k8s版本依赖
需要注意的是,k8s和docker版本之间也有对应关系,具体对应关系请查看k8s更新日志中的说明:
https://github.com/kubernetes/kubernetes/blob/release-1.17/CHANGELOG/CHANGELOG-1.17.md
2. go版本依赖
二、ubuntu设置(在云端和边缘端都设置)
1. 固定IP(desktop版)
点击设置→网络→有线→选项→IPv4设置→方法选择手动→设置(设置参考图1)后保存,重启网卡(点击图2标注处可进行重启),使用ifconfig命令查看IP是否更改(如图3所示)。
图1
图2
图3
2. 关闭防火墙
sudo ufw disable
防火墙在系统启动时自动禁用
// 查看防火墙状态
sudo ufw status
状态:不活动
3. 关闭交换分区
//临时关闭
sudo swapoff -a
// 永久关闭
sudo sed -i 's/.*swap.*/#&/' /etc/fstab
4. 修改主机名(可选)
// 各个节点的主机名不要相同,若两个节点的主机名不同则无需修改,注意主机名命名规范:
// 主机名字允许包括:大小写字母、数字、连字符,但是不能包含下划线、不能以数字开头。
hostnamectl set-hostname edgenode
// 同时在/etc/host中将原来主机名替换,否则用sudo命令时会报错
vim /etc/hosts
// 修改保存后重启或者重新登陆即可,查看主机名
hostname
三、先决条件
下载并安装搭建kubeedge所需要的前提条件。
1. 云侧
1.1 安装goland(以go1.12.5为例)
// 下载安装包
sudo wget https://dl.google.com/go/go1.12.5.linux-amd64.tar.gz
// 解压到/usr/local/文件下
sudo tar zxvf go1.12.5.linux-amd64.tar.gz -C /usr/local/
// 将go添加至环境变量
sudo cp /usr/local/go/bin/go /usr/local/bin/go
// 查看go是否安装成功
go version
go version go1.12.5 linux/amd64
1.2 安装docker (以docker-ce19.03为例)
// step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
// step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
// Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
// Step 4: 更新并安装Docker-CE
sudo apt-get -y update
apt-get -y install docker-ce=5:19.03.2~3-0~ubuntu-xenial
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]
1.3 安装kubernetes(以kubernetes v1.17.5为例)
// 下载必要工具
apt-get update && apt-get install -y apt-transport-https
// 安装证书
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
// 添加源信息
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
// 更新源
apt-get update
// 下载并安装kubernetes
apt-get install "kubeadm=1.17.5*" "kubelet=1.17.5*" "kubectl=1.17.5*"
1.4 创建kubernetes集群
// 查看当前版本kubernetes所需要的镜像
kubeadm config images list
// 或者查看指定版本的kubernetes镜像
kubeadm config images list --kubernetes-version=v1.17.5
k8s.gcr.io/kube-apiserver:v1.17.5
k8s.gcr.io/kube-controller-manager:v1.17.5
k8s.gcr.io/kube-scheduler:v1.17.5
k8s.gcr.io/kube-proxy:v1.17.5
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.2
// 镜像拉取脚本
// 首先创建一个.sh文件,并添加可执行权限
sudo touch pull.sh
sudo chmod 755 pull.sh
// 将以下内容放入该文件中,根据当前k8s版本需要的镜像修改pull.sh文件中对应的镜像版本
#!/bin/bash
KUBE_VERSION=v1.17.5
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.2.24
DNS_VERSION=1.2.2
username=registry.cn-hangzhou.aliyuncs.com/google_containers
images=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${DNS_VERSION}
)
for image in ${images[@]}
do
docker pull ${username}/${image}
docker tag ${username}/${image} k8s.gcr.io/${image}
#docker tag ${username}/${image} gcr.io/google_containers/${image}
docker rmi ${username}/${image}
done
// 执行脚本
sudo ./pull.sh
// 初始化集群
sudo kubeadm init --kubernetes-version=v1.17.5 --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
// 为了允许在master上运行pod,取消污点
kubectl taint nodes --all node-role.kubernetes.io/master-
node “test-01” untainted
或
taint “node-role.kubernetes.io/master:” not found
// 查看节点的tanit,注意替换节点名称
kubectl describe nodes 节点名称 |grep -E '(Roles|Taints)'
Roles: master
Taints: node.kubernetes.io/not-ready:NoSchedule
或
Roles: master
Taints:
// 添加pod网络插件
--------------------------以下内容是可选内容,可不执行---------------------------------
注: 在kubeedge1.3版本安装成功后,会在边缘节点也安装网络插件,但是由于edgecore没有注入APIserver环境变量,pod状态会变成Init:error,手动在calico.yaml文件中注入环境变量后解决此问题。边缘节点网络插件状态异常不会影响kubectl logs边缘节点pod,可跳过此步
wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml
vim calico.yaml
// 在每个镜像的环境变量中添加如下内容,注意替换自己的cloudcoreIP
- name: KUBERNETES_SERVICE_HOST
value: "192.168.17.50"
- name: KUBERNETES_SERVICE_PORT
value: "6443"
- name: KUBERNETES_SERVICE_PORT_HTTPS
value: "6443"
- name: KUBERNETES_NODE_NAME
// 4个镜像一共5处,镜像命名分别为:upgrade-ipam、install-cni、flexvol-driver、calico-node、calico-kube-controllers,第三处没有环境变量,我们手动添加即可,如下所示
- name: flexvol-driver
image: calico/pod2daemon-flexvol:v3.14.1
env:
- name: KUBERNETES_SERVICE_HOST
value: "192.168.17.50"
- name: KUBERNETES_SERVICE_PORT
value: "6443"
- name: KUBERNETES_SERVICE_PORT_HTTPS
value: "6443"
// 修改后保存退出,并运行修改过的calico.yaml
kubectl apply -f calico.yaml
----------------------------------------可选内容结束-------------------------------------------
// 若选择不修改calico.yaml,则运行
kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
// 查看pod运行状态
kubectl get pod --all-namespaces
// 查看节点状态
kubectl get node
2. 边缘侧
2.1 安装goland
同上述云侧安装步骤1.1
2.2 安装docker
同上述云侧安装步骤1.2
2.3 安装mosquitto
// 添加源
sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
// 更新软件
sudo apt-get update
// 下载并安装
sudo apt-get install mosquitto
四、安装kubeedge
// 在云端和边缘端都下载git工具
sudo apt-get install git
// 在云端和边缘端设置环境变量
// 首先编辑文件~/.bashrc
vim ~/.bashrc
// 其次在文件最后添加
export GOPATH=$HOME/go
// 最后使更改生效
source ~/.bashrc
// 在云端和边缘端都下载kubeedge源码
git clone https://github.com/kubeedge/kubeedge.git $GOPATH/src/github.com/kubeedge/kubeedge
1. 设置kubeedge
此部分主要为生成证书以及编译cloudcore、edgecore
1.1 设置云节点
// 如果之前安装过kubeedge,首先清理证书/etc/kubeedge/ca和/etc/kubeedge/certs,然后删除secret
rm -rf /etc/kubeedge/ca
rm -rf /etc/kubeedge/certs
kubectl delete secret casecret -nkubeedge
kubectl delete secret cloudcoresecret -nkubeedge
// 生成支持kubectl logs命令的证书
// 首先,在/etc/kubernetes/pki/目录中确保有kubernetes的ca.crt和ca.key文件
// 其次,设置CLOUDCOREIPS环境变量,设置环境变量以指定所有cloudcore的IP地址,可以设置设置多个IP地址,中间用空格隔开即可
export CLOUDCOREIPS="192.168.17.50"
// 第三,生成证书
mkdir -p /etc/kubeedge/ca
mkdir -p /etc/kubeedge/certs
$GOPATH/src/github.com/kubeedge/kubeedge/build/tools/certgen.sh stream
// 第四,设置NAT端口转发
iptables -t nat -A OUTPUT -p tcp --dport 10350 -j DNAT --to 192.168.17.50:10003
// 编译cloudcore
// 先检测gcc是否已安装,若未安装则自行安装
gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// 编译cloudcore
cd $GOPATH/src/github.com/kubeedge/kubeedge/
make all WHAT=cloudcore
注:编译可能需要科学上网,可直接下载kubeedge-v1.3.0-linux-amd64.tar.gz,里面包含cloudcore
编译edgecore时也相同,下面不再说明
# kubeedge-v1.3.0-linux-amd64.tar.gz下载地址:
wget https://github.com/kubeedge/kubeedge/releases/download/v1.3.0/kubeedge-v1.3.0-linux-amd64.tar.gz
// 创建设备模块和设备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
// 创建用于可靠消息传递的ClusterObjectSync和ObjectSync CRD
cd $GOPATH/src/github.com/kubeedge/kubeedge/build/crds/reliablesyncs
kubectl create -f cluster_objectsync_v1alpha1.yaml
kubectl create -f objectsync_v1alpha1.yaml
// 复制Coudcore二进制文件
mkdir ~/kubeedge/
cp $GOPATH/src/github.com/kubeedge/kubeedge/_output/local/bin/cloudcore ~/kubeedge/
1.2 设置边缘节点
// 如果边缘节点之前安装过kubeedge,删除其证书
rm -rf /etc/kubeedge/ca
rm -rf /etc/kubeedge/certs
// 先检测gcc是否已安装,若未安装则自行安装
gcc –version
// 编译edgecore
cd $GOPATH/src/github.com/kubeedge/kubeedge
make all WHAT=edgecore
// 复制Edgecore二进制文件
mkdir ~/kubeedge/
cp $GOPATH/src/github.com/kubeedge/kubeedge/_output/local/bin/edgecore ~/kubeedge/
2. 配置kubeedge
此部分主要修改配置文件cloudcore.yaml和edgecore.yaml
2.1 配置云节点
// 创建/etc/kubeedge/config文件夹
mkdir -p /etc/kubeedge/config/
// 生成完整配置
~/kubeedge/cloudcore --defaultconfig > /etc/kubeedge/config/cloudcore.yaml
// 修改配置文件
vim /etc/kubeedge/config/cloudcore.yaml
// 首先,更正kubernetes配置文件路径,确定其路径是/root/.kube/config还是
/home/lz/.kube/config,并且在kubeConfig:所在行进行修改。本文将其修改为/home/lz/.kube/config
// 其次,设置advertiseAddress为cloucore IP
modules:
cloudHub:
advertiseAddress:
- 192.168.17.50
// 最后,设置支持kubectl logs边缘节点pod,修改modules. cloudStream. enable为true(若启动cloudcore报错rootCA.server等证书不存在,需将此处改成false)
modules:
cloudStream:
enable: true
2.2 配置边缘节点
// 创建/etc/kubeedge/config文件夹
mkdir -p /etc/kubeedge/config/
// 生成完整配置文件
~/kubeedge/edgecore --defaultconfig > /etc/kubeedge/config/edgecore.yaml
// 修改配置文件
vim /etc/kubeedge/config/edgecore.yaml
// 首先,将申请证书地址modules.edgehub.httpServer修改为cloudcore的IP地址和端口
modules:
edgeHub:
httpServer: https://192.168.17.50:10002
// 其次,修改modules.edgehub.websocket.server的地址为cloudcore的ip地址和端口
modules:
edgeHub:
websocket:
server: 192.168.17.50:10000
// 第三,修改modules.edgehub.quic.server的地址为cloudcore的ip地址和端口
modules:
edgeHub:
quic:
server: 192.168.17.50:10001
// 第四,设置支持kubectl logs边缘节点pod,修改modules. edgeStream
// (1)将enable由false改为true(若启动edgecore报错证书无法获取,需将此处改成false)
modules:
edgeStream:
enable: true
// (2)将server改为cloucoreIP:10004
modules:
edgeStream:
server: 192.168.17.50:10004
// 第五,使用命令ifconfig查看网卡名称,并在moudules.edged. interfaceName处修改,我的网卡名为ens33,如本文开始处的图2所示
modules:
edged:
interfaceName: ens33
// 第六,修改(确认)podSandboxImage,X86平台为podSandboxImage: kubeedge/pause:3.1(默认),ARM 平台根据位数不同,可设为kubeedge/pause-arm:3.1或kubeedge/pause-arm64:3.1
// 最后,配置令牌
// (1)在云侧运行cloudcore
~/kubeedge/cloudcore
// (2)在云侧获取secret
kubectl get secret tokensecret -n kubeedge -oyaml
apiVersion: v1
data:
tokendata: NzZkMjYzMjI4MTRhNzMxMTU3ZmE0ZjMwYTE2NGE2MTMzMzFmMDA4ZDhiYTgyZTU3ZDI2ZDk4ZGVmNzFhMGJjMy5leUpoYkdjaU9pSklVekkxTmlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbGVIQWlPakUxT1RFMk9ETXhOVGQ5LmpXaHpld1BybHJCZ0xBVFZrdUZsX0UtSl9hakdiNU1Va09pOVUxTXlFWGs=
kind: Secret
metadata:
creationTimestamp: "2020-06-08T06:12:37Z"
name: tokensecret
namespace: kubeedge
resourceVersion: "78415"
selfLink: /api/v1/namespaces/kubeedge/secrets/tokensecret
uid: 9731a7f5-ec1f-4ac4-85c5-d7c1e499732f
type: Opaque
// (3)在云侧通过base64解码tokendata字段
echo NzZkMjYzMjI4MTRhNzMxMTU3ZmE0ZjMwYTE2NGE2MTMzMzFmMDA4ZDhiYTgyZTU3ZDI2ZDk4ZGVmNzFhMGJjMy5leUpoYkdjaU9pSklVekkxTmlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbGVIQWlPakUxT1RFMk9ETXhOVGQ5LmpXaHpld1BybHJCZ0xBVFZrdUZsX0UtSl9hakdiNU1Va09pOVUxTXlFWGs= |base64 -d
76d26322814a731157fa4f30a164a613331f008d8ba82e57d26d98def71a0bc3.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTE2ODMxNTd9.jWhzewPrlrBgLATVkuFl_E-J_ajGb5MUkOi9U1MyEXk
// (4)将解码后的字符串复制到边缘侧edgecore.yaml中的modules.edgeHub.token字段,如下图所示
3. 运行
为了方便查看运行日志,我选择直接运行,若需要其他的运行方式,请参考文首参考内容的第一个网址
// 运行cloudcore
~/kubeedge/cloudcore
// 运行edgecore
~/kubeedge/edgecore
// 验证是否安装成功,在云节点查看当前集群中有哪些节点
kubectl get node
NAME STATUS ROLES AGE VERSION
edgenode Ready agent,edge 46s v1.17.1-kubeedge-v1.4.0-alpha.0.21+0be95b853ab879
kubeedge Ready master 17h v1.17.5
至此,kubeedge安装成功!
五、测试kubectl logs
kubectl apply -f $GOPATH/src/github.com/kubeedge/kubeedge/build/deployment.yaml
// 查看pod状态
kubectl get pod --all-namespaces -owide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE
default nginx-deployment-77698bff7d-wb8pt 1/1 Running 0 8h 172.17.0.3 edgenode
kube-system calico-kube-controllers-5ddf645df5-c87jj 1/1 Running 1 39h 10.217.20.68 kubeedge
kube-system calico-node-kftsm 1/1 Running 1 39h 192.168.17.60 edgenode
kube-system calico-node-vbttt 1/1 Running 1 39h 192.168.17.50 kubeedge
kube-system coredns-5644d7b6d9-jvhd2 1/1 Running 7 10d 10.217.20.66 kubeedge
kube-system coredns-5644d7b6d9-snrd4 1/1 Running 7 10d 10.217.20.67 kubeedge
kube-system etcd-kubeedge 1/1 Running 4 10d 192.168.17.50 kubeedge
kube-system kube-apiserver-kubeedge 1/1 Running 6 10d 192.168.17.50 kubeedge
kube-system kube-controller-manager-kubeedge 1/1 Running 9 10d 192.168.17.50 kubeedge
kube-system kube-proxy-gbt7p 1/1 Running 4 10d 192.168.17.50 kubeedge
kube-system kube-scheduler-kubeedge 1/1 Running 9 10d 192.168.17.50 kubeedge
// 查看边缘节点pod上的日志
kubectl logs nginx-deployment-77698bff7d-wb8pt
// 注:若安装且运行成功后无法logs边缘pod,可再执行一次输出端口重定向命令后尝试
iptables -t nat -A OUTPUT -p tcp --dport 10350 -j DNAT --to cloudcoreIP:10003