談一談雲計算的那些事


面向面試的博客,以問答式Q/A方式呈現。
Java面試專欄:雲計算 https://blog.csdn.net/qq_36963950/article/details/105228870
Java面試專欄:zookeeper https://blog.csdn.net/qq_36963950/article/details/105200255
Java面試:SSM(Spring+SpringMVC+Mybatis) https://blog.csdn.net/qq_36963950/article/details/105230985
Java面試專欄:微服務 https://blog.csdn.net/qq_36963950/article/details/105265993
Java面試專欄:Netty 與 RPC https://blog.csdn.net/qq_36963950/article/details/105266425
Java面試專欄:計算機網絡 https://blog.csdn.net/qq_36963950/article/details/105297603
Java面試專欄:Kafka https://blog.csdn.net/qq_36963950/article/details/105333460
Java面試專欄:RabbitMQ https://blog.csdn.net/qq_36963950/article/details/105335758
Java面試專欄:大數據Hadoop https://blog.csdn.net/qq_36963950/article/details/105336055
Java面試專欄:大數據Spark https://blog.csdn.net/qq_36963950/article/details/105336060
Java面試專欄:大數據Storm https://blog.csdn.net/qq_36963950/article/details/105336074
Java面試專欄:大數據Hbase https://blog.csdn.net/qq_36963950/article/details/105336095
Java面試專欄:負載均衡 https://blog.csdn.net/qq_36963950/article/details/105336111
Java面試專欄:數據庫 https://blog.csdn.net/qq_36963950/article/details/105336136

Question1:雲計算三層架構?

Answer1:

雲計算三層架構如圖:
在這裏插入圖片描述
對於上圖的解釋:

SaaS
SaaS 是 Software-as-a-Service(軟件即服務)。

PaaS
PaaS 是 Platform-as-a-Service 的縮寫,意思是平臺即服務。 把服務器平臺作爲一種服務提供的商業模式。通過網絡進行程序提供的服務稱之爲 SaaS(Software as a Service),而云計算時代相應的服務器平臺或者開發環境作爲服務進行提供就成爲了 PaaS(Platform as a Service)。

IaaS
IaaS(Infrastructure as a Service),即基礎設施即服務。提供給消費者的服務是對所有設施的利用,包括處理、存儲、網絡和其它基本的計算資源,用戶能夠部署和運行任意軟件,包括操作系統和應用程序。


Question2:敘述一下Docker整體架構?

Answer2:

Docker架構圖如下:
在這裏插入圖片描述
Docker架構中相關概念如下表(和上圖對應):

Docker中的概念 解釋
Docker 鏡像(Images) Docker 鏡像是用於創建 Docker 容器的模板。
Docker 容器(Container) 容器是獨立運行的一個或一組應用。
Docker 客戶端(Client) Docker 客戶端通過命令行或者其他工具使用 Docker API 與 Docker 的守護進程通信。
Docker 主機(Host) 一個物理或者虛擬的機器用於執行 Docker 守護進程和容器。
Docker 倉庫(Registry) Docker 倉庫用來保存鏡像,可以理解爲代碼控制中的代碼倉庫。Docker Hub 提供了龐大的鏡像集合供使用。
Docker Machine Docker Machine 是一個簡化 Docker 安裝的命令行工具,通過一個簡單的命令行即可在相應的平臺上安裝 Docker,比如 VirtualBox、 Digital Ocean、Microsoft Azure。

Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程 API 來管理和創建 Docker 容器。Docker 容器通過Docker 鏡像來創建。Docker 的出現是因爲目前的後端在開發和運維階段確實需要一種虛擬化技術解決開發環境和生產環境環境一致的問題,通過 Docker 我們可以將程序運行的環境也納入到版本控制中,排除因爲環境造成不同運行結果的可能。


Question3:簡要介紹一下Linux中的命名空間Namespaces?

Answer3:

命名空間(namespaces)是 Linux 爲我們提供的用於分離進程樹、網絡接口、掛載點以及進程間通信等資源的方法。在日常使用 Linux 時,我們並沒有運行多個完全分離的服務器的需要,但是如果我們在服務器上啓動了多個服務,這些服務其實會相互影響的,每一個服務都能看到其他服務的進程,也可以訪問宿主機器上的任意文件,這是很多時候我們都不願意看到的,我們更希望運行在同一臺機器上的不同服務能做到完全隔離,就像運行在多臺不同的機器上一樣。

Linux 的命名空間機制提供了以下七種不同的命名空間,包括 CLONE_NEWCGROUP、
CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、
CLONE_NEWUSER 和 CLONE_NEWUTS,通過這七個選項我們能在創建新的進程時設置新進程應該在哪些資源上與宿主機器進行隔離。


Question4:談一談關於Docker的進程隔離?

Answer4:

docker 創建新進程時傳入 CLONE_NEWPID 實現的進程隔離,也就是使用 Linux 的命名空間實現進程的隔離,Docker 容器內部的任意進程都對宿主機器的進程一無所知。當我們每次運行docker run 或者 docker start 時,都會在創建一個用於設置進程間隔離的 Spec,同時會設置進程相關的命名空間,還會設置與用戶、網絡、IPC 以及 UTS 相關的命名空間,所有命名空間相關的設置 Spec 最後都會作爲 Create 函數的傳入參數在創建新的容器時進行設置。


Question5:介紹一下Docker的網絡隔離(或談一談對Docker中Libnetwork的認識)?

Answer5:

如果 Docker 的容器通過 Linux 的命名空間完成了與宿主機進程的網絡隔離,但是卻有沒有辦法通過宿主機的網絡與整個互聯網相連,就會產生很多限制,所以 Docker 雖然可以通過命名空間創建一個隔離的網絡環境,但是 Docker 中的服務仍然需要與外界相連才能發揮作用。

