從 docker 到 kubeedge
Rlink 網關容器化與邊緣計算
一、理論
技術背景
首先,雲計算發展史其實就是虛擬化技術的發展史,技術逐漸成熟,並開始被應用到社會各個方面,成爲全社會通用的技術基礎,並開 始全面改變傳統的產業結構。如下圖所示,我們從中需要重點關注的是與我們今天所講的主題息息相關的三種技術:Docker, Kubernetes, 以及 Kubeedge。那麼我們今天就從這三者開始。
Why Docker ?
2013 年的雲計算服務,比的就是誰能更好地模擬本地服務器環境,能帶來更好的 “上雲” 體驗。而 PaaS 開源項目的出現,就是當時解決這個問題的一個最佳方案。PaaS 項目被大家接納的一個主要原因,就是它提供了一種名叫 “應用託管” 的能力。 在當時,虛擬機和雲計算已經是比較普遍的技術和服務了,那時主流用戶的普遍用法,就是租一批 AWS 或者 OpenStack 的虛擬機,然後像以前管理物理服務器那樣,用腳本或者手工的方式在這些機器上部署應用。Docker 項目確實與 Cloud Foundry 的容器在大部分功能和實現原理上都是一樣的,可偏偏就是這剩下的一小部分不一樣的功能,成了 Docker 項目接下來 “呼風喚雨” 的不二法寶。這個功能,就是 Docker 鏡像。Docker 項目通過 “容器鏡像”,解決了應用打包這個根本性難題。而 docker 容器鏡像使用的是 Linux 的 rootfs。它只是一個操作系統的所有文件和目錄,並不包含內核,最多也就幾百兆。而相比之下,傳統虛擬機的鏡像大多是一個磁盤的 “快照”,磁盤有多大,鏡像就至少有多大。
Why Kubernetes?
-
沒辦法管理 “有狀態” 的容器
-
如何處理多個容器之間的依賴關係
過去很多的集羣管理項目(比如 Yarn、Mesos,以及 Swarm)所擅長的,都是把一個容器,按照某種規則,放置在某個最佳節點上運行起來。這種功能,我們稱爲 “調度”。而 Kubernetes 項目所擅長的,是按照用戶的意願和整個系統的規則,完全自動化地處理好容器之間的各種關係。這種功能,就是我們經常聽到的一個概念:編排。所以說,Kubernetes 項目的本質,是爲用戶提供一個具有普遍意義的容器編排工具。不過,更重要的是,Kubernetes 項目爲用戶提供的不僅限於一個工具。它真正的價值,乃在於提供了一套基於容器構建分佈式系統的基礎依賴。現在,k8s 已經逐漸演進爲雲原生下的” 操作系統”。操作系統一般有存儲,網絡,進程管理,進程調度,系統調用 api 等功能。類似的 k8s 也提供了雲原生下的存儲,調度,網絡,聲明式 api。而且還帶有一些運維能力,比如備份,擴縮容,負載均衡等。實現這種能力的的核心就是 k8s 定義的下圖中的的 API 對象。
Why Kubeedge?
從雲端走向邊緣場景
:
-
低延時要求。AR/VR 的時延要求是 ms 級,工業控制的時延更是在 us 級。
-
高可靠性。具體表現爲:>99.999% 的可用性,響應時間可預測,響應結果可重複等。
-
本地自治。要求邊緣側可適應偶爾斷網,或者直接本地自治。
-
海量數據和有限帶寬的矛盾。設備側將產生海量數據,而以目前的帶寬還無法承載這數據量。另外一個事實就是,很多數據沒有全局價值,沒有必要浪費帶寬上傳到雲端。
-
信息安全。考慮到商業密碼和個人隱私,很多機構和個人並不願意把數據傳輸到雲端。
雲計算 / Kubernetes 的問題:
-
雲中心存算壓力大 雲 - 端二元模式,數據集中存算,在業務高峯 時,中心計算帶寬、傳輸帶寬快速消耗殆盡, 數據大量積壓而無法及時處理、有效利用
-
端 - 雲網絡鏈路不可控 一旦網絡抖動、鏈路故障甚至前端斷網,業務數據無法及時上傳中心,中心指令無法及時下 達路口,導致路口智能程度顯著降級
-
業務迭代升級慢 創新型的雲端業務需在實戰中反覆打磨。傳統穩態 IT 架構難以承載快速迭代帶來的維護調試 工作量
-
優化效果難評價 欠缺對業務優化效果的評價依據和手段,建設 成效難以進行客觀量化評估
Kubeedge特點以及優勢
-
KubeEdge 構建在 Kubernetes 之上,100% 兼容 K8S API,可以使用 K8S API 原語管理邊緣節點和設備;
-
爲了讓 K8S 應用能夠跑在邊緣上,深度定製和優化了 runtime;
-
爲了應對邊緣側的網絡不穩定因素,設計了可靠的消息通道;
-
邊緣適應本地自治;
-
豐富的應用和協議支持;
-
大大簡化了設備的接入複雜度;
章魚式邊緣計算模型
基本概念
官網架構
Rlink-Kubeedge 架構
cloudcore
-
CloudHub:雲中的通信接口模塊。- EdgeController:管理 Edge 節點。- devicecontroller 負責設備管理。
-
edgecore:- Edged:在邊緣管理容器化的應用程序。- EdgeHub:Edge 上的通信接口模塊。- EventBus:使用 MQTT 處理內部邊緣通信。- DeviceTwin:它是用於處理設備元數據的設備的軟件鏡像。- MetaManager:它管理邊緣節點上的元數據。- ServiceBus: 接收雲上服務請求和邊緣應用進行 http 交互
edged
-
EdgeD 是管理節點生命週期的邊緣節點模塊。它可以幫助用戶在邊緣節點上部署容器化的工作負載或應用程序。這些工作負載可以執行任何操作,從簡單的遙測數據操作到分析或 ML 推理等。使用 kubectl 雲端的命令行界面,用戶可以發出命令來啓動工作負載。Docker 容器運行時當前受容器和鏡像管理支持。將來應添加其他運行時支持,例如 containerd 等。有許多模塊協同工作以實現 edged 的功能。
-
pod 管理用於 pod 的添加刪除修改, 它還使用 pod status manager 和 pleg 跟蹤 pod 的運行狀況。其主要工作如下:
-
從 metamanager 接收和處理 pod 添加 / 刪除 / 修改消息
-
處理單獨的工作隊列以添加和刪除容器。
-
處理工作程序例程以檢查工作程序隊列以執行 pod 操作。
-
分別爲 config map 和 secrets 保留單獨的的緩存。
-
定期清理孤立的 pod
-
Pod 生命週期事件生成器
-
CRI 邊緣化
-
secret 管理
-
Probe Management
-
ConfigMap Management
-
Container GC
-
Image GC
-
Status Manager
-
卷管理
-
MetaClient
eventbus
Eventbus 充當用於發送 / 接收有關 mqtt 主題的消息的接口
它支持三種模式:
-
internalMqttMode
-
externalMqttMode
-
bothMqttMode
metamanager
MetaManager 是 edged 和 edgehub 之間的消息處理器。它還負責將元數據存儲到輕量級數據庫(SQLite)或從中檢索元數據。
Metamanager 根據以下列出的操作接收不同類型的消息:
-
Insert
-
Update
-
Delete
-
Query
-
Response
-
NodeConnection
-
MetaSync
Edgehub
Edge Hub 負責與雲中存在的 CloudHub 組件進行交互。它可以使用 Web 套接字連接或 QUIC 協議連接到 CloudHub 。它支持同步雲端資源更新,報告邊緣端主機和設備狀態更改等功能。
它充當邊緣與雲之間的通信鏈接。它將從雲接收的消息轉發到邊緣的相應模塊,反之亦然。
edgehub 執行的主要功能是:
-
Keep Alive
-
Publish Client Info
-
Route to Cloud
-
Route to Edge
DeviceTwin
DeviceTwin 模塊負責存儲設備狀態,處理設備屬性,處理設備孿生操作,在邊緣設備和邊緣節點之間創建成員資格, 將設備狀態同步到雲以及在邊緣和雲之間同步設備孿生信息。它還爲應用程序提供查詢接口。DeviceTwin 由四個子模塊(即 membership,communication,device 和 device twin)組成,以執行 device twin 模塊的職責。
Edge Controller
EdgeController 是 Kubernetes Api 服務器和 Edgecore 之間的橋樑
CloudHub
CloudHub 是 cloudcore 的一個模塊,是 Controller 和 Edge 端之間的中介。它同時支持基於 Web 套接字的連接以及 QUIC 協議訪問。Edgehub 可以選擇一種協議來訪問 cloudhub。CloudHub 的功能是啓用邊緣與控制器之間的通信。
Device Controller
通過 k8s CRD 來描述設備 metadata/status ,devicecontroller 在雲和邊緣之間同步,有兩個 goroutines: upstream controller
/downstream controller
二、部署
Centos 部署 Kubernetes
1. 環境配置
- 關閉 swapoff 交換分區
# 將 /etc/fstab 中的swap相關信息註釋掉
sudo sed -i 's/.*swap.*/#&/' /etc/fstab
- 禁用 selinux
# 註釋掉/etc/selinux/config中的相關信息
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
- 關閉防火牆
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service
- 編輯網絡配置(非必須)
vim /etc/sysconfig/network-scripts/ifcfg-ens32
**DEVICE=eth0 #描述網卡對應的設備別名**
**BOOTPROTO=static #設置網卡獲得ip地址的方式,選項可以爲爲static,dhcp或bootp**
**BROADCAST=192.168.1.255 #對應的子網廣播地址**
**HWADDR=00:07:E9:05:E8:B4 #對應的網卡物理地址**
**IPADDR=12.168.1.80 #只有網卡設置成static時,才需要此字段**
**NETMASK=255.255.255.0 #網卡對應的網絡掩碼**
**NETWORK=192.168.1.0 #網卡對應的網絡地址,也就是所屬的網段**
**ONBOOT=yes #系統啓動時是否設置此網絡接口,設置爲yes時,系統啓動時激活此設備**
- 安裝 doker 的虛擬網絡環境
# 安裝docker所需的工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置阿里雲的docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 指定安裝這個版本的docker-ce
yum install -y docker-ce-18.09.9-3.el7
# 啓動docker
systemctl enable docker && systemctl start docker
# 配置docker的cgroup
vim/etc/docker/daemon.json
# 添加如下配置
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
# 查看docker的信息保證cgroup是需要的設置的
docker info
# 附:查看kubelet的cgroup信息
cat /var/lib/kubelet/config.yaml |grep group
- 設置 ipv4 流量橋接
# /etc/sysctl.d/k8s.conf這個文件是不存在的,所以如果用vim的方式的話則直接創建這個文件並編輯
cat <<EOF > /etc/sysctl.d/k8s.conf
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
EOF
# 重新加載
sysctl --system
2. 安裝部署
- 添加 kubernetes 的鏡像源
# 執行配置k8s阿里雲源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 安裝kubeadm、kubectl、kubelet
yum install -y kubectl-1.18.8 kubeadm-1.18.8 kubelet-1.18.8
# 啓動kubelet服務
systemctl enable kubelet && systemctl start kubelet
- 初始化 master 節點
# 下載管理節點中用到的6個docker鏡像,你可以使用docker images查看到
# 這裏需要大概兩分鐘等待,會卡在[preflight] You can also perform this action in beforehand using ''kubeadm config images pull
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.16.0 --apiserver-advertise-address 192.168.137.246 --pod-network-cidr=10.244.0.0/16 --token-ttl 0
- 成功標誌
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
# 初始化配置kubectl的環境
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
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:
# 使用該命令將工作節點加入此master之中
kubeadm join 192.168.137.246:6443 --token j4sv99.plfbibaqxh6lrqbq \
--discovery-token-ca-cert-hash sha256:4b77992d15386d9bb97ce6e97ce8d4b9891689b56ca87bc84a967d60dc48cbbf
# token有效期爲24小時,如果過期使用命令
kubeadm token create --ttl 0
kubeadm token list
- 節點的網橋設置
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
- master 安裝網絡插件 flannel, 國內 flannel 的鏡像源可能找不到,改成以下的配置
略
Centos 部署 Kubeedge
1. 配置環境
- 安裝 golang 的環境
# 下載解壓
wget https://golang.google.cn/dl/go1.14.4.linux-amd64.tar.gz
tar -zxvf go1.14.4.linux-amd64.tar.gz -C /usr/local
# 配置環境變量
vim /etc/profile
# golang env
export GOROOT=/usr/local
export GOPATH=/data/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
# 生效
source /etc/profile
- keadm 需要使用 wget 獲取設備表的 yaml 文件
yum -y install wget
- 解析 github 下載鏡像需要的 dns
vim /etc/sysconfig/network-scripts/ifcfg-ens32
# 加入百度的dns服務器和阿里的dns服務器地址
DNS1=180.76.76.76
DNS2=223.5.5.5
DNS3=8.8.8.8
# 配置已經啓動的dns
vim /etc/resolv.conf
namespace 223.5.5.5
namespace 8.8.8.8
namespace 180.76.76.76
# 重啓網絡服務
service network restart
2. 部署 cloudcore
- 下載 keadm 並初始化 cloudcore 部分
./keadm-v1.8.2-linux-amd64/keadm/keadm init --advertise-address="192.168.137.246" --kubeedge-version="1.8.2"
- 查看 cloudcore 的日誌
tail -f /var/log/kubeedge/cloudcore.log
- 獲取 token
keadm gettoken
- 配置使用的 cgroup 和 k8s 保持一致
# 編輯cloudcore的配置
vim /etc/kubeedge/config/cloudcore.yaml
# 1. 修改dynamicController支持edgecore的listwatch監聽
dynamicController:
- enable: false
+ enable: true # 開啓dynamicController以支持edgecore的listwatch功能
# 雲側cloudcore可以直接通過systemd管理
# 拷貝cloudcore.service到/usr/lib/systemd/system
$ cp /etc/kubeedge/cloudcore.service /usr/lib/systemd/system
# 殺掉當前cloudcore進程
$ pkill -9 cloudcore
$ systemctl restart cloudcore
# 查看cloudcore是否運行
$ systemctl status cloudcore
3. 部署 edgecore
- 下載 keadm 加入 cloud, 同樣需要網絡下載
./keadm-v1.8.2-linux-amd64/keadm/keadm join --cloudcore-ipport=192.168.137.246:10000 --token=14b135ddf60b79568acbccda3d10f7143498d628ec67abdf40c13835afe9d853.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MzU1MTk4MjV9.qV-NeeTtKQdthAWdAAuYwxXSFIqzLuY6nFzKPMfrkHs
- 查看節點日誌
journalctl -u edgecore.service -b
- 修改 edge 端的 cgroup
# 修改配置
vim /etc/kubeedge/config/edgecore.yaml
# 1. 開啓listwatch機制
modules:
enable: true
metaServer:
debug: false-
enable: false+
enable: true # 開啓listwatch
# 2.修改cgroup edged:
cgroupDriver: systemd # 修改爲和cloud一致的cgroup
# 殺掉當前edgecore進程
pkill edgecore
# 重啓edgecore
systemctl restart edgecore
- 完成所有部署搭建的 vmware 虛擬機資機器文件在 10.1.240.80 的
/root/images
目錄下 可以使用下面命令或者工具進行下載。其中虛擬機使用的是 nat 網絡共享宿主機 192.168.137.0 網段數據,三臺機器 ip 分別爲 192.168.137.246, 192.168.137.248, 192.168.137.250。246 爲 k8s 的,master 節點和 kubeedge 的 cloud 節點,248 爲 k8s 的 worker 節點,250 爲 kubeedge 的 edge 節點。
$ scp -r root@10.1.240.80:/root/images .
三、實踐
此處省略 N 步操作
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/GUpbau8n-wxPIDVIkcvhKQ