目錄html
在認識 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,始於 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 個概念:
隨着 Docker 技術的流行,人們對統一部署、擴展和運行容器集羣的需求日益強烈。因而,Kubernetes 應運而生。
Kubernetes (源自古希臘語,意爲領航員、舵手,簡稱 K8S,8 表明中間的 8 個字母)由 Google 公司於 2014 年推出,並於 2015 年 7 月 21 日發佈 v1.0 。Kubernetes 系統深受 Google 內部另外一個大型集羣管理系統 Borg 的影響,其 logo 上的七個輪輻就是在向電影《星際迷航》中的 Borg 人 Seven 致意。
Kubernetes 採用主從式架構,一個集羣控制節點(Master)和多個工做節點(Node)。包含如下核心組件:
圖:Kubernetes 核心組件
圖:Kubernetes 架構(官方)
圖:Kubernetes 架構(AWS)
圖: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 採用聲明式設計,經過 API 對象聲明指望的狀態(desired state),而後系統會經過控制面(control plane)最終達到指望。
圖:Kubernetes 對象
圖:基礎設施抽象