k8s容器平臺架構淺析

行業背景

Docker自2013年發行以來,得到了飛速的發展,直至今日已經成爲了基礎架構中必不可缺的一份子,也是構建企業雲平臺的有效手段。而作爲容器編排及管理的利器的kubernetes,已經與docker緊緊綁在一起,K8S對docker提供了更加原生的支持,同時提供了資源調度、容器生命週期管理、負載均衡、彈性伸縮、高可用等底層功能。

Docker基本概念

Docker簡單理解其實就是運行在linux上的虛擬機,但是又和傳統的虛擬機有所不同,docker相比虛擬機更加輕量,對資源的利用更高,最大的一個特點就是docker不需要在宿主機上虛擬出一個虛擬機操作系統,多個docker共享宿主機的linux內核,相比虛擬機性能更好。還有一點,docker可以將應用程序和依賴的庫文件一起打包入鏡像,這個鏡像就是應用的完整的運行時環境,這樣大大簡化了應用發佈及遷移的流程。

K8S核心技術

對於初學者來說可能覺得k8s的技術複雜,但其實k8s並沒有什麼核心技術,k8s只是一個工具實現了我們資源可控、網絡隔離、彈性伸縮、快速部署等功能。它其實就是將操作系統的一些命令或者功能封裝進k8s裏幫助我們實現上面的功能。比如通過操作系統cgroup實現容器的資源隔離和限制,通過iptables,lvs實現端口映射和流量轉發,數據庫使用成熟的分佈式存儲etcd,flannel網絡其實也只是在真實物理網絡上虛擬出來的overlay網絡,持久化卷也是基於外部的ceph或者nfs、gluserfs或者本地盤等物理存儲構建。所以我們看,k8s就是將需要的技術做了整合,實現的集羣的管理。

K8S架構

好了,廢話不多說,下面簡單介紹一下docker及k8s的架構及組網理念。
Docker的話其實沒什麼好說的,有鏡像、倉庫、容器等基本概念。對於docker我們掌握一些基本命令就行,主要參考下面這個圖:
在這裏插入圖片描述
我們可以簡單看看docker的網絡,當創建一個docker時會在操作系統上創建一個網橋,網橋也就是虛擬軟交換機,這個虛擬交換機將宿主機物理網口和容器的網口互聯起來,構成局域網。

在這裏插入圖片描述

下面我們再看看k8s架構,k8s集羣由master和node節點組成,master由如下組件組成:APIserver+scheduler+controller manager+etcd,node節點由kubelet+kube-proxy+pod組成

在這裏插入圖片描述

APIserver:所有資源增刪改查的唯一入口,k8s集羣的命令行和api接口都是通過調用apiserver實現的,主要處理rest操作以及更新etcd中的內容。
Scheduler:集羣的調度器,將pod綁定到node上,同時實現pod在node上的調度。
Controller manager:所有其他集羣級別的功能,是資源對象的自動化控制中心。
Etcd:集羣的數據庫,所有需要持久化的信息存儲於etcd中。
Kubelet:實現對pod以及容器、鏡像、卷等的管理。
Kube-proxy:實現pod間的負載均衡,實現對service ip的訪問。

K8S網絡與負載均衡

網絡是k8s集羣中的一個難點,理解k8s網絡構成有利於我們理解集羣的架構。我們先來看看三類ip:
Node ip:主機的物理ip
Service ip:k8s虛擬ip,由k8s管理和分配,單獨的ip沒有通信功能,要配合service port才能使用,每個node上的service ip是相同的。
Pod ip:pod的ip地址,內部docker的ip,也就是上面討論的通過docker網橋與物理網卡互聯的ip地址,可以在node上通過ssh訪問。

下面我們先看看一個請求的轉發流程,我們知道一個請求要想訪問某個pod,請求先經過node的物理網卡,通過iptables的轉發規則,將訪問地址和端口進行轉換,轉爲svc的地址,service同樣使用iptables規則通過kube-proxy定義的轉發百分比將流量轉發到不同pod上。

在這裏插入圖片描述

這裏有個問題我們可以延伸下。Svc轉發到的多個pod可能不在一個機器上,這樣就涉及到跨機器訪問,就是說可能a機器的svc需要轉發流量到b機器的pod中,那麼這種情況下k8s是如何做的呢?這裏其實就涉及到overlay網絡。
在這裏插入圖片描述

我們知道overlay網絡是承載在物理網絡上的虛擬網絡,這個網絡本質上還是走的物理機的物理網卡,但是這個網絡其實對物理網絡是透明的,用戶可以不關心物理網絡。那麼它是怎麼工作的呢?K8s是通過flannel網絡實現的。Flannel網絡是通過ip隧道協議將數據包前面再封裝一層,將源地址和目的地址的外部網絡ip(node ip)與內部網絡ip(pod ip)封裝到數據包裏,這樣數據包從a機器的svc轉發到b機器的物理網卡上時先進行解包,然後得到內部ip,轉發到pod上。但是整體上看對於用戶就是幾個pod間的overlay網絡互連的,用戶無需關心其他細節。Flannel網絡雖然簡單,但是這種方式需要解包,所以在集羣十分大的情況下可能存在性能問題,所以我們有了flannel網絡的替代品:calico,calico網絡是完全通過ip路由實現的轉發,這種方式也有缺點,就是在集羣很大的情況下,路由表可能十分龐大。

當然k8s的內容還有很多,比如說如何構建一個應用,包括namespace、service、deployment、pod等的構建,還有k8s的用戶角色與權限認證體系等,這裏不再一一討論。本文旨在幫助初學者構建k8s的一個總體架構,理解k8s的工作機制,至於具體的命令還需要自己去實踐。

歡迎關注我的公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章