在物聯網情境中雲端與邊緣端之間的網路環境不一定能保持穩定連線。因此今天
我們要測試的主題是當雲端與邊緣端之間的網路發生斷線的情況下,佈署在邊緣端的服務會有甚麼反應。
開始之前一樣放上我的節點狀態,方便辨認那些節點是透過KubeEdge規則加進來的那些是透過Kubernetes加入叢集的:
首先我們將NGINX透過NodeSelector佈署到邊緣節點上
# nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: default
labels:
app: nginx-deploy
spec:
replicas: 3
selector:
matchLabels:
app: nginx-deploy
template:
metadata:
labels:
app: nginx-deploy
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
nodeSelector:
name: edge
kubectl apply -f nginx-deploy.yaml
kubectl get pods -o wide
可以看到服務正常佈署在edge節點上,接著將master節點的網路線拔掉:
可以看到目前邊緣端與雲端處於斷線狀態,此時我們手動把其中一個NGINX容器移除:
過一小段時間後再看一次:
可以看到即便在雲端與邊緣端斷線的情況下,邊緣端仍然能自行管理服務(因為是透過deployments配置的),維持deployment定義的副本數量。
重新把網路線接上後,我想到另一種測試方式。如果我把edgecore服務關掉呢?
先確定一下原本的服務是正常的:
service edgecore stop
curl 172.17.0.4:80
可以發現服務仍然正常運行,但如果我們手動把BGIBX容器暫停:
可以發現雖然pause容器還在,但由於edgecore服務暫停的緣故,無法自動修復Pod。
假如是在Kubernetes節點上呢?這次我們將服務佈署到Kubertnetes節點上
# k8s-nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-nginx-deploy
namespace: default
labels:
app: k8s-nginx-deploy
spec:
replicas: 3
selector:
matchLabels:
app: k8s-nginx-deploy
template:
metadata:
labels:
app: k8s-nginx-deploy
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
nodeSelector:
name: k8s-node02
kubectl apply -f k8s-nginx-deploy.yaml
kubectl get pods -o wide
確定服務成功佈署後,我們再把master節點上的網路線拔掉一次:
確定Kubernetes的worker節點跟master節點間處於斷線狀態,這時候我們再把運行NGINX服務的docker容器移除掉:
可以發現過一段時間服務仍然會重新運行:
小結一下,KubeEdge在邊緣節點上的服務即便是與雲端斷線的情況下仍然能夠正常服務;但如果是edgecore壞掉的情況下,服務再損壞便無法正常修復。