超詳細!k8s 面試題總結

圖片

一個目標:容器操做;兩地三中心;四層服務發現;五種 Pod 共享資源;六個 CNI 經常使用插件;七層負載均衡;八種隔離維度;九個網絡模型原則;十類 IP 地址;百級產品線;千級物理機;萬級容器;相如無億,k8s 有億:億級日服務人次。redis

一個目標:容器操做

Kubernetes(k8s)是自動化容器操做的開源平臺。這些容器操做包括:部署、調度和節點集羣間擴展。算法

具體功能:
  • 自動化容器部署和複製。
  • 實時彈性收縮容器規模。
  • 容器編排成組,並提供容器間的負載均衡。
  • 調度:容器在哪一個機器上運行。
組成:
  • kubectl:客戶端命令行工具,做爲整個系統的操做入口。
  • kube-apiserver:以 REST API 服務形式提供接口,做爲整個系統的控制入口。
  • kube-controller-manager:執行整個系統的後臺任務,包括節點狀態情況、Pod 個數、Pods 和Service 的關聯等。
  • kube-scheduler:負責節點資源管理,接收來自 kube-apiserver 建立 Pods 任務,並分配到某個節點。
  • etcd:負責節點間的服務發現和配置共享。
  • kube-proxy:運行在每一個計算節點上,負責 Pod 網絡代理。定時從 etcd 獲取到 service 信息來作相應的策略。
  • kubelet:運行在每一個計算節點上,做爲 agent,接收分配該節點的 Pods 任務及管理容器,週期性獲取容器狀態,反饋給 kube-apiserver。
  • DNS:一個可選的 DNS 服務,用於爲每一個 Service 對象建立 DNS 記錄,這樣全部的 Pod 就能夠經過 DNS 訪問服務了。

下面是 k8s 的架構拓撲圖:docker

圖片

兩地三中心api


兩地三中心包括本地生產中心、本地災備中心、異地災備中心。安全

圖片

兩地三中心要解決的一個重要問題就是數據一致性問題。服務器

k8s 使用 etcd 組件做爲一個高可用、強一致性的服務發現存儲倉庫。用於配置共享和服務發現。網絡

它做爲一個受到 Zookeeper 和 doozer 啓發而催生的項目。除了擁有他們的全部功能以外,還擁有如下 4 個特色:架構

  • 簡單:基於 HTTP+JSON 的 API 讓你用 curl 命令就能夠輕鬆使用。
  • 安全:可選 SSL 客戶認證機制。
  • 快速:每一個實例每秒支持一千次寫操做。
  • 可信:使用 Raft 算法充分實現了分佈式。

四層服務發現

先一張圖解釋一下網絡七層協議:負載均衡

圖片

k8s 提供了兩種方式進行服務發現:框架

  • 環境變量:當建立一個 Pod 的時候,kubelet 會在該 Pod 中注入集羣內全部 Service 的相關環境變量。須要注意的是,要想一個 Pod 中注入某個 Service 的環境變量,則必須 Service 要先比該 Pod 建立。這一點,幾乎使得這種方式進行服務發現不可用。 好比,一個 ServiceName 爲 redis-master 的 Service,對應的 ClusterIP:Port 爲 10.0.0.11:6379,則對應的環境變量爲:

圖片

  • DNS:能夠經過 cluster add-on 的方式輕鬆的建立 KubeDNS 來對集羣內的 Service 進行服務發現。

以上兩種方式,一個是基於 TCP,DNS 基於 UDP,它們都是創建在四層協議之上。

五種 Pod 共享資源

Pod 是 k8s 最基本的操做單元,包含一個或多個緊密相關的容器。

一個 Pod 能夠被一個容器化的環境看做應用層的「邏輯宿主機」;一個 Pod 中的多個容器應用一般是緊密耦合的,Pod 在 Node 上被建立、啓動或者銷燬;每一個 Pod 裏運行着一個特殊的被稱之爲 Volume 掛載卷,所以他們之間通訊和數據交換更爲高效。在設計時咱們能夠充分利用這一特性將一組密切相關的服務進程放入同一個 Pod 中。

圖片

同一個 Pod 裏的容器之間僅需經過 localhost 就能互相通訊。

一個 Pod 中的應用容器共享五種資源:

  • PID 命名空間:Pod 中的不一樣應用程序能夠看到其餘應用程序的進程 ID。
  • 網絡命名空間:Pod 中的多個容器可以訪問同一個IP和端口範圍。
  • IPC 命名空間:Pod 中的多個容器可以使用 SystemV IPC 或 POSIX 消息隊列進行通訊。
  • UTS 命名空間:Pod 中的多個容器共享一個主機名。
  • Volumes(共享存儲卷):Pod 中的各個容器能夠訪問在 Pod 級別定義的 Volumes。

Pod 的生命週期經過 Replication Controller 來管理;經過模板進行定義,而後分配到一個 Node 上運行,在 Pod 所包含容器運行結束後,Pod 結束。

Kubernetes 爲 Pod 設計了一套獨特的網絡配置,包括爲每一個 Pod 分配一個IP地址,使用 Pod 名做爲容器間通訊的主機名等。

六個 CNI 經常使用插件

CNI(Container Network Interface)容器網絡接口是 Linux 容器網絡配置的一組標準和庫,用戶須要根據這些標準和庫來開發本身的容器網絡插件。CNI 只專一解決容器網絡鏈接和容器銷燬時的資源釋放,提供一套框架。因此 CNI 能夠支持大量不一樣的網絡模式,而且容易實現。

下面用一張圖表示六個 CNI 經常使用插件:

圖片

七層負載均衡


提負載均衡就不得不先提服務器之間的通訊。

IDC(Internet Data Center)也可稱數據中心、機房,用來放置服務器。IDC 網絡是服務器間通訊的橋樑。

圖片

上圖裏畫了不少網絡設備,它們都是幹啥用的呢?

路由器、交換機、MGW/NAT 都是網絡設備,按照性能、內外網劃分不一樣的角色。

  • 內網接入交換機:也稱爲 TOR(top of rack),是服務器接入網絡的設備。每臺內網接入交換機下聯 40-48 臺服務器,使用一個掩碼爲 /24 的網段做爲服務器內網網段。
  • 內網核心交換機:負責 IDC 內各內網接入交換機的流量轉發及跨 IDC 流量轉發。
  • MGW/NAT:MGW 即 LVS 用來作負載均衡,NAT 用於內網設備訪問外網時作地址轉換。
  • 外網核心路由器:經過靜態互聯運營商或 BGP 互聯美團統一外網平臺。

先說說各層負載均衡:

  • 二層負載均衡:基於 MAC 地址的二層負載均衡。
  • 三層負載均衡:基於 IP 地址的負載均衡。
  • 四層負載均衡:基於 IP+端口 的負載均衡。
  • 七層負載均衡:基於 URL 等應用層信息的負載均衡。

這裏用一張圖來講說四層和七層負載均衡的區別:

圖片

上面四層服務發現講的主要是 k8s 原生的 kube-proxy 方式。k8s 關於服務的暴露主要是經過 NodePort 方式,經過綁定 minion 主機的某個端口,而後進行 Pod 的請求轉發和負載均衡,但這種方式有下面的缺陷:

  • Service 可能有不少個,若是每一個都綁定一個 Node 主機端口的話,主機須要開放外圍的端口進行服務調用,管理混亂。
  • 沒法應用不少公司要求的防火牆規則。

理想的方式是經過一個外部的負載均衡器,綁定固定的端口,好比 80;而後根據域名或者服務名向後面的 Service IP 轉發。

Nginx 很好的解決了這個需求,但問題是若是有的新的服務加入,如何去修改而且加載這些 Nginx 配置

Kubernetes 給出的方案就是 Ingress。這是一個基於七層的方案。

八種隔離維度

圖片

k8s 集羣調度這邊須要對上面從上到下、從粗粒度到細粒度的隔離作相應的調度策略。

九個網絡模型原則

k8s 網絡模型要符合四個基礎原則、三個網絡要求原則、一個架構原則、一個 IP 原則。

每一個 Pod 都擁有一個獨立的 IP 地址,並且假定全部 Pod 都在一個能夠直接連通的、扁平的網絡空間中,不論是否運行在同一 Node 上均可以經過 Pod 的 IP 來訪問。

k8s 中的 Pod 的 IP 是最小粒度 IP。同一個 Pod 內全部的容器共享一個網絡堆棧,該模型稱爲 IP-per-Pod 模型。

  • Pod 由 docker0 實際分配的 IP。
  • Pod 內部看到的 IP 地址和端口與外部保持一致。
  • 同一個 Pod 內的不一樣容器共享網絡,能夠經過localhost來訪問對方的端口,相似同一個虛擬機內不一樣的進程。

IP-per-Pod 模型從端口分配、域名解析、服務發現、負載均衡、應用配置等角度看,Pod 能夠看作是一臺獨立的虛擬機或物理機。

  • 全部容器均可以不用 NAT 的方式同別的容器通訊。
  • 全部節點均可以在不一樣 NAT 方式下同全部容器通訊,反之亦然。
  • 容器的地址和別人看到的地址是同一個地址。

要符合下面的架構:

圖片

由上圖架構引伸出來 IP 概念從集羣外部到集羣內部:

圖片

十類IP地址


你們都知道 IP 地址分爲 ABCDE 類,另外還有五類特殊用途的 IP。

第一類

A 類:1.0.0.0-1226.255.255.255,默認子網掩碼/8,即255.0.0.0。
B 類:128.0.0.0-191.255.255.255,默認子網掩碼/16,即255.255.0.0。
C 類:192.0.0.0-223.255.255.255,默認子網掩碼/24,即255.255.255.0。
D 類:224.0.0.0-239.255.255.255,通常用於組播。
E 類:240.0.0.0-255.255.255.255(其中255.255.255.255爲全網廣播地址)。E 類地址通常用於研究用途。

第二類

0.0.0.0
嚴格來講,0.0.0.0 已經不是一個真正意義上的 IP 地址了。它表示的是這樣一個集合:全部不清楚的主機和目的網絡。這裏的不清楚是指在本機的路由表裏沒有特定條目指明如何到達。做爲缺省路由。
127.0.0.1 本機地址。

第三類

224.0.0.1 組播地址。
若是你的主機開啓了IRDP(internet路由發現,使用組播功能),那麼你的主機路由表中應該有這樣一條路由。

第四類

169.254.x.x
使用了 DHCP 功能自動獲取了 IP 的主機,DHCP 服務器發生故障,或響應時間太長而超出了一個系統規定的時間,系統會爲你分配這樣一個 IP,表明網絡不能正常運行。

第五類

10.xxx、172.16.x.x~172.31.x.x、192.168.x.x 私有地址。
大量用於企業內部。保留這樣的地址是爲了不亦或是哪一個接入公網時引發地址混亂。
轉自:stackpush 連接:blog.csdn.net/huakai_sun/article/details/82378856

image

相關文章
相關標籤/搜索