Docker 整個網絡部分的功能都是通過 Docker 拆分出來的 libnetwork 實現的,它提供了一個連接不同容器的實現,同時也能夠爲應用給出一個能夠提供一致的編程接口和網絡層抽象的容器網絡模型。

libnetwork 中最重要的概念,容器網絡模型由以下的幾個主要組件組成,分別是 Sandbox、Endpoint 和 Network。在容器網絡模型中,每一個容器內部都包含一個 Sandbox,其中存儲着當前容器的網絡棧配置,包括容器的接口、路由表和 DNS 設置,Linux 使用網絡命名空間實現這個Sandbox,每一個 Sandbox 中都可能會有一個或多個 Endpoint,在 Linux 上就是一個虛擬的網卡veth,Sandbox 通過 Endpoint 加入到對應的網絡中,這裏的網絡可能就是我們在上面提到的 Linux網橋或者 VLAN。

每一個使用 docker run 啓動的容器其實都具有單獨的網絡命名空間,Docker 爲我們提供了四種不同的網絡模式,Host、Container、None 和 Bridge 模式,如圖所示:

在這裏插入圖片描述

Docker 默認的網絡設置模式是網橋模式

網橋模式下,除了分配隔離的網絡命名空間之外,Docker 還會爲所有的容器設置 IP 地址。當 Docker 服務器在主機上啓動之後會創建新的虛擬網橋 docker0,隨後在該主機上啓動的全部服務在默認情況下都與該網橋相連。在默認情況下,每一個容器在創建時都會創建一對虛擬網卡,兩個虛擬網卡組成了數據的通道,其中一個會放在創建的容器中,會加入到名爲 docker0 網橋中,如圖所示。

在這裏插入圖片描述


Question6:簡單介紹一下CGroups

Answer6:

Control Groups 簡寫做 CGroups,CGroups能夠隔離宿主機器上的物理資源,例如 CPU、內存、磁盤 I/O 和網絡帶寬。每一個 CGroup 都是一組被相同的標準和參數限制的進程,不同的 CGroup 之間是有層級關係的,也就是說它們之間可以從父類繼承一些用於限制資源使用的標準和參數。


Question7: 介紹一下Docker鏡像

Answer7:

Linux 的命名空間和控制組分別解決了不同資源隔離的問題,Linux中的命名空間Namespaces解決了進程、網絡以及文件系統的隔離,Linux中的控制組實現了 CPU、內存等資源的隔離,但是在 Docker 中還有另一個非常重要的問題需要解決 - 也就是鏡像。

Docker 鏡像其實本質就是一個壓縮包,我們可以使用命令將一個 Docker 鏡像中的文件導出,你可以看到這個鏡像中的目錄結構與 Linux 操作系統的根目錄中的內容並沒有太多的區別,可以說Docker 鏡像就是一個文件。


Question8:談一談關於Docker中的存儲驅動的認識

Answer8:

Docker 使用了一系列不同的存儲驅動管理鏡像內的文件系統並運行容器,這些存儲驅動與Docker 卷(volume)有些不同,存儲引擎管理着能夠在多個容器之間共享的存儲。

當鏡像被 docker run 命令創建時就會在鏡像的最上層添加一個可寫的層,也就是容器層,所有對於運行時容器的修改其實都是對這個容器讀寫層的修改。

容器和鏡像的區別就在於,所有的鏡像都是隻讀的,而每一個容器其實等於鏡像加上一個可讀寫的層,也就是同一個鏡像可以對應多個容器。

UnionFS 其實是一種爲 Linux 操作系統設計的用於把多個文件系統『聯合』到同一個掛載點的文件系統服務。而 AUFS 即 Advanced UnionFS 其實就是 UnionFS 的升級版,它能夠提供更優秀的性能和效率。

AUFS 只是 Docker 使用的存儲驅動的一種,除了 AUFS 之外,Docker 還支持了不同的存儲驅動,包括 aufs、devicemapper、overlay2、zfs 和 vfs 等等,在最新的 Docker 中,overlay2 取代了aufs 成爲了推薦的存儲驅動,但是在沒有 overlay2 驅動的機器上仍然會使用 aufs 作爲 Docker的默認驅動。

Java面試專欄:雲計算 https://blog.csdn.net/qq_36963950/article/details/105228870
Java面試專欄:zookeeper https://blog.csdn.net/qq_36963950/article/details/105200255
Java面試:SSM(Spring+SpringMVC+Mybatis) https://blog.csdn.net/qq_36963950/article/details/105230985
Java面試專欄:微服務 https://blog.csdn.net/qq_36963950/article/details/105265993
Java面試專欄:Netty 與 RPC https://blog.csdn.net/qq_36963950/article/details/105266425
Java面試專欄:計算機網絡 https://blog.csdn.net/qq_36963950/article/details/105297603
Java面試專欄:Kafka https://blog.csdn.net/qq_36963950/article/details/105333460
Java面試專欄:RabbitMQ https://blog.csdn.net/qq_36963950/article/details/105335758
Java面試專欄:大數據Hadoop https://blog.csdn.net/qq_36963950/article/details/105336055
Java面試專欄:大數據Spark https://blog.csdn.net/qq_36963950/article/details/105336060
Java面試專欄:大數據Storm https://blog.csdn.net/qq_36963950/article/details/105336074
Java面試專欄:大數據Hbase https://blog.csdn.net/qq_36963950/article/details/105336095
Java面試專欄:負載均衡 https://blog.csdn.net/qq_36963950/article/details/105336111
Java面試專欄:數據庫 https://blog.csdn.net/qq_36963950/article/details/105336136

在這裏插入圖片描述

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