KubeEdge 初測

本文在已經成功部署了 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之類名稱的網絡設備。

結論

兩者還是存在差異。如部分命令不支持,如通信不穩定。

本文所用鏡像,真實存在,但可能會不定時更新。本文所述,僅爲本人實際測試之現象,不具通用性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章