云原生环境中的边缘计算

边缘计算概述

边缘计算是一种分布式计算模型,它将计算和存储资源移到网络的边缘,靠近数据源和用户。在云原生环境中,边缘计算可以与Kubernetes结合,实现更加高效、低延迟的应用部署。本文将介绍云原生环境中的边缘计算最佳实践。

K3s:轻量级Kubernetes

1. K3s简介

K3s是一个轻量级的Kubernetes发行版,专为边缘计算和资源受限环境设计。它的特点包括:

  • 体积小(二进制文件小于100MB)
  • 内存占用低
  • 启动速度快
  • 适合在边缘设备上运行

2. 安装K3s

# 安装K3s服务器
curl -sfL https://get.k3s.io | sh -

# 安装K3s代理(边缘节点)
curl -sfL https://get.k3s.io | K3S_URL=https://server-address:6443 K3S_TOKEN=token sh -

3. 配置K3s

# /etc/rancher/k3s/config.yaml
write-kubeconfig-mode: "0644"
tls-san:
  - my-k3s-server
node-name: edge-node-1
flannel-backend: vxlan

KubeEdge:边缘计算平台

1. KubeEdge简介

KubeEdge是一个基于Kubernetes的边缘计算平台,它扩展了Kubernetes的能力,使其能够管理边缘设备。KubeEdge的主要特点包括:

  • 边缘节点和云节点的双向通信
  • 边缘节点的离线操作
  • 边缘设备的管理
  • 边缘应用的部署和管理

2. 安装KubeEdge

# 安装KubeEdge云组件
kubectl apply -f https://raw.githubusercontent.com/kubeedge/kubeedge/master/build/crds/devices/devices_v1alpha2_device.yaml
kubectl apply -f https://raw.githubusercontent.com/kubeedge/kubeedge/master/build/crds/devices/devices_v1alpha2_devicemodel.yaml
kubectl apply -f https://raw.githubusercontent.com/kubeedge/kubeedge/master/build/crds/reliablesyncs/cluster_objectsync_v1alpha1.yaml
kubectl apply -f https://raw.githubusercontent.com/kubeedge/kubeedge/master/build/crds/reliablesyncs/objectsync_v1alpha1.yaml

# 安装CloudCore
helm repo add kubeedge https://kubeedge.github.io/helm-charts
helm install cloudcore kubeedge/cloudcore -n kubeedge --create-namespace

# 安装EdgeCore
# 在边缘节点上执行
tar -xzf kubeedge-v1.12.0-linux-amd64.tar.gz
cd kubeedge-v1.12.0-linux-amd64
./keadm join --cloudcore-ipport=cloudcore-address:10000 --token=token

3. 配置KubeEdge

# cloudcore.yaml
apiVersion: cloudcore.config.kubeedge.io/v1alpha1
kind: CloudCore
metadata:
  name: cloudcore
  namespace: kubeedge
spec:
  cloudHub:
    advertiseAddress: ["cloudcore-address"]
    port: 10000
    tlsCAFile: /etc/kubeedge/ca/rootCA.crt
    tlsCertFile: /etc/kubeedge/certs/cloudcore.crt
    tlsPrivateKeyFile: /etc/kubeedge/certs/cloudcore.key
  edgeController:
    enable: true
    heartbeatDelta: 15s

OpenYurt:边缘原生Kubernetes

1. OpenYurt简介

OpenYurt是阿里巴巴开源的边缘原生Kubernetes平台,它基于Kubernetes,为边缘计算场景提供了增强功能。OpenYurt的主要特点包括:

  • 边缘节点的自治能力
  • 服务访问的统一入口
  • 边缘节点的批量管理
  • 边缘应用的部署和管理

2. 安装OpenYurt

# 安装OpenYurt
kubectl apply -f https://openyurt.io/yurtadm-hub.yaml

# 初始化OpenYurt集群
yurtadm init --apiserver-advertise-address=master-address

# 加入边缘节点
yurtadm join master-address:6443 --token=token --node-type=edge

3. 配置OpenYurt

# YurtHub配置
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: yurt-hub
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: yurt-hub
  template:
    metadata:
      labels:
        app: yurt-hub
    spec:
      containers:
      - name: yurt-hub
        image: openyurt/yurthub:latest
        args:
        - --server-addr=master-address:6443
        - --node-name=$(NODE_NAME)
        - --join-token=token
        env:
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName

边缘工作负载管理

1. 部署边缘应用

apiVersion: apps/v1
kind: Deployment
metadata:
  name: edge-app
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: edge-app
  template:
    metadata:
      labels:
        app: edge-app
    spec:
      nodeSelector:
        node-role.kubernetes.io/edge: "true"
      containers:
      - name: app
        image: nginx
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
          requests:
            memory: "64Mi"
            cpu: "250m"

2. 边缘设备管理

apiVersion: devices.kubeedge.io/v1alpha2
kind: DeviceModel
metadata:
  name: temperature-sensor
  namespace: default
spec:
  properties:
    - name: temperature
      description: "Temperature in Celsius"
      type: "string"

---
apiVersion: devices.kubeedge.io/v1alpha2
kind: Device
metadata:
  name: temp-sensor-1
  namespace: default
