本文在已經成功部署了 KubeEdge 的集羣中進行實測。目的是瞭解 KubeEdge 與 k8s 的異同。本文針對1.2版本。
一些說明
因爲 KubeEdge 在 edgecore 上實現了 kubelet 部分功能,所以理論上是無縫接合的。
本文使用統一的鏡像latelee/webgin
,該鏡像的功能是提供 web 服務,返回運行時的 CPU、OS 和主機名稱。筆者利用 docker manifest,可根據不同 CPU 拉取不同鏡像,所以在 yaml 文件中統一使用同一名稱,可自動匹配不同平臺。
在主節點查看集羣:
# kubectl get node
NAME STATUS ROLES AGE VERSION
edge-node Ready edge 43h v1.17.1-kubeedge-v1.2.0
edge-node2 Ready <none> 3m14s v1.17.0
latelee.org.ttucon-2142ec Ready edge 40h v1.17.1-kubeedge-v1.2.1-dirty
ubuntu Ready master 44h v1.17.4
其中 edge-node2 爲 k8s,版本爲 v1.17.0,edge-node 和 latelee.org.ttucon-2142ec 爲 KubeEdge 邊緣端,後者是 arm 板子系統主機。
在部署 KubeEdge 時已經創建了 crds 了,查看之(本文中作用不大):
# kubectl get crds
NAME CREATED AT
clusterobjectsyncs.reliablesyncs.kubeedge.io 2020-02-20T08:28:32Z
devicemodels.devices.kubeedge.io 2019-12-31T08:41:34Z
devices.devices.kubeedge.io 2019-12-31T08:41:34Z
objectsyncs.reliablesyncs.kubeedge.io 2020-02-20T08:28:32Z
測試
測試 yaml 文件 webgin-service.yaml 如下:
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: webgin-deployment
labels:
app: webgin
spec:
replicas: 3 # tells deployment to run 3 pods matching the template
selector:
matchLabels:
app: webgin
template:
metadata:
labels:
app: webgin
spec:
containers:
- name: webgin
image: latelee/webgin
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- mountPath: /etc/localtime
name: time-zone
volumes:
- name: time-zone
hostPath:
path: /etc/localtime
hostNetwork: true
---
apiVersion: v1
kind: Service # 指定爲service
metadata:
labels:
run: webgin
name: webgin
namespace: default
spec:
ports:
- port: 88 # 對外爲88端口
targetPort: 80
selector:
app: webgin
type: LoadBalancer
釋義:deployment + service 組合,副本數爲3(因爲有3臺節點機器),hostNetwork 模式(故port選項不生效),掛載日期文件是爲了輸出真實時間。
在主節點創建 deployment:
kubectl apply -f webgin-service.yaml
查看 pod:
# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
webgin-deployment-7ccff86d8b-6hgfk 0/1 Pending 0 91s <none> edge-node <none> <none>
webgin-deployment-7ccff86d8b-lnmpj 1/1 Running 0 91s 192.168.0.153 edge-node2 <none> <none>
webgin-deployment-7ccff86d8b-ngp7v 1/1 Running 0 91s 192.168.0.220 latelee.org.ttucon-2142ec <none> <none>
有一節點一直處於 Pending 狀態,另外兩節點成功運行。
訪問web服務:
# curl 192.168.0.153
Hello World
arch: amd64 os: linux hostname: edge-node2
Now: 2020-03-12 22:05:35
# curl 192.168.0.220
Hello World
arch: arm os: linux hostname: latelee.org.ttucon-2142ec
Now: 2020-03-12 22:05:40
結果:可知運行的2臺機器,一爲x86,一爲arm。
其它測試
對比kubectl describe
命令。
k8s:
# kubectl describe pod webgin-deployment-7ccff86d8b-lnmpj
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled <unknown> default-scheduler Successfully assigned default/webgin-deployment-7ccff86d8b-lnmpj to edge-node2
Normal Pulled 8m46s kubelet, edge-node2 Container image "latelee/webgin" already present on machine
Normal Created 8m45s kubelet, edge-node2 Created container webgin
Normal Started 8m45s kubelet, edge-node2 Started container webgin
KubeEdge:
# kubectl describe pod webgin-deployment-7ccff86d8b-ngp7v
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled <unknown> default-scheduler Successfully assigned default/webgin-deployment-7ccff86d8b-ngp7v to latelee.org.ttucon-2142ec
結果:k8s 的輸出信息相對全面一些。
對比kubectl logs
命令。
k8s:
# kubectl logs webgin-deployment-7ccff86d8b-lnmpj
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET / --> main.myIndex (3 handlers)
gin server start...
[GIN-debug] Listening and serving HTTP on :80
KubeEdge:
# kubectl logs webgin-deployment-7ccff86d8b-ngp7v
Error from server: Get https://192.168.0.220:10250/containerLogs/default/webgin-deployment-7ccff86d8b-ngp7v/webgin: dial tcp 192.168.0.220:10250: connect: connection refused
結果:KubeEdge 不支持該命令。
對比kubectl exec
命令。
k8s:
# kubectl exec -it webgin-deployment-7ccff86d8b-lnmpj -- uname -a
Linux edge-node2 4.4.0-174-generic #204-Ubuntu SMP Wed Jan 29 06:41:01 UTC 2020 x86_64 GNU/Linux
KubeEdge:
# kubectl exec -it webgin-deployment-7ccff86d8b-ngp7v -- uname -a
Error from server: error dialing backend: dial tcp 192.168.0.220:10250: connect: connection refused
結果:KubeEdge 不支持該命令。
針對 hostNetwork 模式,在arm節點上查看容器IP(提供主要內容):
# docker exec -it 71605a5e17a3 ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:00:00:00:94
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
eth0 Link encap:Ethernet HWaddr 4C:00:00:00:00:EC
inet addr:192.168.0.220 Bcast:192.168.0.255 Mask:255.255.255.0
在arm節點上,沒有產生如veth216ffbc7
之類名稱的網絡設備。
結論
兩者還是存在差異。如部分命令不支持,如通信不穩定。
本文所用鏡像,真實存在,但可能會不定時更新。本文所述,僅爲本人實際測試之現象,不具通用性。