说明本文来自 GPU 云服务器用户实践征文,仅供学习和参考。
操作场景
本文介绍如何使用 GPU 云服务器实现边云协同处理。
配置环境
主机名 | 角色 | IP 地址 | 服务 | 配置 |
VM-0-9-centos | 云端 | VM-0-9-centos 内网 IPVM-0-9-centos 公网 IP | kuberbetes、docker、cloudcore | 操作系统:Centos 7.4CPU:Intel Xeon Cascade Lake(2.5 GHz)RAM:80GBGPU:NVIDIA T4 |
berbai02 | 边端 | berbai02 内网 IP | docker、edgecore | 操作系统:Ubuntu 18.04.6 LTSCPU:ARMv8 Processor rev 1 (v8l)RAM:4GBGPU:128CUDA core Maxwell |
|
demo | 边端 | demo 内网 IP | docker、edgecore |
操作步骤
安装驱动
安装依赖包
1. 参考 使用标准登录方式登录 Linux 实例,登录 GPU 云服务器。2. 执行以下命令,安装 dkms 依赖包。
sudo yum install -y dkms gcc kernel-devel yum-utils
3. 安装完成后,依次执行以下命令进行检查。
# 检查是否已经安装dkmsrpm -qa | grep -i dkms
# 检查是否安装kernel-develrpm -qa | grep kernel-devel
# 检查是否安装GCCrpm -qa | grep gcc
# 检查是否安装yum-utilsrpm -qa | grep yum-utils
返回结果如下图所示,表示已成功安装依赖包。

下载驱动
1. 前往 NVIDIA Driver Downloads,根据实际配置查找对应版本驱动。本文选择驱动版本如下图所示:

2. 选择驱动进入下载页面,单击DOWNLOAD。3. 在 “Download” 页面,右键单击 AGREE & DOWNLOAD,并在弹出的菜单中选择复制链接地址。如下图所示:

4. 参考 使用标准登录方式登录 Linux 实例,登录 GPU 云服务器。5. 使用 wget
命令,粘贴 步骤3 中已获取的驱动下载链接,下载驱动。命令如下:
wget https://us.download.nvidia.com/tesla/510.47.03/NVIDIA-Linux-x86_64-510.47.03.run
若您需将驱动下载至本地再上传至 GPU 云服务器,则可参见 如何将本地文件拷贝到云服务器。
安装驱动
1. 执行以下命令,添加执行权限。
chmod +x NVIDIA-Linux-x86_64-510.47.03.run
2. 执行以下命令,安装驱动。
sudo sh NVIDIA-Linux-x86_64-510.47.03.run
3. 执行以下命令,验证驱动是否安装成功。
nvidia-smi
返回结果如下图所示,说明驱动已安装成功。

安装 KubeEdge
安装前准备
1. 关闭防火墙
依次执行以下命令,关闭防火墙及自启动。
systemctl stop firewalld
systemctl disable firewalld
关闭后,可执行以下命令检查。
systemctl status firewalld
返回结果如下图所示:

2. 禁用 SELINUX
执行以下命令,编辑 /etc/selinux/config
配置文件。
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
3. 关闭 swap
安装 Kubernetes 需关闭 swap,执行以下命令,修改 /etc/fstab
文件中的 swap 配置。
sed -ri 's/.*swap.*/#&/' /etc/fstab
4. 重启系统
执行以下命令,重启系统,使配置生效。
reboot
安装 Docker
1. 执行以下命令,设置镜像仓库。
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2. 执行以下命令,更新 yum 软件包索引。
yum makecache fast
3. 执行以下命令,安装 Docker CE。
yum install docker-ce docker-ce-cli containerd.io
4. 依次执行以下命令,启动 Docker 并设置自启动。
systemctl start docker
systemctl enable docker
5. 依次执行以下命令,测试 Docker 安装是否成功。
docker version
docker run hello-world
docker images
返回结果如下图所示,表示 Docker 已安装成功。

