從 docker 到 kubeedge

一、理論

技術背景

首先,雲計算發展史其實就是虛擬化技術的發展史,技術逐漸成熟,並開始被應用到社會各個方面,成爲全社會通用的技術基礎,並開 始全面改變傳統的產業結構。如下圖所示,我們從中需要重點關注的是與我們今天所講的主題息息相關的三種技術:Docker, Kubernetes, 以及 Kubeedge。那麼我們今天就從這三者開始。

Why Docker ?

2013 年的雲計算服務,比的就是誰能更好地模擬本地服務器環境,能帶來更好的 “上雲” 體驗。而 PaaS 開源項目的出現,就是當時解決這個問題的一個最佳方案。PaaS 項目被大家接納的一個主要原因,就是它提供了一種名叫 “應用託管” 的能力。 在當時,虛擬機和雲計算已經是比較普遍的技術和服務了,那時主流用戶的普遍用法,就是租一批 AWS 或者 OpenStack 的虛擬機,然後像以前管理物理服務器那樣,用腳本或者手工的方式在這些機器上部署應用。Docker 項目確實與 Cloud  Foundry 的容器在大部分功能和實現原理上都是一樣的,可偏偏就是這剩下的一小部分不一樣的功能,成了 Docker 項目接下來 “呼風喚雨” 的不二法寶。這個功能,就是 Docker 鏡像。Docker 項目通過 “容器鏡像”,解決了應用打包這個根本性難題。而 docker 容器鏡像使用的是 Linux 的 rootfs。它只是一個操作系統的所有文件和目錄,並不包含內核,最多也就幾百兆。而相比之下,傳統虛擬機的鏡像大多是一個磁盤的 “快照”,磁盤有多大,鏡像就至少有多大。

Why  Kubernetes?
  1. 沒辦法管理 “有狀態” 的容器

  2. 如何處理多個容器之間的依賴關係

過去很多的集羣管理項目(比如 Yarn、Mesos,以及 Swarm)所擅長的,都是把一個容器,按照某種規則,放置在某個最佳節點上運行起來。這種功能,我們稱爲 “調度”。而 Kubernetes 項目所擅長的,是按照用戶的意願和整個系統的規則,完全自動化地處理好容器之間的各種關係。這種功能,就是我們經常聽到的一個概念:編排。所以說,Kubernetes 項目的本質,是爲用戶提供一個具有普遍意義的容器編排工具。不過,更重要的是,Kubernetes 項目爲用戶提供的不僅限於一個工具。它真正的價值,乃在於提供了一套基於容器構建分佈式系統的基礎依賴。現在,k8s 已經逐漸演進爲雲原生下的” 操作系統”。操作系統一般有存儲,網絡,進程管理,進程調度,系統調用 api 等功能。類似的 k8s 也提供了雲原生下的存儲,調度,網絡,聲明式 api。而且還帶有一些運維能力,比如備份,擴縮容,負載均衡等。實現這種能力的的核心就是 k8s 定義的下圖中的的 API 對象。

Why Kubeedge?

從雲端走向邊緣場景

雲計算 / Kubernetes 的問題:

Kubeedge特點以及優勢

章魚式邊緣計算模型

基本概念

官網架構
cloudcore
edged
eventbus

Eventbus 充當用於發送 / 接收有關 mqtt 主題的消息的接口

它支持三種模式:

metamanager

MetaManager 是 edged 和 edgehub 之間的消息處理器。它還負責將元數據存儲到輕量級數據庫(SQLite)或從中檢索元數據。

Metamanager 根據以下列出的操作接收不同類型的消息:

Edgehub

Edge Hub 負責與雲中存在的 CloudHub 組件進行交互。它可以使用 Web 套接字連接或 QUIC 協議連接到 CloudHub 。它支持同步雲端資源更新,報告邊緣端主機和設備狀態更改等功能。

它充當邊緣與雲之間的通信鏈接。它將從雲接收的消息轉發到邊緣的相應模塊,反之亦然。

edgehub 執行的主要功能是:

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. 環境配置
# 將 /etc/fstab 中的swap相關信息註釋掉
sudo sed -i 's/.*swap.*/#&/' /etc/fstab
# 註釋掉/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
**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時,系統啓動時激活此設備**
# 安裝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
# /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. 安裝部署
# 執行配置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
# 下載管理節點中用到的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

Centos 部署 Kubeedge

1. 配置環境
# 下載解壓
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
yum -y install wget
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-v1.8.2-linux-amd64/keadm/keadm init --advertise-address="192.168.137.246" --kubeedge-version="1.8.2"
tail -f  /var/log/kubeedge/cloudcore.log
keadm gettoken
# 編輯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-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
# 修改配置
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
$ scp -r root@10.1.240.80:/root/images .

三、實踐

此處省略 N 步操作

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/GUpbau8n-wxPIDVIkcvhKQ