【Kubernetes 系列二】從虛擬機講到 Kubernetes 架構

在認識 Kubernetes 以前,咱們需瞭解下容器,在瞭解容器以前,咱們得先知道什麼是虛擬機。android

什麼是虛擬機?

虛擬機(VM, Virtual Machine)是計算機系統的仿真,以便隔離真實計算機硬件,運行多個不一樣的操做系統。虛擬化技術是硬件隔離的,運行在虛擬機(客體機)中的程序不直接與真實機器(宿主機)交互。git

常見的虛擬機軟件有:github

軟件 初次發佈時間 早期主導的公司 操做系統 編寫語言
VMware Workstation 1999 VMware Windows, Linux C, C++, F#
VirtualBox 2007.1.17 Oracle Windows, macOS, Linux and Solaris C, C++, x86 Assembly
OpenStack 2010.10.21 Rackspace Hosting, NASA 跨平臺 Python

虛擬機由於要隔離出單獨的一個個系統,相比容器,佔用內存和磁盤空間較大,運行起來很笨重。docker

什麼是容器?

容器(Container),一般是指 Linux 容器(LXC, Linux Containers ),是輕量級的虛擬化技術(咱們把虛擬機技術稱之爲重量級的虛擬化技術)。它不隔離出一個個子系統,而是直接運行在真機上,隔離的是進程,使用的底層技術實際上是 Linux Namespaces(Linux 命名空間)。什麼是 Linux Namespaces 呢?網絡

在計算機領域,Namespace 是用來代表標識符的可見範圍。在 XML 定義中就用 xmlns(XML Namespace)來肯定標籤的含義,隔離命名衝突,例如:架構

<html>
<h:table xmlns:h="http://www.w3.org/TR/html4/">
   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>
</h:table>
<f:table xmlns:f="http://www.w3school.com.cn/furniture">
   <f:name>African Coffee Table</f:name>
   <f:width>80</f:width>
   <f:length>120</f:length>
</f:table>
</html>

學過 Android 的,能夠聯想下 Android XML 佈局文件中默認的 xmlns併發

`xmlns:android="http://schemas.android.com/apk/res/android" `

以及咱們自定義組件屬性時,使用的 xmlnsapp

`xmlns:app="http://schemas.android.com/apk/res-auto"`

學過 C++的還能夠聯想下其關鍵字 namespace。dom

言歸正傳,Linux Namespaces 是 Linux 內核中對容器的支持,不一樣 Namespace 之間內核資源是隔離的。Linux Namespaces 最先出如今 Linux 2.4,到 4.6 時已經有 7 種 Namespaces了,每種 Namespace 隔離不一樣種類的內核資源,具體列表以下:

Namespace Since Constant Isolates
Cgroup Linux 2.6.24 → Linux 4.5 CLONE_NEWCGROUP Cgroup root directory(Cgroup 的根目錄)
IPC Linux 2.6.19 CLONE_NEWIPC System V IPC, POSIX message queues(信號量、消息隊列和共享內存)
Network Linux 2.6.24 → Linux 2.6.29 CLONE_NEWNET Network devices, stacks, ports, etc.(網絡設備、棧和端口等)
Mount Linux 2.4.19 CLONE_NEWNS Mount points(文件系統掛載點)
PID Linux 2.6.24 CLONE_NEWPID Process IDs(進程 ID)
User Linux 2.6.23 → Linux 3.8 CLONE_NEWUSER User and group IDs(用戶和組 ID)
UTS Linux 2.6.19 CLONE_NEWUTS Hostname and NIS domain name(主機名和 NIS 域名)

重要的 6 種 Namespace 在 2010 年就已經出現並多數編碼完成,Linux 的容器支持越發完善,Docker 的出現正逢其時。

Docker

咱們前面講到 Docker,始於 2010 年 dotCloud 開發的基於Linux 容器的虛擬化技術,即 Docker 技術。這項技術於 2013 年 3 月在 Github 上開源併發布 v0.1 版本,吸引大量人氣,甚至 Google、Redhat、IBM 和Amazon 等大公司也表示全力支持。到2014年6月9日,Docker v1.0 正式發佈。如前述虛擬機軟件,整理 Docker 基本信息以下:

軟件 初次發佈時間 早期主導的公司 操做系統 編寫語言
Docker 2013.3 dotCloud(Docker Inc.) Linux, Windows, MacOS Go

初步認識 Docker,只須要了解其中的 3 個概念:

  1. 鏡像(Image),這裏的鏡像不是咱們日常所熟知的 ISO 壓縮文件,而是一種使用 Union FS 分層存儲技術存儲的 root 文件系統,包含容器運行時所需的程序、庫、資源和配置等文件。
  2. 容器(Container),Docker 語義下的容器是鏡像運行時的實體,其實質就是一個 Docker 進程。能夠對容器執行建立、啓動、中止、刪除和暫停操做。容器的存儲方式也是分層存儲,以鏡像爲基礎層,在其上建立一個當前容器的存儲層,稱之爲容器存儲層。(注:容器存儲層的生命週期與容器同步,故寫入文件時應使用數據卷或綁定宿主目錄)
  3. 登記處(Registry),一個登記處能夠登記多個倉庫,每一個倉庫能夠包含多個標籤,每一個標籤對應一個鏡像。登記處便利了鏡像的分發和管理。

Kubernetes

隨着 Docker 技術的流行,人們對統一部署、擴展和運行容器集羣的需求日益強烈。因而,Kubernetes 應運而生。

Kubernetes (源自古希臘語,意爲領航員、舵手,簡稱 K8S,8 表明中間的 8 個字母)由 Google 公司於 2014 年推出,並於 2015 年 7 月 21 日發佈 v1.0 。Kubernetes 系統深受 Google 內部另外一個大型集羣管理系統 Borg 的影響,其 logo 上的七個輪輻就是在向電影《星際迷航》中的 Borg 人 Seven 致意。

架構

Kubernetes 採用主從式架構,一個集羣控制節點(Master)和多個工做節點(Node)。包含如下核心組件:

圖:Kubernetes 核心組件

Architecture Diagram

圖:Kubernetes 架構(官方)

圖:Kubernetes 架構(AWS)

Kubernetes High Level component architecture

圖:Kubernetes 架構(Slide from [this](https://schd.ws/hosted_files/kccnceu18/00/What does "production ready" really mean for a Kubernetes cluster.pdf) presentation from Lucas Käldström (@kubernetesonarm))


圖:Kubernetes 架構

Kubernetes 對象

Kubernetes 採用聲明式設計,經過 API 對象聲明指望的狀態(desired state),而後系統會經過控制面(control plane)最終達到指望。

圖:Kubernetes 對象

基礎設施抽象

圖:基礎設施抽象

相關文章
相關標籤/搜索