在边缘计算云原生领域,Rancher开源的k3s侧重于在边缘运行完整的k8s集群,而华为开源的kubeedge则是在边缘运行可以脱机的k8s节点。刚好手上有aliyun和腾讯云上各一台配置比较差的虚拟机,平时用来跑下基本的k8s服务,做个调试验证用的,一跑应用就卡死,内存严重不足。这场景似乎与边缘计算资源局限的窘境很类似;于是,大胆的想像在其中一台机器上跑k3s,同时用其作为kubeedge的k8s server侧;在另外一台上跑kubeedge的edge节点,组成一个集群。
K3S
k3s就不介绍了,具体可以参考其首页; 另外,这里是项目的Readme信息。可以关注一下其架构图,图上将server和agent分开,我们今天部署的方式是将server和仅有的一个agent部署到同一个服务器上。
Linux如何翻墙
为啥突然讲到linux翻墙?是因为这几天我发现在阿里和腾讯云的服务器上下载github的资源特别慢,几次通过脚本安装k3s都提示超时,实在是崩溃了!于是在linux上设置了ss client,然后速度飕飕的….
我是使用shadowsocks,这里默认你已经有墙外的shadowsocks服务器。主要告诉你如何在linux上配置ss的client,解决下载镜像以及一些限制资源较慢的问题。
1 | # 安装ss |
快速安装
1 | # 自动安装(有时候墙内特别慢,会timeout,建议先翻墙) |
k3s参数科普
- 指定启动参数
1 | k3s server --disable-agent |
- 指定k8s参数
1 | # Adding extra argument can be done by passing the following flags to server or agent: |
kubeedge场景配置
通过上面的参数配置介绍,结合kubeedge的需求,以及我的机器的配置有限,裁减掉一些没用的服务,最终的启动文件如下:
1 | # cat /etc/systemd/system/k3s.service |
记得修改之后需要执行systemctl daemon-reload
来生效。
pause镜像问题
由于k3s默认是使用containerd,而非docker的;而且containerd的sock文件与docker的containerd的sock文件不一样,所以通过docker拉取pause镜像的方式行不通(我在上一步的启动参数中指定了使用docker,如果你要想尝试继续使用containerd,就会遇到该问题)。这里需要这样操作:
1 | # 先在安装了docker的机器上拉取镜像 |
kubeedge
kubedege是华为开源的一个边缘计算的项目,下面是其架构图(后续再慢慢分析,今天只讲部署)。
首先需要将kubeedge项目拉取到本地,因为需要在该项目上构建镜像。
1 | $ mkdir -p $GOPATH/src/github.com/kubeedge |
完了之后,建议直接checkout到v1.0.0上来,其他版本之前有做过一些测试,发现不少问题。本文主要基于v1.0.0来操作。
cloud端
cloud端直接部署到k3s之上,主要是controller服务。
构建镜像
如果使用的不是v1.0.0版本,或者希望自己构建,可以执行以下操作。1
2$ cd $GOPATH/src/github.com/kubeedge/kubeedge
$ make cloudimage
如果只是希望部署,可以使用我已经构建好的镜像 ljchen/kubeedge_edgecontroller:v1.0.0
准备yaml
生成证书信息到secret中。
1 | $ cd build/cloud; ls |
另外更改deployment的yaml镜像名称为ljchen/kubeedge_edgecontroller:v1.0.0
,或者你自己构建的镜像。
最后就是执行yaml文件来部署cloud。1
$ for resource in $(ls *.yaml); do kubectl create -f $resource; done
问题诊断
查看kubeedge命名空间下的deployment/edgecontroller的日志,会发现很多报错;这里涉及到两个地方需要做修改。
报证书错误,当前证书无法用在kubernetes.default.svc.cluster.local
需要手动修改configmap/edgecontroller,删除服务后面的cluster.local1
2
3
4
5
6
7
8
9
10
11
12
13
14apiVersion: v1
items:
- apiVersion: v1
data:
controller.yaml: |
controller:
kube:
master: https://kubernetes.default.svc:443 # 这里
kubeconfig: /etc/kubeedge/cloud/kubeconfig.yaml
namespace: ""
content_type: "application/vnd.kubernetes.protobuf"
qps: 5
burst: 10
node_update_frequency: 10发现controller报没有权限操作services和endpoints,需要在对应的role中添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
creationTimestamp: "2019-07-12T07:11:27Z"
labels:
k8s-app: kubeedge
kubeedge: edgecontroller
name: edgecontroller
resourceVersion: "4847"
selfLink: /apis/rbac.authorization.k8s.io/v1/clusterroles/edgecontroller
uid: 43c656b8-a474-11e9-b3d9-00163e149cf2
rules:
- apiGroups:
- ""
resources:
- nodes
- nodes/status
- configmaps
- pods
- pods/status
- secrets
- services # 这里services
- endpoints # 这里endpoints
verbs:
- get
- list
- watch
- update
- apiGroups:
- ""
resources:
- pods
verbs:
- deleteedgecontroller服务无法被edge访问
由于edgecontroller是clusterIP类型,无法被集群外的edge访问到,这里可以直接在部署前或者部署之后手动修改service的类型为nodePort类型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16apiVersion: v1
kind: Service
metadata:
name: edgecontroller
namespace: kubeedge
labels:
k8s-app: kubeedge
kubeedge: edgecontroller
spec:
type: NodePort
ports:
- port: 10000
name: cloudhub
selector:
k8s-app: kubeedge
kubeedge: edgecontroller
edge端
edge端通过与edgecontroller通信来上报上报状态,以及获取k8s配置并执行。这里主要讲述通过脚本部署的方式,具体部署流程如下。官方文档见这里。
准备镜像
首先是镜像准备,如果你希望自己构建镜像,请执行以下脚本。如果不想再构建,可以直接使用我构建好的镜像: ljchen/kubeedge_edgecore:v1.0.0
1 | # 检查环境是否ready |
拷贝证书信息
您需要去拷贝edge certs文件包括edge.crt和edge.key到您想要部署edge part的k8s节点上的/etc/kubeedge/certs/文件夹中。这里我是直接将cloud端主机上的/etc/kubeedge/目录打包并scp到edge端主机上解压的。
cloudhub信息
由于edge端是通过cloudhub来访问k8s api-server的,edge端的edgehub会与cloudhub进行websocket通信,需要确保该目标服务器端口可以被访问。该端口的查看方式如下:
1 | $ kce get svc |
就是edgecontroller的10000端口映射到主机nodePort的端口号。
启动脚本
1 | $GOPATH/src/github.com/kubeedge/kubeedge/build/edge/run_daemon.sh only_run_edge \ |
创建node节点
在k3s服务器节点上通过以下yaml文件来创建一个node,保存为node.yaml之后,执行kubectl apply -f node.yaml
。
1 | apiVersion: v1 |
然后,查看node状态可以看到edge已经上报状态到k3s了。
1 | $ kc get nodes |
接下来,就可以像使用普通k8s一样部署你的应用到edge节点(你可以把节点换成你的树莓派或者其他开发板)了。enjoy yourself ^_^