spec:
  deviceModelRef:
    name: temperature-sensor
  nodeName: edge-node-1
  status:
    twins:
    - propertyName: temperature
      desired:
        metadata: {}
        value: ""
      reported:
        metadata: {}
        value: "25"

3. 边缘配置管理

apiVersion: v1
kind: ConfigMap
metadata:
  name: edge-config
  namespace: default
data:
  config.json: |
    {
      "interval": 10,
      "threshold": 30,
      "alert": true
    }

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: edge-monitor
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: edge-monitor
  template:
    metadata:
      labels:
        app: edge-monitor
    spec:
      nodeSelector:
        node-role.kubernetes.io/edge: "true"
      containers:
      - name: monitor
        image: edge-monitor:latest
        volumeMounts:
        - name: config
          mountPath: /etc/config
      volumes:
      - name: config
        configMap:
          name: edge-config

边缘网络管理

1. 边缘网络配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: cni-conf
  namespace: kube-system
data:
  10-flannel.conf: |
    {
      "name": "cbr0",
      "type": "flannel",
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    }

2. 边缘服务暴露

apiVersion: v1
kind: Service
metadata:
  name: edge-service
  namespace: default
spec:
  selector:
    app: edge-app
  ports:
  - port: 80
    targetPort: 8080
  type: NodePort

边缘存储管理

1. 本地存储配置

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv
  namespace: default
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /mnt/data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - edge-node-1

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: local-storage

边缘计算最佳实践

  1. 选择合适的边缘计算平台:根据边缘设备的资源情况选择K3s、KubeEdge或OpenYurt
  2. 优化资源配置:根据边缘设备的资源限制,合理配置Pod的资源请求和限制
  3. 实现边缘自治:配置边缘节点的离线运行能力,确保在网络中断时仍能正常工作
  4. 合理部署应用:将计算密集型任务部署在资源丰富的边缘节点,将轻量级任务部署在资源受限的边缘设备
  5. 监控边缘节点:实时监控边缘节点的状态和资源使用情况
  6. 管理边缘设备:使用KubeEdge或OpenYurt的设备管理功能管理边缘设备
  7. 确保数据安全:实施数据加密和访问控制,保护边缘数据的安全
  8. 优化网络通信:减少边缘节点和云节点之间的通信,降低网络延迟

实战案例:部署边缘监控系统

1. 架构设计

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│  Cloud Hub  │◄───┤  Edge Node  │◄───┤  Edge Device│
└─────────────┘    └─────────────┘    └─────────────┘
        ▲                  │
        │                  │
        ▼                  ▼
┌─────────────┐    ┌─────────────┐
│  K8s Master │    │  Local      │
└─────────────┘    │  Storage    │
                   └─────────────┘

2. 部署步骤

  1. 安装K3s或KubeEdge:在边缘节点上安装轻量级Kubernetes
  2. 配置边缘节点:设置边缘节点的资源限制和网络配置
  3. 部署监控应用:在边缘节点上部署监控应用
  4. 配置设备连接:连接边缘设备并配置设备模型
  5. 部署云服务:在云节点上部署数据处理和分析服务
  6. 配置数据同步:设置边缘节点和云节点之间的数据同步

3. 配置示例

# 边缘监控应用
apiVersion: apps/v1
kind: Deployment
metadata:
  name: edge-monitor
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: edge-monitor
  template:
    metadata:
      labels:
        app: edge-monitor
    spec:
      nodeSelector:
        node-role.kubernetes.io/edge: "true"
      containers:
      - name: monitor
        image: edge-monitor:latest
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: data
          mountPath: /data
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: local-pvc

# 设备配置
---
apiVersion: devices.kubeedge.io/v1alpha2
kind: DeviceModel
metadata:
  name: sensor-model
  namespace: default
spec:
  properties:
    - name: temperature
      description: "Temperature in Celsius"
      type: "string"
    - name: humidity
      description: "Humidity percentage"
      type: "string"

---
apiVersion: devices.kubeedge.io/v1alpha2
kind: Device
metadata:
  name: sensor-1
  namespace: default
spec:
  deviceModelRef:
    name: sensor-model
  nodeName: edge-node-1
  status:
    twins:
    - propertyName: temperature
      desired:
        metadata: {}
        value: ""
      reported:
        metadata: {}
        value: "25"
    - propertyName: humidity
      desired:
        metadata: {}
        value: ""
      reported:
        metadata: {}
        value: "60"

总结

边缘计算是云原生环境中的一个重要领域,它可以将计算和存储资源移到网络的边缘,靠近数据源和用户,从而减少延迟、提高性能。通过K3s、KubeEdge和OpenYurt等工具,我们可以在边缘设备上部署和管理Kubernetes集群,实现边缘计算的自动化和标准化。

在实际部署中,我们需要根据边缘设备的资源情况选择合适的边缘计算平台,并优化资源配置、实现边缘自治、合理部署应用、监控边缘节点、管理边缘设备、确保数据安全和优化网络通信,以构建一个高效、可靠的边缘计算系统。随着边缘计算技术的不断发展,我们可以期待更多专门为边缘计算优化的Kubernetes功能和工具的出现。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