部署 Kubernetes
1. 执行以下命令,配置 yum 源。
cat < /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF
2. 依次执行以下命令,安装 kubeadm 及 kubectl。
yum makecache
yum install -y kubelet kubeadm kubectl ipvsadm
yum install kubelet-1.17.0-0.x86_64 kubeadm-1.17.0-0.x86_64 kubectl-1.17.0-0.x86_64
3. 依次执行以下命令,配置内核参数。
cat < /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1vm.swappiness=0EOF
# 加载所有的 sysctl 配置sysctl --systemmodprobe br_netfiltersysctl -p /etc/sysctl.d/k8s.conf
# 加载ipvs相关内核模块# 如果重新开机,需要重新加载(可以写在 /etc/rc.local 中开机自动加载)modprobe ip_vsmodprobe ip_vs_rrmodprobe ip_vs_wrrmodprobe ip_vs_shmodprobe nf_conntrack_ipv4
# 查看是否加载成功lsmod | grep ip_vs
4. 执行以下命令,查看 kubeadm 对应的 k8s 组件镜像版本。
kubeadm config images list
返回如下结果,以下镜像都需下载。
k8s.gcr.io/kube-apiserver:v1.23.5k8s.gcr.io/kube-controller-manager:v1.23.5k8s.gcr.io/kube-scheduler:v1.23.5k8s.gcr.io/kube-proxy:v1.23.5k8s.gcr.io/pause:3.6k8s.gcr.io/etcd:3.5.1-0k8s.gcr.io/coredns/coredns:v1.8.6
5. 执行以下命令,拉取上述镜像。
kubeadm config images pull
拉取完成后,执行以下命令,查看镜像。
docker images
返回结果如下:
[root@VM-0-9-centos ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEk8s.gcr.io/kube-apiserver v1.23.5 3fc1d62d6587 4 weeks ago 135MBk8s.gcr.io/kube-proxy v1.23.5 3c53fa8541f9 4 weeks ago 112MBk8s.gcr.io/kube-controller-manager v1.23.5 b0c9e5e4dbb1 4 weeks ago 125MBk8s.gcr.io/kube-scheduler v1.23.5 884d49d6d8c9 4 weeks ago 53.5MBk8s.gcr.io/etcd 3.5.1-0 25f8c7f3da61 5 months ago 293MBk8s.gcr.io/coredns 1.8.6 a4ca41631cc7 6 months ago 46.8MBhello-world latest feb5d9fea6a5 6 months ago 13.3kBk8s.gcr.io/pause 3.6 6270bb605e12 7 months ago 683kB
配置 Kubelet(可选)
您可参考以下步骤,在云中心配置 Kubelet,验证 K8s 集群的部署是否正确。1. 执行以下命令,获取 Docker 的 cgroups。
DOCKER_CGROUPS=$(docker info | grep 'Cgroup' | cut -d' ' -f4)echo $DOCKER_CGROUPS
2. 执行以下命令,配置 kubelet 的 cgroups。
cat >/etc/sysconfig/kubelet<<EOFKUBELET_EXTRA_ARGS="--cgroup-driver=$DOCKER_CGROUPS --pod-infra-container-image=k8s.gcr.io/pause:3.1"EOF
3. 依次执行以下命令,启动 kubelet。
systemctl daemon-reload
systemctl enable kubelet && systemctl start kubelet
说明可通过 systemctl status kubelet
查看报错信息,该错误在运行 kubeadm init 生成 CA 证书后会被自动解决,此处可先忽略。
初始化集群
使用 kubeadm init
命令初始化集群,参数说明如下表:
参数 | 说明 |
--apiserver-advertise-address |
master 和 worker 间能互相通信的 IP |
--kubernetes-version |
指定版本 |
--token-ttl=0 |
token 永不过期 |
--apiserver-cert-extra-sans |
节点验证证书阶段忽略错误 |
注意初始化完成后需记录返回信息最后的 node 节点添加到集群的命令。同时支持使用 kubeadm token create --print-join-command
进行查看。若您使用了云服务器,则可删除 --apiserver-advertise-address
配置。成功初始化过程如下所示:
kubeadm init --kubernetes-version=v1.23.5 \ --pod-network-cidr=10.244.0.0/16 \ --apiserver-advertise-address= \ --ignore-preflight-errors=Swap
[root@VM-0-9-centos ~]# kubeadm init --kubernetes-version=v1.23.5 \> --pod-network-cidr=10.244.0.0/16 \> --ignore-preflight-errors=Swap[init] Using Kubernetes version: v1.23.5
...
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join :6443 --token 1tyany.dxr5ymxu2g3j0dzl \ --discovery-token-ca-cert-hash sha256:a63bd724813ebe0c4aabadb8cc8c747b6c84c474b80d4104497542ec265ec36a
配置 kubectl
依次执行以下命令,进一步配置 kubectl,完成 master 节点安装。
rm -rf $HOME/.kube
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
查看 node 节点
执行以下命令,查看 node 节点。
kubectl get node
返回结果如下所示:
NAME STATUS ROLES AGE VERSIONvm-0-9-centos NotReady control-plane,master 21m v1.23.5
配置网络插件 flannel(可选)
Kubernetes v1.17及以上版本,可使用以下命令安装 flannel。如需了解更多关于 flannel 信息,请参见 flannel Github。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
配置完成后,可依次执行以下命令进行查看。
kubectl get node -owide
kubectl get pods -n kube-system
kubectl get svc
返回结果如下所示:
[root@VM-0-9-centos ~]# kubectl get node -owideNAME STATUS ROLES AGE VERSIONvm-0-9-centos NotReady control-plane,master 31m v1.23.5[root@VM-0-9-centos ~]# kubectl get pods -n kube-systemNAME READY STATUS RESTARTS AGEcoredns-64897985d-9hfz2 0/1 Pending 0 31mcoredns-64897985d-9hr2z 0/1 Pending 0 31metcd-vm-0-9-centos 1/1 Running 0 31mkube-apiserver-vm-0-9-centos 1/1 Running 0 31mkube-controller-manager-vm-0-9-centos 1/1 Running 3 31mkube-flannel-ds-t4k2w 0/1 Init:ImagePullBackOff 0 50skube-proxy-c6mck 1/1 Running 0 31mkube-scheduler-vm-0-9-centos 1/1 Running 4 31m[root@VM-0-9-centos ~]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 443/TCP 32m
说明网络插件安装配置完成后,请等待几分钟,node 才会显示为 ready 状态。
配置 iptables 转发 IP
由于在初始化时删除了 --apiserver-advertise-address
参数,返回的节点加入集群命令为内网 IP,而本文中使用的云服务器内网不互通,故需配置 iptables 进行 IP 转发,将主节点公网 IP 转发至内网 IP,及配置 node 节点将主节点的内网 IP 转发至主节点的公网 IP。步骤如下:1. 在主节点 master 上,执行以下命令。
sudo iptables -t nat -A OUTPUT -d -j DNAT --to-destination
结合本文示例环境,则执行以下命令:
# cloudsudo iptables -t nat -A OUTPUT -d -j DNAT --to-destination
2. 在 node 节点上,执行以下命令。
sudo iptables -t nat -A OUTPUT -d -j DNAT --to-destination
结合本文示例环境,则执行以下命令:
# edgesudo iptables -t nat -A OUTPUT -d -j DNAT --to-destination
安装 KubeEdge
配置 Cloud
Cloud 端负责编译 KubeEdge 的相关组件与运行 cloudcore。配置步骤如下:1. 安装 golang
依次执行以下命令,下载并解压 golang 安装包。
wget https://golang.google.cn/dl/go1.18.1.linux-amd64.tar.gz
tar -zxvf go1.18.1.linux-amd64.tar.gz -C /usr/local
依次执行以下命令,修改 /etc/profile
文件配置 golang 环境。
cat >> /etc/profile << EOF# golang envexport GOROOT=/usr/local/goexport GOPATH=/data/gopathexport PATH=$PATH:$GOROOT/bin:$GOPATH/binEOF
mkdir -p /data/gopath && cd /data/gopath
mkdir -p src pkg bin
执行以下命令,使配置生效。
source /etc/profile
2. 执行以下命令,安装 Git。
yum install git
3. 执行以下命令,下载 KudeEdge 源码。
git clone https://github.com/kubeedge/kubeedge $GOPATH/src/github.com/kubeedge/kubeedge
部署 cloudcore
1. 依次执行以下命令,编译 kubeadm。
cd $GOPATH/src/github.com/kubeedge/kubeedge
make all WHAT=keadm
2. 执行以下命令,进入编译后的二进制文件目录 ./_output/local/bin
。
cd ./_output/local/bin
3. 执行以下命令,创建 cloud 节点。
./keadm init --advertise-address=""
返回结果如下所示:
[root@VM-0-9-centos kubeedge]# ./keadm init --advertise-address=""Kubernetes version verification passed, KubeEdge installation will start...
...
KubeEdge cloudcore is running, For logs visit: /var/log/kubeedge/cloudcore.logCloudCore started
4. 执行以下命令,查看 cloudcore 状态。
systemctl status cloudcore.service
配置 Edge
Edge 端也可以通过 keadm 进行配置,可以将 cloud 端编译生成的二进制可执行文件通过 scp 命令复制到 edge 端。步骤如下:1. 安装必要环境1.1 执行以下命令,查看操作系统版本。
uname -a
1.2 依次执行以下命令,树莓派需配置 ARMv6 版本的 golang 环境。
wget https://golang.google.cn/dl/go1.18.1.linux-armv6l.tar.gz
tar -zxvf go1.18.1.linux-armv6l.tar.gz -C /usr/local
1.3 执行以下命令,配置环境变量。
cat >> /home/pi/.bashrc << EOF# golang envexport GOROOT=/usr/local/goexport GOPATH=/data/gopathexport PATH=$PATH:$GOROOT/bin:$GOPATH/binEOF
1.4 执行以下命令,使配置生效。
source /home/pi/.bashrc
1.5 执行以下命令,安装 Git。
yum install git
1.6 执行以下命令,下载 KudeEdge 源码。
git clone https://github.com/kubeedge/kubeedge $GOPATH/src/github.com/kubeedge/kubeedge
2. 执行以下命令,在云端获取 token 令牌。token 令牌在加入边缘节点时使用。
./keadm gettoken
返回结果如下所示:
b6107885645ec34725a76e7cf3fd9d8bf130dfa5e6f37d4c51b6bc1bee49cd48.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTA2MjE0MDR9.ZMtQnF_oWYG4pijYO-SaxVtUYhHQSuCIauf5iWFkNMY
3. 部署 edgecore
依次执行以下命令,编译 keadm。
cd $GOPATH/src/github.com/kubeedge/kubeedge
make all WHAT=keadm
cd ./_output/local/bin
通过 keadm join
命令安装 edgecore 和 mqtt。它还提供了一个标志,通过它可以设置特定的版本。
./keadm join --cloudcore-ipport=:10000 --token=9c71cbbb512afd65da8813fba9a48d19ab8602aa27555af7a07cd44b508858ae.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTA3MDgwNjN9.-S0YBgSSAz6loQsi0XaTgFeWyHsHDm8E2SAefluVTJAHost has /usr/sbin/mosquitto already installed and running. Hence skipping the installation steps !!!
...
KubeEdge edgecore is running, For logs visit: journalctl -u edgecore.service -xe
注意--cloudcore-ipport
标志是强制性标志。--token
会自动为边缘节点应用证书。云和边缘端使用的 kubeEdge 版本应相同。4. 验证
边缘端在启动 edgecore 后,会与云端的 cloudcore 进行通信,K8s 进而会将边缘端作为一个 node 纳入 K8s 的管控。结果如下所示:
[root@VM-0-9-centos bin]# kubectl get nodeNAME STATUS ROLES AGE VERSIONberbai02 Ready agent,edge 32m v1.22.6-kubeedge-v1.10.0demo Ready agent,edge 34m v1.22.6-kubeedge-v1.10.0vm-0-9-centos Ready control-plane,master 27h v1.23.5[root@VM-0-9-centos bin]# kubectl get pods -n kube-systemNAME READY STATUS RESTARTS AGEcoredns-64897985d-9hfz2 1/1 Running 2 (69m ago) 27hcoredns-64897985d-9hr2z 1/1 Running 2 (69m ago) 27hetcd-vm-0-9-centos 1/1 Running 2 (69m ago) 27hkube-apiserver-vm-0-9-centos 1/1 Running 2 (69m ago) 27hkube-controller-manager-vm-0-9-centos 1/1 Running 13 (69m ago) 27hkube-flannel-ds-hsss5 0/1 Error 10 (2m23s ago) 34mkube-flannel-ds-qp6xj 0/1 Error 9 (4m46s ago) 36mkube-flannel-ds-t4k2w 1/1 Running 2 (69m ago) 27hkube-proxy-6qcfb 0/1 ContainerCreating 0 34mkube-proxy-c6mck 1/1 Running 2 (69m ago) 27hkube-proxy-hvpz9 1/1 Running 0 36mkube-scheduler-vm-0-9-centos 1/1 Running 14 (69m ago) 27h
说明若您在 K8s 集群中配置了 flannel 网络插件,则由于 edge 节点未部署 kubelet,调度到 edge 节点上的 flannel pod 会创建失败。这不影响 KubeEdge 的使用,可忽略该问题。
云边协同实例
KubeEdge Counter Demo 计数器是一个伪设备,用户无需任何额外的物理设备即可运行此演示。计数器在边缘侧运行,用户可以从云侧在 Web 中对其进行控制,也可以从云侧在 Web 中获得计数器值。1. 执行以下命令,下载源码。
git clone https://github.com/kubeedge/examples.git $GOPATH/src/github.com/kubeedge/examples
2. 依次执行以下命令,创建 device model。
cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
kubectl create -f kubeedge-counter-model.yaml
3. 依次执行以下命令,创建 device,并根据实际情况修改 matchExpressions。
cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
# 替换 "demo" 为您的 edge 节点名称sed -i "s#edge-node#demo#" kubeedge-counter-instance.yaml
kubectl create -f kubeedge-counter-instance.yaml
4. 部署云端应用4.1 依次执行以下命令,修改代码。云端应用 web-controller-app 用来控制边缘端的 pi-counter-app 应用,该程序默认监听的端口号为80,此处修改为8989。
cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/web-controller-app
sed -i "s#80#8989#" main.go
4.2 依次执行以下命令,构建镜像。注意构建镜像时,如果开启了 go mod,则请关闭。
make
make docker
4.3 依次执行以下命令,部署 web-controller-app。
cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
kubectl create -f kubeedge-web-controller-app.yaml
5. 部署边缘端应用
边缘端的 pi-counter-app 应用受云端应用控制,主要与 mqtt 服务器通信,进行简单的计数功能。5.1 依次执行以下命令,构建镜像。
cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/counter-mapper
make
make docker
5.2 依次执行以下命令,部署 pi-counter-app。
cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
kubectl create -f kubeedge-pi-counter-app.yaml
为防止 Pod 的部署卡在 ContainerCreating,请依次执行以下命令,直接通过 docker save、scp 和 docker load 命令将镜像发布到边缘端。
docker save -o kubeedge-pi-counter.tar kubeedge/kubeedge-pi-counter:v1.0.0
scp kubeedge-pi-counter.tar root@:/root
docker load -i kubeedge-pi-counter.tar
6. 查看运行效果
KubeEdge Demo 的云端部分和边缘端的部分都已经部署完毕,如下所示:
[root@VM-0-9-centos crds]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESkubeedge-counter-app-55848d84d9-545kh 1/1 Running 0 27m vm-0-9-centos kubeedge-pi-counter-54b7997965-t2bxr 1/1 Running 0 31m demo
6.1 执行 ON 命令在 Web 页面上选择 ON,并单击 Execute,可以在 edge 节点上通过以下命令查看执行结果:
# 修改 counter-container-id 为kubeedge-pi-counter容器iddocker logs -f counter-container-id
返回结果如下图所示:

6.2 查看 counter STATUS
在 Web 页面上选择 STATUS,并单击 Execute,会在 Web 页面上返回 counter 当前的 status。如下图所示:

6.3 执行 OFF 命令
在 Web 页面上选择 OFF,并单击 Execute,可以在 edge 节点上通过以下命令查看执行结果:
# 修改 counter-container-id 为kubeedge-pi-counter容器iddocker logs -f counter-container-id
返回结果如下图所示:

GPU云服务器官网1折活动,限时活动,即将结束,速速收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利。同意关联立享优惠
转转请注明出处:https://www.yunxiaoer.com/137090.html