KubeEdge 备忘录 2020-10-20 日常 暂无评论 1132 次阅读 # 准备 1. Win10的Linux子系统:WSL2 + Ubuntu 20.04 LTS 2. Go语言+[tools](https://www.proup.club/usr/uploads/2020/10/3386799872.zip) - tools 解压放到`$GOPATH/src/golang.org/x/tools` 3. Docker + Kubernetes # 依赖 - 云: - Kubernets Master Node - 端: - Docker - mosquitto(MQTT)(可选) # 计划 ## 路线 1. 先用现成的 2. 再自己编译 3. 修改 ## 硬件 云和边都用WSL2 Ubuntu子系统。 # 背景知识 ## Kubernetes - kubernetes - 简称K8s,是用8代替8个字符“ubernete”而成的缩写。 - 是一个开源的,用于管理**云平台**中多个主机上的容器化的应用 - 提供了应用部署,规划,更新,维护的一种机制。 ## KubeEdge与k3s 参考:[KubeEdge vs K3S:Kubernetes在边缘计算场景的探索](https://zhuanlan.zhihu.com/p/65131381) - k8s是专为“云”开发的,不适合用在“边缘”,原因是: - IoT/Edge领域多用ARM结构,然而k8s大部分版本不支持ARM架构 - 边缘设备资源有限,特别CPU处理能力弱,无法部署完整的k8s - k8s非常依赖list/watch机制,不支持离线运行,而边缘节点的离线又是常态。例如:设备休眠重启 - k8s的运维,相对于边缘场景用到的功能子集 还是太复杂了 - 特殊的网络协议和拓扑要求。设备接入协议往往非TCP/IP协议 - 设备多租(一台边缘服务器租给多个人用) - k3s:裁剪k8s功能,让边缘部署裁剪后k8s的完整集群 - KubeEdge:云端部署k8s的管理面,边缘只部署k8s的agent - KubeEdge与kubernetes的耦合仅仅是100%兼容kubernetes原生API # 基本操作 ## Kubernetes(K8s) 管理容器集群用的。 由于KubeEdge只是100%兼用K8s的API,并不是依赖K8s,所以K8s只要知道怎么用,就行了,不需要看K8s的实现。 ![](https://www.proup.club/usr/uploads/2020/10/1235999028.png) 一个*部署* + 一群*节点* Master 调度整个集群 Nodes 负责运行应用 ### minikube Minikube 是一种轻量级的 Kubernetes 实现,作用是在本地计算机上创建 VM 并部署仅包含一个节点的简单集群 显示minikube版本:`minikube version` 启动minikube:`minikube start` ### kubectl kubectl 用来控制Kubernetes 。 显示kubectl版本:`kubectl version` 查看kubernetes中的节点:`kubectl get nodes` ``` $ kubectl version Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.3", GitCommit:"06ad960bfd03b39c8310aaf92d1e7c12ce618213", GitTreeState:"clean", BuildDate:"2020-02-11T18:14:22Z", GoVersion:"go1.13.6", Compiler:"gc", Platform:"linux/amd64"} The connection to the server 172.17.0.18:8443 was refused - did you specify the right host orport? $ kubectl get nodes NAME STATUS ROLES AGE VERSION minikube Ready master 101s v1.17.3 ``` --------- 用kubectl创建一个部署,就能自动在节点中部署应用:`kubectl create deployment 部署名 --image=应用的镜像地址` >- 自动找到可用的节点 - 自动调度应用在节点中的运行 - 在需要的时候,自动把这个应用实例调度到其他节点 ``` $ kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 deployment.apps/kubernetes-bootcamp created ``` ---------- 查看kubectl总共部署了哪些应用:`kubectl get deployments` ``` $ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 1/1 1 1 7m1s ``` ------- 在节点中运行的应用,称作*Pod*。 Pod默认是运行在Kubernetes集群的内网里,只能被Kubernetes的其他节点发现,不能被外网发现。 - kubectl 能通过API,直接于Pod通信。 - kubectl 能创建代理,在集群内网里通信 - 开一个proxy服务端 - 别的节点访问http://localhost:8001/version ,就相当于服务端执行version,再把结果返回回去。 - 服务端只输出一个服务url,其他什么都不输出。 kubectl创建代理:`kubectl proxy` -------- 获取 *Pod* 的 endpoint ,存到环境变量里: ``` $ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') $ echo Name of the Pod: $POD_NAME Name of the Pod: kubernetes-bootcamp-69fbc6f4cf-lc9s2 ``` ## kind 创建k8s集群 `kind create cluster` # 踩坑 ## Docker for Windows开启Kubernets一直starting 检查你从GitHub下载的Kubernetes的版本,与Docker for Windows的Kubernetes版本,一不一样。 ## WSL的Ubuntu运行systemctl WSL的Ubuntu默认是不给用systemctl的。 ``` pro@LAPTOP-NI4DNH6I:~$ systemctl System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down ``` 解决方法: ``` sudo apt install daemonize sudo ln -fs /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME ``` ## WSL的Ubuntu的/etc/profile改坏了 如果是WSL2,那么在文件管理器访问`\\wsl$`,就是WSL的Ubuntu的根目录。 要是是WSL1,那就在`C:\Users\92897\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\rootfs`里。 WSL1升WSL2:`wsl --set-version Ubuntu-20.04 2` ## ~~Hyper-V虚拟机联网~~ Hyper-V装的Ubuntu20.04-server,是没有网,不能用apt-get,也没有ifconfig和rpm。 输入`ip a`可以看当前有哪些网。(只有一个回环地址和一个广播地址) 1. Hyper-V管理界面右侧,“虚拟交换机管理器”,新建一个**外部**虚拟交换机 2. 切换到root用户,到`/etc/netplan/`文件夹,里面有一个xxx.yaml,编辑这个yaml文件。之后连Wifi也是要手动改这个文件。但现在不能改,因为系统还没有WPA2加密工具,不但WIFI连不上,而且开机的时候还得等两次1分30秒来尝试连WIFI。 ``` network: ethernets: eth0: dhcp4: true optional: true version: 2 ``` 要严格按照这个缩进,而且冒号后面要有一个空格,否则下一步会报错 3. 输入`netplan apply`命令,然后`reboot`重启。 4. **现在就能用apt-get了**。这时候可以更新一下软件源。[Ubuntu清华源](https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/) 5. 安装WPA2加密工具 ``` sudo apt-get install wpasupplicant network-manager ``` 6. 切换到root用户,到`/etc/netplan/`文件夹,里面有一个xxx.yaml,编辑这个yaml文件 ``` network: ethernets: eth0: dhcp4: true optional: true version: 2 wifis: wlan0: dhcp4: true access-points: "你的wifi的ssid": password: "wifi密码" ``` ## 编译cloudcore时报错failed to create new OS thread 完整报错提示是: ``` pro@LAPTOP-NI4DNH6I:~/gocode/src/github.com/kubeedge/kubeedge$ make all WHAT=cloudcore bash hack/verify-golang.sh go detail version: go version go1.15.3 linux/amd64 go version: 1.15.3 hack/make-rules/build.sh cloudcore building github.com/kubeedge/kubeedge/cloud/cmd/cloudcore + go build -o /home/pro/gocode/src/github.com/kubeedge/kubeedge/_output/local/bin/cloudcore -gcflags= -ldflags '-s -w -buildid= -X github.com/kubeedge/kubeedge/pkg/version.buildDate=2020-10-22T08:57:06Z -X github.com/kubeedge/kubeedge/pkg/version.gitCommit=c80ffce0dc75b69e98391214a6460da6f7f2cfbf -X github.com/kubeedge/kubeedge/pkg/version.gitTreeState=clean -X github.com/kubeedge/kubeedge/pkg/version.gitVersion=v1.4.0-beta.0.218+c80ffce0dc75b6 -X github.com/kubeedge/kubeedge/pkg/version.gitMajor=1 -X github.com/kubeedge/kubeedge/pkg/version.gitMinor=4+' github.com/kubeedge/kubeedge/cloud/cmd/cloudcore # k8s.io/client-go/informers/coordination runtime: failed to create new OS thread (have 11 already; errno= + set +x ``` 解决办法: 1. 安装upx-ucl `sudo apt install upx-ucl` 2. 编译smallbuild `make smallbuild` 3. 最后再编译cloudcore,就不报错了。 编译出来的可执行文件是在`_output/local/bin/`里。 例如编译cloudcore,就是`_output/local/bin/cloudcore`。 标签: none 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