python数据可视化工具测评

欢迎来到今天的讨论,我们将探讨,python数据可视化工具有哪些 python数据可视化优秀案例,一起探索吧!

大家好,小编来为大家解答以下问题,华为python语言通用编程规范,python云计算有哪些岗位,今天让我们一起来看看吧!

一、KubeEdge 简介
① 什么是 KubeEdge ?

KubeEdge 是一个开源的系统,可将本机容器化应用编排和管理扩展到边缘端设备python语法错误撤回方法,python语法错误怎么解决。它基于 Kubernetes 构建,为网络和应用程序提供核心基础架构支持,并在云端和边缘端部署应用,同步元数据python自动化运维库。KubeEdge 还支持 MQTT 协议,允许开发人员编写客户逻辑,并在边缘端启用设备通信的资源约束。KubeEdge 包含云端和边缘端两部分,使用 KubeEdge,可以很容易地将已有的复杂机器学习、图像识别、事件处理和其他高级应用程序部署到边缘端并进行使用。随着业务逻辑在边缘端上运行,可以在本地保护和处理大量数据。通过在边缘端处理数据,响应速度会显著提高,并且可以更好地保护数据隐私。KubeEdge 是一个由 Cloud Native Computing Foundation (CNCF) 托管的孵化级项目,CNCF 是对 KubeEdge 的 孵化公告。

② KubeEdge 的优势

Kubernetes 原生支持:使用 KubeEdge 用户可以在边缘节点上编排应用、管理设备并监控应用程序/设备状态,就如同在云端操作 Kubernetes 集群一样。云边可靠协作:在不稳定的云边网络上,可以保证消息传递的可靠性,不会丢失。边缘自治:当云边之间的网络不稳定或者边缘端离线或重启时,确保边缘节点可以自主运行,同时确保边缘端的应用正常运行。边缘设备管理:通过 Kubernetes 的原生 API,并由 CRD 来管理边缘设备。极致轻量的边缘代理:在资源有限的边缘端上运行的非常轻量级的边缘代理(EdgeCore)。

③ KubeEdge 的工作原理

KubeEdge 由云端和边缘端部分构成:

云上部分: CloudHub 是一个 Web Socket 服务端,负责监听云端的变化,缓存并发送消息到 EdgeHub; EdgeController 是一个扩展的 Kubernetes 控制器,管理边缘节点和 Pods 的元数据确保数据能够传递到指定的边缘节点; DeviceController 是一个扩展的 Kubernetes 控制器,管理边缘设备,确保设备信息、设备状态的云边同步。边缘部分: EdgeHub 是一个 Web Socket 客户端,负责与边缘计算的云服务(例如 KubeEdge 架构图中的 Edge Controller)交互,包括同步云端资源更新、报告边缘主机和设备状态变化到云端等功能; Edged 是运行在边缘节点的代理,用于管理容器化的应用程序; EventBus 是一个与 MQTT 服务器 (mosquitto) 交互的 MQTT 客户端,为其他组件提供订阅和发布功能; ServiceBus 是一个运行在边缘的 HTTP 客户端,接受来自云上服务的请求,与运行在边缘端的 HTTP 服务器交互,提供了云上服务通过 HTTP 协议访问边缘端 HTTP 服务器的能力; DeviceTwin 负责存储设备状态并将设备状态同步到云,它还为应用程序提供查询接口; MetaManager 是消息处理器,位于 Edged 和 Edgehub 之间,它负责向轻量级数据库 (SQLite) 存储/检索元数据。

④ 升级 KubeEdge

在每个边缘节点上备份 edgecore 数据库:

$ mkdir -p /tmp/kubeedge_backup
$ cp  /tmp/kubeedge_backup/

您可以保留旧的配置,根据需要保存一些自定义更改。升级后,某些选项可能会被删除,而某些选项可能会被添加,请不要直接使用旧的配置。如果从 1.3 升级到 1.4,请注意会将设备 API 从 v1alpha1 升级到 v1alpha2,需要安装 Device v1alpha2 和 DeviceModel v1alpha2,并将它们现有的自定义资源从 v1alpha1 手动转换为 v1alpha2,如果需要回滚,建议将 v1alpha1 CRD 和自定义资源保留在集群中或导出到某个位置。确保所有 Edgecore 进程均已停止后,一个一个停止 edgecore 的进程,然后停止 cloudcore。停止的方式取决于部署方式: 使用二进制 or “keadm” 方式: 使用 kill; 使用 “systemd”方式: 使用 systemctl。清理:

$ rm -rf /var/lib/kubeedge /etc/kubeedge

在每个边缘节点还原数据库:

$ mkdir -p /var/lib/kubeedge
$ mv  /var/lib/kubeedge/
二、KubeEdge 的部署
① 使用 Keadm 进行部署

Keadm 用于安装 KubeEdge 的云端和边缘端组件,它不负责 K8s 的安装和运行。可以参考 Kubernetes-compatibility 了解 Kubernetes 兼容性来确定安装哪个版本的 Kubernetes。Keadm 目前支持 Ubuntu 和 CentOS OS,RaspberryPi 的支持正在进行中,并且需要超级用户权限(或 root 权限)才能运行。

(A)设置云端(KubeEdge 主节点)

keadm init: keadm init 将安装 cloudcore,生成证书并安装 CRD(默认情况下边缘节点需要访问 cloudcore 中 10000、10002 端口),它还提供了一个命令行参数,通过它可以设置特定的版本。 必须正确配置 kubeconfig 或 master 中的至少一个,以便可以将其用于验证 k8s 集群的版本和其他信息。 请确保边缘节点可以使用云节点的本地 IP 连接云节点,或者需要使用 --advertise-address 标记指定云节点的公共 IP 。 –advertise-address(仅从 1.3 版本开始可用)是云端公开的地址(将添加到 CloudCore 证书的 SAN 中),默认值为本地 IP。 keadm init 将会使用二进制方式部署 cloudcore 为一个系统服务,如果想实现容器化部署,可以参考 keadm beta init。 keadm init 如下所示:

# keadm init --advertise-address="THE-EXPOSED-IP"(only work since 1.3 release)

输出:

Kubernetes version verification passed, KubeEdge installation will start...
...
KubeEdge cloudcore is running, For logs visit:  

keadm beta init: 现在可以使用 keadm beta init 进行云端组件安装:

# keadm beta init --advertise-address="THE-EXPOSED-IP" --set cloudcore-tag=v1.9.0 

还可使用 --external-helm-root 安装外部的 helm chart 组件,如 edgemesh:

# keadm beta init --set server.advertiseAddress="THE-EXPOSED-IP" --set server.nodeName=allinone   --force  --profile=edgemesh

keadm beta manifest generate 可以帮助我们快速渲染生成期望的 manifests 文件,并输出在终端显示:

# keadm beta manifest generate --advertise-address="THE-EXPOSED-IP"  > 
(B) 设置边缘端(KubeEdge 工作节点)

从云端获取令牌:在云端运行 keadm gettoken 将返回token令牌,该令牌将在加入边缘节点时使用:

# keadm gettoken
27a37ef16159f7d3be8fae95d588b79b3adaaf92727b72659eb89758c66ffda2.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTAyMTYwNzd9.JBj8LLYWXwbbvHKffJBpPd5CyxqapRQYDIXtFZErgYE

keadm join 将安装 edgecore 和 mqtt。它还提供了一个命令行参数,通过它可以设置特定的版本:

# keadm join --cloudcore-ipport=192.168.20.50:10000 --token=27a37ef16159f7d3be8fae95d588b79b3adaaf92727b72659eb89758c66ffda2.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTAyMTYwNzd9.JBj8LLYWXwbbvHKffJBpPd5CyxqapRQYDIXtFZErgYE

可以使用 keadm beta join 通过镜像下载所需资源,进行节点接:

# keadm beta join --cloudcore-ipport=192.168.20.50:10000 --token=27a37ef16159f7d3be8fae95d588b79b3adaaf92727b72659eb89758c66ffda2.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTAyMTYwNzd9.JBj8LLYWXwbbvHKffJBpPd5CyxqapRQYDIXtFZErgYE
# keadm beta join --cloudcore-ipport=192.168.20.50:10000 --runtimetype remote --remote-runtime-endpoint  --token=27a37ef16159f7d3be8fae95d588b79b3adaaf92727b72659eb89758c66ffda2.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTAyMTYwNzd9.JBj8LLYWXwbbvHKffJBpPd5CyxqapRQYDIXtFZErgYE

输出:

Host has mosquit+ already installed and running. Hence skipping the installation steps !!!
...
KubeEdge edgecore is running, For logs visit:  

说明: –cloudcore-ipport 是必填参数; 如果您需要的话,加上 --token 会自动为边缘节点生成证书; 需要保证云和边缘端使用的 KubeEdge 版本相同; 加上 --with-mqtt 会自动为边缘节点以容器运行的方式部署 mosquitto 服务。

(C)启用 kubectl logs 功能

kubectl logs 必须在使用 metrics-server 之前部署,通过以下操作激活功能:确保可以找到 Kubernetes 的 和 文件,如果通过 kubeadm 安装 Kubernetes 集群,这些文件将位于 /etc/kubernetes/pki/ 目录中:

ls /etc/kubernetes/pki/

设置 CLOUDCOREIPS 环境,环境变量设置为指定的 cloudcore 的 IP 地址,如果具有高可用的集群,则可以指定 VIP(即弹性 IP/虚拟 IP):

export CLOUDCOREIPS="192.168.0.139"

使用以下命令检查环境变量:

echo $CLOUDCOREIPS

在云端节点上为 CloudStream 生成证书,但是生成的文件不在 /etc/kubeedge/ 中,需要从GitHub的存储库中拷贝一份。 将用户更改为 root:

```shell
sudo su

从原始克隆的存储库中拷贝证书:shell cp $ /etc/kubeedge/ 将目录更改为 kubeedge 目录:shell cd /etc/kubeedge/ 从 生成证书 bash stream。需要在主机上设置 iptables,此命令应该在每个 apiserver 部署的节点上执行,在这种情况下,须在 master 节点上执行,并由 root 用户执行此命令,在运行每个 apiserver 的主机上运行以下命令:

bash
iptables -t nat -A OUTPUT -p tcp --dport 10350 -j DNAT --to $CLOUDCOREIPS:10003

如果不确定是否设置了 iptables,并且希望清除所有这些表(如果错误地设置 iptables,它将阻止使用 kubectl logs 功能),可以使用以下命令清理 iptables 规则:

shell iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

和 上 cloudcore 和 edgecore 都要 修改,将 cloudStream 和 edgeStream 设置为 enable: true,将服务器 IP 更改为 cloudcore IP(与 $ CLOUDCOREIPS 相同),打开 YAML 文件:

shell
sudo nano 

在以下文件中修改( enable: true )内容:

yaml cloudStream: enable: true streamPort: 10003 tlsStreamCAFile:  tlsStreamCertFile:  tlsStreamPrivateKeyFile:  tlsTunnelCAFile:  tlsTunnelCertFile:  tlsTunnelPrivateKeyFile:  tunnelPort: 10004

在 edgecore 中打开 YAML 文件:

shell sudo nano 

修改以下部分中的文件 (enable: true), (server: 192.168.0.193:10004):

yaml
edgeStream:
  enable: true
  handshakeTimeout: 30
  readDeadline: 15
  server: 192.168.0.139:10004
  tlsTunnelCAFile: 
  tlsTunnelCertFile: 
  tlsTunnelPrivateKeyFile: 
  writeDeadline: 15

重新启动所有 cloudcore 和 edgecore:

sudo su

pkill cloudcore
nohup cloudcore >  2>&1 &

kubectl -n kubeedge rollout restart deployment cloudcore

systemctl restart edgecore.service

可以考虑避免 kube-proxy 部署在 edgenode 上,有两种方法:

// 1.通过调用 `kubectl edit  -n kube-system kube-proxy` 添加以下设置:
yaml
affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: 
                operator: DoesNotExist
                
// 2.如果您仍然要运行 `kube-proxy`,请通过在以下位置添加 `edgecore.service` 中的 env 变量来要求 **edgecore** 不进行检查edgecore.service:
shell
    sudo vi /etc/kubeedge/edgecore.service
    
// 将以下行添加到 **edgecore.service** 文件:
shell
    Environment="CHECK_EDGECORE_ENVIRONMENT=false"
    
// 最终文件应如下所示:
Deion=edgecore.service

    [Service]
    Type=simple
    ExecStart=/root/cmd/ke/edgecore --logtostderr=false 
    Environment="CHECK_EDGECORE_ENVIRONMENT=false"

    [Install]
    WantedBy=multi-user.target
(D) 在云端支持 Metrics-server

实现该功能点的是重复使用 cloudstream 和 edgestream 模块,因此还需要执行启用 kubectl logs 功能的所有步骤。由于边缘节点和云节点的 kubelet 端口不同,故当前版本的 metrics-server(0.3.x)不支持自动端口识别(这是 0.4.0 功能),因此现在需要手动编译从 master 分支拉取的镜像。Git clone 最新的 metrics server 代码仓:

bash
git clone 

转到 metrics server 目录:

bash
cd metrics-server

制作 docker 容器:

bash
make container

检查您是否有此 docker 镜像:

bash
docker images

确保使用镜像 ID 来对镜像标签进行变更,以使其与 yaml 文件中的镜像名称一致:

bash
docker tag a24f71249d69 metrics-server-kubeedge:latest

需要通过以下命令使主节点可调度:

shell
kubectl taint nodes --all 

需要将这些设置写入部署 yaml()文件中,如下所示:

yaml
      volumes:
      # mount in tmp so we can safely use from-scratch images and/or read-only containers
      - name: tmp-dir
        emptyDir: {}
      hostNetwork: true                          #Add this line to enable hostnetwork mode
      containers:
      - name: metrics-server
        image: metrics-server-kubeedge:latest    #Make sure that the REPOSITORY and TAG are correct
        # Modified args to include --kubelet-insecure-tls for Docker Desktop (don't use this flag with a real k8s cluster!!)
        imagePullPolicy: Never                   #Make sure that the deployment uses the image you built up
        args:
          - --cert-dir=/tmp
          - --secure-port=4443
          - --v=2
          - --kubelet-insecure-tls
          - --kubelet-preferred-address-types=InternalDNS,InternalIP,ExternalIP,Hostname
          - --kubelet-use-node-status-port       #Enable the feature of --kubelet-use-node-status-port for Metrics-server
        ports:
        - name: main-port
          containerPort: 4443
          protocol: TCP
(E) 重置 KubeEdge master 节点和工作节点

keadm reset 将停止 cloudcore 并从 Kubernetes master 中删除与KubeEdge相关的资源,如 kubeedge 命名空间,它不会卸载/删除任何先决条件。它为用户提供了一个标志,以指定 kubeconfig 路径,默认路径为 :

# keadm reset --kube-config=$
② 使用二进制部署
(A)设置云端(KubeEdge 主节点)

创建 CRD:

kubectl apply -f 
kubectl apply -f 
kubectl apply -f 
kubectl apply -f 
kubectl apply -f 
kubectl apply -f 

准备配置文件:

# cloudcore --minconfig > 

运行:

# cloudcore --config 
(B) 设置边缘端(KubeEdge 工作节点)

生成配置文件:

# edgecore --minconfig > 

在云端获取 token 值:

# kubectl get secret -nkubeedge tokensecret -o=jsonpath='{.data.tokendata}' | base64 -d

更新 edgecore 配置文件中的 token 值:

# sed -i -e "s|token: .*|token: ${token}|g" 

如果要在同一主机上运行 cloudcore 和 edgecore ,请首先运行以下命令:

# export CHECK_EDGECORE_ENVIRONMENT="false"

运行 edgecore:

# edgecore --config 

运行 edgecore -h 以获取帮助信息,并在需要时添加选项。

© 局限性

需要超级用户权限(或 root 权限)才能运行。使用二进制部署 KubeEdge 进行测试,切勿在生产环境中使用这种方式。

三、配置 CloudCore 和 EdgeCore
① 配置云端(KubeEdge Master 节点)
(A)修改配置文件

Cloudcore 要求更改 配置文件,创建并设置 cloudcore 配置文件,创建 /etc/kubeedge/config 文件夹:

# the default configuration file path is ''
# also you can specify it anywhere with '--config'
mkdir -p /etc/kubeedge/config/

使用 ~/kubeedge/cloudcore --minconfig 命令获取最小配置模板:

~/kubeedge/cloudcore --minconfig > 

或使用 ~/kubeedge/cloudcore --defaultconfig 命令获取完整配置模板:

~/kubeedge/cloudcore --defaultconfig > 

编辑配置文件:

vim 
(B) 修改

无论是 kubeAPIConfig.kubeConfig 或 kubeAPIConfig.master,都可能 kubeconfig 文件的路径,同时它也可能是:



// 或者

/home/<your_username>/.kube/config

在安装 kubernetes 的地方执行以下步骤:

要开始使用集群,您需要以普通用户身份运行以下命令

mkdir -p $
sudo cp -i  $
sudo chown $(id -u):$(id -g) $

默认情况下,cloudcore 使用 https 连接到 Kubernetes apiserver。如果 master 和 kubeConfig 都进行了配置,master 将覆盖 kubeconfig 中的对应值。在 advertiseAddress 中配置所有暴露给边缘节点(如动态 IP)的 CloudCore 的 IP 地址,这些 IP 地址将添加到 CloudCore 证书中的 SAN 中。

modules:
  cloudHub:
    advertiseAddress:
    - 10.1.11.85
© 在云端(KubeEdge master 节点)添加边缘节点(KubeEdge 工作节点)

如果 edgecore 的配置中的 modules.edged.registerNode 设置为 true,Edge 节点则会自动注册:

modules:
  edged:
    registerNode: true

复制 $ 到您的工作目录并更改 为边缘节点的名称:

mkdir -p ~/kubeedge/yaml
cp $ ~/kubeedge/yaml
② 配置边缘端(KubeEdge 工作节点)
(A)创建并设置 Edgecore 配置文件

创建 /etc/kubeedge/config 文件夹:

# the default configration file path is ''
# also you can specify it anywhere with '--config'
    mkdir -p /etc/kubeedge/config/

使用 ~/kubeedge/edgecore --minconfig 命令创建最简配置:

~/kubeedge/edgecore --minconfig > 

或使用 ~/kubeedge/edgecore --defaultconfig 命令创建完整配置:

~/kubeedge/edgecore --defaultconfig > 

编辑配置文件:

vim 
(B) 修改

检查 modules.edged.podSandboxImage,请运行以下命令:

shell
getconf LONG_BIT

+ `kubeedge/pause-arm:3.1` for arm arch
+ `kubeedge/pause-arm64:3.1` for arm64 arch
+ `kubeedge/pause:3.1` for x86 arch

KubeEdge v1.3之前的版本:检查 modules.edgehub.tlsCaFile 、modules.edgehub.tlsCertFile 和 modules.edgehub.tlsPrivateKeyFile 的证书文件是否存在。如果这些文件不存在,需要从云端拷贝它们。KubeEdge v1.3之后的版本:仅跳过以上有关证书文件的检查,但是如果手动配置 Edgecore 证书,则必须检查证书的路径是否正确。在 modules.edgehub.websocket.server 和 .server 字段中更新 KubeEdge CloudCore 的 IP 地址和端口,需要设置 cloudcore 的 IP 地址。配置 docker 或 remote 作为所需的 runtime 的容器(对于所有基于 CRI 的runtime(包括容器))。如果未指定此参数,则默认情况下将使用 docker 作为 runtime 的容器:

runtimeType: docker
// 或者
runtimeType: remote

如果运行类型是 remote,请遵循 KubeEdge CRI 配置指南来设置基于 remote/CRI 的运行时的 KubeEdge。在用于申请证书的 modules.edgehub.httpServer 中配置 KubeEdge cloudcore 的 IP 地址和端口,例如:

modules:
  edgeHub:
    httpServer: https://10.1.11.85:10002

配置 token:

kubectl get secret tokensecret -n kubeedge -oyaml

将获得如下内容:

apiVersion: v1
data:
  tokendata: ODEzNTZjY2MwODIzMmIxMTU0Y2ExYmI5MmRlZjY4YWQwMGQ3ZDcwOTIzYmU3YjcyZWZmOTVlMTdiZTk5MzdkNS5leUpoYkdjaU9pSklVekkxTmlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbGVIQWlPakUxT0RreE5qRTVPRGw5LmpxNENXNk1WNHlUVkpVOWdBUzFqNkRCdE5qeVhQT3gxOHF5RnFfOWQ4WFkK
kind: Secret
metadata:
  creationTimestamp: "2020-05-10T01:53:10Z"
  name: tokensecret
  namespace: kubeedge
  resourceVersion: "19124039"
  selfLink: /api/v1/namespaces/kubeedge/secrets/tokensecret
  uid: 48429ce1-2d5a-4f0e-9ff1-f0f1455a12b4
type: Opaque

通过 base64 解码 tokendata 字段:

echo ODEzNTZjY2MwODIzMmIxMTU0Y2ExYmI5MmRlZjY4YWQwMGQ3ZDcwOTIzYmU3YjcyZWZmOTVlMTdiZTk5MzdkNS5leUpoYkdjaU9pSklVekkxTmlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbGVIQWlPakUxT0RreE5qRTVPRGw5LmpxNENXNk1WNHlUVkpVOWdBUzFqNkRCdE5qeVhQT3gxOHF5RnFfOWQ4WFkK |base64 -d
# then we get:
81356ccc08232b1154ca1bb92def68ad00d7d70923be7b72eff95e17be9937d5.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1ODkxNjE5ODl9.jq4CW6MV4yTVJU9gAS1j6DBtNjyXPOx18qyFq_9d8XY

将解码后的字符串复制到 中,如下所示:

modules:
  edgeHub:
    token: 81356ccc08232b1154ca1bb92def68ad00d7d70923be7b72eff95e17be9937d5.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1ODkxNjE5ODl9.jq4CW6MV4yTVJU9gAS1j6DBtNjyXPOx18qyFq_9d8XY
四、使用 CRI 设置不同的 container runtime
① containerd

Docker 18.09 及更高版本自带 containerd ,因此无需手动安装,如果没有 containerd ,可以通过运行以下命令进行安装:

# Install containerd
apt-get update && apt-get install -y 

# Configure containerd
mkdir -p /etc/containerd
containerd config default > 

# Restart containerd
systemctl restart containerd

使用 Docker 自带的 containerd 时,默认情况下 cri 插件是不可使用的,需要更新 containerd 的配置,来使 KubeEdge 能够 containerd 作为它的 runtime:

# Configure containerd
mkdir -p /etc/containerd
containerd config default > 

更新 edgecore 配置文件 ,为被作为 runtime 的 containerd 指定以下参数:

remoteRuntimeEndpoint: 
remoteImageEndpoint: 
runtimeRequestTimeout: 2
podSandboxImage: 
runtimeType: remote

默认情况下,cri 的 cgroup 驱动程序配置为 cgroupfs,如果不是这种情况,可以在中 手动切换成 systemd:

modules:
  edged:
    cgroupDriver: systemd

设置 containerd 的配置文件()中的 systemd_cgroup 为 true ,然后重新启动 containerd:

# 
systemd_cgroup = true

# Restart containerd
systemctl restart containerd

创建 nginx 应用程序,检查该服务容器含有 containerd 并位于边缘端:

kubectl apply -f $
 created

ctr  container ls
CONTAINER                                                           IMAGE                              RUNTIME
41c1a07fe7bf7425094a9b3be285c312127961c158f30fc308fd6a3b7376eab2        io.containerd.runtime.v1.linux

cri 不支持 multi-tenancy 但是 containerd 支持,因此默认情况下,容器的命名空间需要设置为 “”。

② CRI-O

请遵循 CRI-O安装指南 来设置 CRI-O,如果边缘节点需要在 ARM 平台上运行,而发行版是 ubuntu18.04,那么可能需要构建二进制形式的源文件然后进行安装,因为 Kubic 存储库中没有针对此组合的 CRI-O 软件包:

git clone 
cd cri-o
make
sudo make install
# generate and install configuration files
sudo make install.config

遵循以下指导来配置 CNI 网络,设置 CNI,更新 edgecore 配置文件,为 CRI-O-based runtime 指定以下参数:

remoteRuntimeEndpoint: 
remoteImageEndpoint: 
runtimeRequestTimeout: 2
podSandboxImage: 
runtimeType: remote

默认情况下 CRI-O 使用 cgroupfs 作为一个 cgroup 的程序管理器,如果想替换成 systemd,请更新 CRI-O 配置文件():

# Cgroup management implementation used for the runtime.
cgroup_manager = "systemd"

如果在 ARM 平台上使用 pause 镜像,并且 pause 镜像不是 multi-arch 镜像,应该更新 pause 镜像,要配置 pause 镜像,更新 CRI-O 配置文件:

pause_image = ""

同时更新 里面的 cgroup driver manager:

modules:
  edged:
    cgroupDriver: systemd

启动 CRI-O 和 edgecore 服务(假设两项服务均由 systemd 负责):

sudo systemctl daemon-reload
sudo systemctl enable crio
sudo systemctl start crio
sudo systemctl start edgecore

创建应用程序,并检查 CRI-O 容器是在边缘端创建:

kubectl apply -f $
 created

# crictl ps
CONTAINER ID        IMAGE               CREATED             STATE               NAME                ATTEMPT             POD ID
41c1a07fe7bf7       f6d22dec9931b       2 days ago          Running             nginx               0                   51f727498b06f
③ Kata Containers

Kata Containers 是一个 container runtime,旨在解决多租户、不受信任的云环境中的安全挑战。但是多租户支持仍在 KubeEdge 的 backlog 中,如果下游定制 KubeEdge 已经支持多租户,那么 Kata Containers 是轻量级且安全的 container runtime 的理想选择。按照 安装指南 安装和配置容器和 Kata Containers。如果安装了“kata-runtime”,请运行以下命令以检查主机系统是否可以运行并创建 Kata 容器:

kata-runtime kata-check

RuntimeClass 是一项功能,用于选择自 containerdv1.2.0 以来受支持的container runtime配置,以用于运行 Pod 的容器。如果 containerd 版本高于 v1.2.0,则有两种选择来配置 containerd 以使用 Kata 容器: Kata Containers 作为 RuntimeClass; Kata Containers 作为不受信任的工作负载的 runtime。假设您已将 Kata Containers 配置为不受信任的工作负载的 runtime,为了验证它是否可以在边缘节点上运行,可以运行:

cat 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-untrusted
  annotations:
    .untrusted-workload: "true"
spec:
  containers:
  - name: nginx
    image: nginx
    
    
kubectl create -f 

# verify the container is running with qemu hypervisor on edge side,
ps aux | grep qemu
root      3941  3.0  1.0 2971576 174648 ?      Sl   17:38   0:02 /usr/bin/qemu-system-aarch64

crictl pods
POD ID              CREATED              STATE               NAME                NAMESPACE           ATTEMPT
b1c0911644cb9       About a minute ago   Ready               nginx-untrusted     default             0
④ Virtlet

下载 CNI 插件安装包并解压它:

$ wget 

# Extract the tarball
$ mkdir cni
$ tar -zxvf  -C cni

$ mkdir -p /opt/cni/bin
$ cp ./cni/* /opt/cni/bin/

配置 CNI 插件:

$ mkdir -p /etc/cni/net.d/

$ cat > <<EOF
{
  "cniVersion": "0.3.1",
  "name": "containerd-net",
  "type": "bridge",
  "bridge": "cni0",
  "isGateway": true,
  "ipMasq": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.88.0.0/16",
    "routes": [
      { "dst": "0.0.0.0/0" }
    ]
  }
}
EOF

设置 VM runtime,使用 脚本来设置 VM runtime,它利用 Arktos Runtime 安装包来启动三个容器:

vmruntime_vms
vmruntime_libvirt
vmruntime_virtlet
五、使用 Kubeflow 和 Volcano 实现典型 AI 训练任务
① Kubeflow 的诞生背景和运行 AI 计算任务面临的问题

Kubernetes 已经成为云原生应用编排、管理的事实标准,越来越多的应用选择向 Kubernetes 迁移。人工智能和机器学习领域天然的包含大量的计算密集型任务,开发者非常愿意基于 Kubernetes 构建 AI 平台,充分利用 Kubernetes 提供的资源管理、应用编排、运维监控能力。然而基于 Kubernetes 构建一个端到端的 AI 计算平台是非常复杂和繁琐的过程,它需要处理很多个环节。如下所示,除了熟知的模型训练环节之外还包括数据收集、预处理、资源管理、特性提取、数据验证、模型的管理、模型发布、监控等环节,对于一个 AI 算法工程师来讲,要做模型训练,就不得不搭建一套 AI 计算平台,这个过程耗时费力,而且需要很多的知识积累:

Kubeflow 诞生于 2017 年,Kubeflow 项目是基于容器和 Kubernetes 构建,旨在为数据科学家、机器学习工程师、系统运维人员提供面向机器学习业务的敏捷部署、开发、训练、发布和管理平台。它利用了云原生技术的优势,让用户更快速、方便的部署、使用和管理当前最流行的机器学习软件。目前 Kubeflow 1.0 版本已经发布,包含开发、构建、训练、部署四个环节,可全面支持企业用户的机器学习、深度学习完整使用过程,如下所示:

通过 Kubeflow 1.0,用户可以使用 Jupyter 开发模型,然后使用 fairing(SDK)等工具构建容器,并创建 Kubernetes 资源训练其模型。模型训练完成后,用户还可以使用 KFServing 创建和部署用于推理的服务器,再结合 pipeline(流水线)功能可实现端到端机器学习系统的自动化敏捷构建,实现 AI 领域的 DevOps。

② Kubernetes 存在的问题

既然有了 Kubeflow,是不是在 Kubernetes 上进行机器学习、深度学习就一帆风顺了呢?答案是否定的。我们知道 Kubeflow 在调度环境使用的是 kubernetes 的默认调度器,而 Kubernetes 默认调度器最初主要是为长服务设计的,对于 AI、大数据等批量和弹性调度方面还有很多的不足。主要存在以下问题: 资源争抢问题:TensorFlow 的作业包含 Ps 和 Worker 两种不同的角色,这两种角色的 Pod 要配合起来完成整个作业,如果只是运行一种角色 Pod,整个作业是无法正常执行的,而默认调度器对于 Pod 调度是逐个进行的,对于 Kubeflow 作业 TFJob 的 Ps 和 Worker 是不感知的。在集群高负载(资源不足)的情况下,会出现多个作业各自分配到部分资源运行一部分 Pod,而又无法正执行完成的状况,从而造成资源浪费。以下为例,集群有 4 块 GPU 卡,TFJob1 和 TFJob2 作业各自有 4 个 Worker,TFJob1 和 TFJob2 各自分配到 2 个 GPU,但是 TFJob1 和 TFJob2 均需要 4 块 GPU 卡才能运行起来,这样 TFJob1 和 TFJob2 处于互相等待对方释放资源,这种死锁情况造成了 GPU 资源的浪费:

亲和调度问题:分布式训练中,Ps 和 Worker 存在很频繁的数据交互,所以 Ps 和 Worker 之间的带宽直接影响了训练的效率。Kubernetes 默认调度器并不考虑 Ps 和 Worker 的这种逻辑关系,Ps 和 Worker 是被随机调度的。如下图所示,2 个 TFJob(1 个 Ps + 2 Worker),使用默认调度器,有可能会出现(a)、(b)、(c)三种情况的任意一种情况,我们知道(c)才是最想要的调度结果。因为在©中,Ps 和 Worker 可以利用本机网络提供传输效率,缩短训练时间:

③ Volcano 批量调度系统加速 AI 计算的利器

Volcano是一款构建于 Kubernetes 之上的增强型高性能计算任务批量处理系统。作为一个面向高性能计算场景的平台,它弥补了 kubernetes 在机器学习、深度学习、HPC、大数据计算等场景下的基本能力缺失,其中包括 gang-schedule 的调度能力、计算任务队列管理、task-topology 和 GPU 亲和性调度。另外,Volcano 在原生 kubernetes 能力基础上对计算任务的批量创建及生命周期管理、fair-share、binpack 调度等方面做了增强,Volcano 充分解决了上文提到的 Kubeflow 分布式训练面临的问题:

④ Volcano 在华为云的应用:实现典型分布式 AI 训练任务

Kubeflow 和 Volcano 两个开源项目的结合充分简化和加速 Kubernetes 上 AI 计算进程,当前已经成为越来越多用户的最佳选择,应用于生产环境。Volcano 目前已经应用于华为云 CCE、CCI 产品以及容器批量计算解决方案。未来 Volcano 会持续迭代演进,优化算法、增强调度能力如智能调度的支持,在推理场景增加 GPU Share 等特性的支持,进一步提升 kubeflow 批量训练和推理的效率。登录 CCE 控制台,创建一个 CCE 集群,详情请参见购买 CCE 集群。在 CCE 集群上部署 Volcano 环境,单击左侧栏目树中的“插件管理”,在“插件市场”页签下单击 Volcano 插件下方的“安装插件”,在安装插件页面的“基本信息”步骤中选择要安装的集群和 Volcano 插件版本,单击“下一步:规格配置”:

Volcano 插件无可配置参数,直接单击“安装”,等待安装任务完成。安装 kfctl 工具并设置环境变量,环境变量设置如下:

export KF_NAME=<your choice of name for the Kubeflow deployment>
export BASE_DIR=<path to a base directory>
export KF_DIR=${BASE_DIR}/${KF_NAME}
export CONFIG_URI=""

kfctl 安装:下载 kfctl:

tar -xvf kfctl_v1.0.2_<platform>
chmod +x kfctl
mv kfctl /usr/local/bin/

部署 kubeflow:

mkdir -p ${KF_DIR}
cd ${KF_DIR}
kfctl apply -V -f ${CONFIG_URI} 

下载 kubeflow/examples 到本地并根据环境选择指南,命令如下:

yum install git
git clone 

安装 python3:

wget 
tar -zxvf 
cd Python-3.6.8 ./configure
make make install

安装完成后执行如下命令检查是否安装成功:

python3 -V 
pip3 -V

安装 jupyter notebook 并启动,命令如下:

pip3 install jupyter notebook
jupyter notebook --allow-root

Putty 设置 tunnel,远程连接 notebook,连接成功后浏览器输入 localhost:8000,登录 notebook。

根据 jupyter 的指引,创建分布式训练作业,通过简单的设置 schedulerName 字段的值为“volcano”,启用 Volcano 调度器:

kind: TFJob
metadata:
  name: {train_name}  
spec:
  schedulerName: volcano
  tfReplicaSpecs:
    Ps:
      replicas: {num_ps}
      template:
        metadata:
          annotations:
             "false"
        spec:
          serviceAccount: default-editor
          containers:
          - name: tensorflow
            command:
            ...
            env:
            ...
            image: {image}
            workingDir: /opt
          restartPolicy: OnFailure
    Worker:
      replicas: 1
      template:
        metadata:
          annotations:
             "false"
        spec:
          serviceAccount: default-editor
          containers:
          - name: tensorflow
            command:
            ...
            env:
            ...
            image: {image}
            workingDir: /opt
          restartPolicy: OnFailure

提交作业,开始训练:

kubectl apply -f 

等待训练作业完成,通过 Kubeflow 的 UI 可以查询训练结果信息。至此就完成了一次简单的分布式训练任务,Kubeflow 的借助 TFJob 简化了作业的配置。Volcano 通过简单的增加一行配置就可以让用户启动组调度、Task-topology 等功能来解决死锁、亲和性等问题,在大规模分布式训练情况下,可以有效的缩短整体训练时间。
原文地址1:https://blog.csdn.net/yyyqqq_/article/details/135288540
参考资料:python中用turtle画一个圆形 https://blog.csdn.net/SXIAOYAN_/article/details/140061099

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值