Kubernetes基礎組件概述

本文講的是Kubernetes基礎組件概述【編者的話】最近總有同學問Kubernetes中的各個組件的相關問題,其實這些概念內容在官方文檔中都有,奈何我們有些同學可能英文不好,又或者懶得去看,又或者沒有找到,今天有時間就專門寫了這篇博客。

【深圳站|3天燒腦式Kubernetes訓練營】培訓內容包括:Kubernetes概述、架構、日志和監控,部署、自動駕駛、服務發現、網絡方案等核心機制分析,進階篇——Kubernetes調度工作原理、資源管理及源碼分析等。

本文主要介紹Kubernetes的基礎組件,先介紹Master節點上的控制管理組件,再介紹Node節點上的計算組件,最后是附加組件,后邊會找時間再寫一篇介紹Kubernetes中的各種資源及使用。

1 Master節點組件

Master節點組件是指運行在Kubernetes集群中的Master節點上,提供整個集群的管理控制功能的組件,例如調度組件(kube-scheduler),接口組件(kube-apiserver)等

1.1 kube-apiserver

kube-apiserver主要負責暴露Kubernetes API,不管是kubectl還是HTTP調用來操作Kubernetes集群各種資源,都是通過kube-apiserver提供的接口進行操作的。

詳細介紹、文檔、配置參數:API-Server配置。

1.2 kube-controller-manager

管理控制器負責整個Kubernetes的管理工作,保證集群中各種資源的狀態處于期望狀態,當監控到集群中某個資源狀態不正常時,管理控制器會觸發對應的調度操作,主要由以下幾部分組成:
  • 節點控制器(Node Controller)
  • 副本控制器(Replication Controller)
  • 端點控制器(Endpoints Controller)
  • 命名空間控制器(Namespace Controller)
  • 身份認證控制器(Serviceaccounts Controller)

詳細介紹、文檔、配置參數:Controller-Manager配置。

1.3 cloud-controller-manager

云管理控制器是Kubernetes 1.6新加入的組件(組件抽象了一層IaaS平臺的接口,具體的實現由各云廠商負責提供),主要負責與基礎計算云平臺(IaaS)的交互,目前還處于測試開發階段,我們也還沒有使用過該組件。該組件的具體實現包括:
  • 節點控制器(Node Controller)
  • 路由控制器(Route Controller)
  • 負載均衡服務控制器(Service Controller)
  • 數據卷控制器(Volume Controller)

1.4 kube-scheduler

調度器負責Kubernetes集群的具體調度工作,接收來自于管理控制器(kube-controller-manager)觸發的調度操作請求,然后根據請求規格、調度約束、整體資源情況等因素進行調度計算,最后將任務發送到目標節點的kubelet組件執行。

詳細介紹、文檔、配置參數:Scheduler配置。

1.5 etcd

etcd是一款用于共享配置和服務發現的高效KV存儲系統,具有分布式、強一致性等特點。在Kubernetes環境中主要用于存儲所有需要持久化的數據。

2 Node節點組件

Node節點組件是指運行在Node節點上,負責具體POD運行時環境的組件。

2.1 kubelet

kubelet是Node節點上最重要的核心組件,負責Kubernetes集群具體的計算任務,具體功能包括:
  • 監聽Scheduler組件的任務分配
  • 掛載POD所需Volume
  • 下載POD所需Secrets
  • 通過與docker daemon的交互運行docker容器
  • 定期執行容器健康檢查
  • 監控、報告POD狀態到kube-controller-manager組件
  • 監控、報告Node狀態到kube-controller-manager組件

2.2 kube-proxy

kube-proxy主要負責Service Endpoint到POD實例的請求轉發及負載均衡的規則管理。

kube-proxy本身實際上并不負責請求轉發和負載均衡,而時從kube-apiserver獲取Service和POD的狀態更新,生成對應的DNAT規則到本地的iptabels,最終的轉發和負載均衡動作有iptabels實施,所以kube-proxy組件即使出現問題,已經更新到iptabels的轉發規則依然能夠生效。

詳細介紹、文檔、配置參數:Kube-Proxy配置。

3 附加組件

BTW:所謂的附加組件并不是說這類組件在kunernetes環境中可有可無,只是為了區別于底層的基礎計算組件。

有了上邊介紹的Master節點組件和Node節點組件后,基礎的Kubernetes環境算是已經構建好了:

kubectl調用apiserver發送創建pod的請求,scheduler收到調度任務發送到符合要求的node節點,node節點上的kubelet與docker daemon通訊創建docker容器。但是離真正可用的Kubernetes集群還有一定距離,例如Container IP管理,內部DNS解析,簡單的管理控制臺等。

3.1 Flannel

Flannel是由ConreOS主導設計的用于容器技術的覆蓋網絡(Overlay Network),在Flannel管理的容器網絡中,每一個宿主機都會擁有一個獨立子網,用于分配給其上的容器使用。通信方式是基于隧道協議的UDP和VXLAN等方式封包、解包及傳輸。

原生的docker網絡結構:docker在啟動的時候會創建一個網橋docker0(172.17.0.0),容器啟動的時候會創建一對Veth pair,這個Veth pair成對出現用于鏈接容器與docker0網橋(可以將其理解成一根網線的兩個插頭,一頭插在容器內改名為eth0,另一頭插在宿主機的docker0網橋上),這樣同一臺宿主機上的容器就可以互相訪問了,此時的路由表記錄:
172.17.0.0?????0.0.0.0?????????255.255.0.0???????U?????0??????0????????0?docker0

但是對于不同的宿主機A和宿主機B來說,它們的docker網絡一模一樣,IP也是一樣,網絡與網絡之間也不通。

Flannel來了之后,在每個宿主機上增加了個P2P的虛擬網卡flannel0(172.17.0.0),一頭對接docker0網橋,一頭由Flanneld服務監聽。Etcd管理著整個Flannel網絡的子網分配,宿主機A和宿主機B分別用分到的子網172.17.1.0172.17.2.0創建docker0網橋,然后又悄悄地修改了一下docker daemon的啟動參數--bip=172.17.1.1/24,同時添加路由表記錄:
#宿主機A
172.17.0.0?????0.0.0.0?????????255.255.0.0???????U?????0??????0????????0?flannel0
172.17.1.0?????0.0.0.0?????????255.255.255.0?????U?????0??????0????????0?docker0

宿主機B

172.17.0.0?????0.0.0.0?????????255.255.0.0???????U?????0??????0????????0?flannel0 172.17.2.0?????0.0.0.0?????????255.255.255.0?????U?????0??????0????????0?docker0
模擬下Flannel網絡下宿主機A上的docker容器(172.17.1.10)發送數據到宿主機B上的docker容器(172.17.2.15)的過程:
  1. 根據源容器和目的容器的IP匹配路由規則,同時匹配兩個IP的路由規則是172.17.0.0/16,如果是同一個宿主機上的容器訪問,匹配的是172.17.1.0或者172.17.2.0
  2. 數據從docker0網橋出來以后投遞到flannel0網卡
  3. 監聽flannel0網卡的Flanneld服務收到數據后封裝成數據包發送到宿主機B
  4. 宿主機B上的Flanneld服務接收到數據包后解包還原成原始數據
  5. Flanneld服務發送數據到flannel0網卡,根據目的容器地址匹配到路由規則172.17.2.0/24(docker0)
  6. 投遞數據到docker0網橋,進而進入到目標容器172.17.2.15。

Flannel的Github上有張比較詳細的原理圖:

原理圖

圖中的Flanneld運行在每個宿主機上,負責數據的發送、監聽、封包、解包等任務。

強調下,Flannel的backend有UDP和VXLAN、GRE等實現,默認使用UDP,性能大約只有本地物理網絡的一半,VXLAN推薦使用,性能損耗很小,不過需要3.9+的內核支持。

詳細介紹、文檔、源碼:Flannel Github。

3.2 Calico

Calico是純三層的SDN實現,它基于BPG協議和Linux的路由轉發機制,不依賴特殊硬件,沒有使用NAT或Tunnel等技術。能夠方便的部署在物理服務器,虛擬機(如OpenStack)或者容器環境下,可以無縫集成像OpenStack這種IaaS云架構,能夠提供可控的VM、容器、裸機之間的IP通信,同時它自帶的基于Iptables的ACL管理組件非常靈活,能夠滿足比較復雜的安全隔離需求。

Clico網絡模型的特點:
  1. 在Calico中的數據包并不需要進行封包和解封。
  2. Calico中的數據包,只要被policy允許,就可以在不同租戶中的workloads間傳遞或直接接入互聯網或從互聯網中進到Calico網絡中,并不需要像overlay方案中,數據包必須經過一些特定的節點去修改某些屬性。
  3. 因為是直接基于三層網絡進行數據傳輸,TroubleShooting會更加容易,同時用戶也可以直接用一般的工具進行操作與管理,比如ping、Whireshark等,無需考慮解包之類的事情。
  4. 網絡安全策略使用ACL定義,基于iptables實現,比起overlay方案中的復雜機制更直觀和容易操作。

Calico 的核心組件:

Felix:Calico agent,跑在每臺需要運行workload的節點上,主要負責配置路由及 ACLs等信息來確保endpoint的連通狀態;

etcd:分布式鍵值存儲,主要負責網絡元數據一致性,確保Calico網絡狀態的準確性;

BGP Client(BIRD):主要負責把Felix寫入kernel的路由信息分發到當前Calico網絡,確保workload間的通信的有效性;

BGP Route Reflector(BIRD):大規模部署時使用,摒棄所有節點互聯的mesh模式,通過一個或者多個BGP Route Reflector來完成集中式的路由分發;

詳細介紹、文檔、源碼:Calico Github。

3.3 DNS

kube-dns負責Kubernetes集群內的域名解析,解析服務通過dnsmasq實現。通過官方提供的Deployment和Service模板,可以很方便地部署kube-dns服務,并且可以任意伸縮POD實例來保證其高可用性。

默認的kube-dns的service_ip:10.96.0.10,默認的域名后綴為:cluster.local,如果是kubeadm部署的Kubernetes集群,kubelet的配置參數文件是:/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

DNS解析的A記錄規則為:my-svc.my-namespace.svc.cluster.local,例如kube-dns的service的A記錄為:kube-dns.kube-system.svc.cluster.local

POD實例創建后,其中的Container內的resolver.conf的配置如下:
search?kube-system.svc.cluster.local?svc.cluster.local?cluster.local
nameserver?10.96.0.10
options?timeout:1?rotate
options?ndots:5

因為添加了search domain,在POD的容器內訪問其他Service時可以用縮略域名訪問,如訪問kube-dns服務:kube-dns(同namespace內訪問),kube-dns.kube-system(跨namespace訪問)。

詳細介紹、文檔:Kube-Dns文檔。

3.4 Dashboard

Dashboard是官方提供的kubernetes集群的UI界面,提供了一些基礎的查看及簡單操作,隨便用用還行。

可以通過官方提供的YAML模板創建:kubectl create -f https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml

詳細介紹、文檔:Kube-Dashboard文檔。

原文發布時間為:2017-04-26

本文作者:史紹虎

本文來自云棲社區合作伙伴Dockerone.io,了解相關信息可以關注Dockerone.io。

原文標題:Kubernetes基礎組件概述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540495.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540495.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540495.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言將鏈表寫入二進制文件_通過逐級遍歷將二進制樹轉換為單鏈表的C程序

c語言將鏈表寫入二進制文件Problem statement: Write a C program to convert a binary tree into a single linked list by traversing level-wise. 問題陳述:編寫一個C程序,通過逐級遍歷將二進制樹轉換為單個鏈表 。 Example: 例: The ab…

[轉載] C Primer Plus 第6章 C控制語句 6.16 編程練習及答案

參考鏈接: 用Python打印金字塔圖案的程序 2019獨角獸企業重金招聘Python工程師標準>>> 1、編寫一個程序,創建一個具有26個元素的數組,并在其中存儲26個小寫字母。并讓該程序顯示該數組的內容。 #include int main (void) { …

C# String和string的區別

C#中同時存在String與string MSDN中對string的說明: string is an alias for String in the .NET Framework。string是String的別名而已,string是c#中的類,String是Framework的類,C# string 映射為 Framework的 String。如果用str…

要求用戶在Python中輸入整數| 限制用戶僅輸入整數值

input() function can be used for the input, but it reads the value as a string, then we can use the int() function to convert string value to an integer. input()函數可用于輸入,但它將值讀取為字符串,然后可以使用int()函數將字符串值轉換為…

[轉載] python——if語句、邏輯運算符號

參考鏈接: 用Python鏈接比較運算符 1.if條件判斷語句: if 要判斷的條件(True): 條件成立的時候,要做的事情 elif 要判斷的條件(True): .... elif 要判斷的條件(True): .... else: 條件不成立的時候要做的事情 示例: 判斷學生…

洛谷 P2689 東南西北【模擬/搜索】

題目描述 給出起點和終點的坐標及接下來T個時刻的風向(東南西北),每次可以選擇順風偏移1個單位或者停在原地。求到達終點的最少時間。 如果無法偏移至終點,輸出“-1”。 輸入輸出格式 輸入格式: 第一行兩個正整數x1,y1,表示小明所…

單鏈表遍歷_單鏈表及其遍歷實現的基本操作

單鏈表遍歷單鏈表 (Single linked list) Single linked list contains a number of nodes where each node has a data field and a pointer to next node. The link of the last node is to NULL, indicates end of list. 單個鏈表包含許多節點,其中每個節點都有一…

[轉載] python中for語句用法_詳解Python中for循環的使用_python

參考鏈接: 在Python中將else條件語句與for循環一起使用 這篇文章主要介紹了Python中for循環的使用,來自于IBM官方網站技術文檔,需要的朋友可以參考下 for 循環 本系列前面 “探索 Python,第 5 部分:用 Python 編程” 一文討論了 if 語句和…

windows 軟鏈接的建立及刪除

在windows服務器上有時有這樣的需求,你的文件在f:\test中,但由于其它原因用戶訪問的是e:\test,如果又希望e:\test 中的文件與f:\test的保持同步,除了用同步軟件來做外,可以用windows 的文件夾映射來做 cmd: mklink /J …

8086簡單的指令流水線_在8086微處理器中執行流水線的指令和概念的步驟

8086簡單的指令流水線Any computer or machine works according to some instructions. These instructions are responsible for all the work that the machine does. But how does a machine work to understand and execute that instruction? 任何計算機或機器都按照某些…

[轉載] 使用Python編寫打字訓練小程序

參考鏈接: 在Python中切換大小寫(替換) 你眼中的程序猿 別人眼中的程序猿,是什么樣子?打字如飛,各種炫酷的頁面切換,一個個好似黑客般的網站破解。可現實呢? 二指禪的敲鍵盤,寫一行代碼&#…

shell兩個數字相乘_使用8086微處理器將兩個16位數字相乘而不帶進位

shell兩個數字相乘Problem statement: 問題陳述: To perform multiplication operation between 2 16bit numbers with carry using 8086 Microprocessor. 使用8086微處理器在2個16位數字之間進行帶進位的乘法運算。 Algorithm: 算法: Load the first…

Dwr 框架簡單實例

Dwr 是一個 Java 開源庫,幫助你實現Ajax網站。 它可以讓你在瀏覽器中的Javascript代碼調用Web服務器上的Java,就像在Java代碼就在瀏覽器中一樣。 Dwr 主要包括兩部分: 在服務器上運行的 Servlet 來處理請求并把結果返回瀏覽器。 運行在瀏覽器…

[轉載] Python進階:設計模式之迭代器模式

參考鏈接: Python中的迭代器 在軟件開發領域中,人們經常會用到這一個概念——“設計模式”(design pattern),它是一種針對軟件設計的共性問題而提出的解決方案。在一本圣經級的書籍《設計模式:可復用面向對…

JavaScript | 如何為變量分配十進制,八進制和十六進制值?

Just like C programming language, we can assign integer value in the different format to the variable. 就像C編程語言一樣 ,我們可以將不同格式的整數值分配給變量。 Assigning decimal value: It can be assigned simply without using any prefix. 分配十…

路由器DHCP和DHCP中繼的配置

路由器 DHCP和DHCP中繼的配置 路由器作為DHCP服務器: 1.配置router的地址:Route(config)# hostname gateway (更改主機名字) Gateway(config)# interface gigabitethernet 0/0 …

[轉載] 大數據分析Python For循環教程

參考鏈接: Python中的迭代器函數1 大數據分析Python除了循環遍歷列表之外,for循環還有很多其他功能,在現實世界的數據科學工作中,您可能需要將numpy數組和pandas DataFrames用于其他數據結構的循環。 大數據分析Python For循環教…

node.js 爬蟲入門總結

node.js爬蟲 前端同學可能向來對爬蟲不是很感冒,覺得爬蟲需要用偏后端的語言,諸如 php , python 等。當然這是在 nodejs 前了,nodejs 的出現,使得 Javascript 也可以用來寫爬蟲了。由于 nodejs 強大的異步特性&#xf…

數組重復次數最多的元素遞歸_使用遞歸計算鏈接列表中元素的出現次數

數組重復次數最多的元素遞歸Solution: 解: Required function: 所需功能: func_occurence ( node *temp) //recursive functionInput: 輸入: A singly linked list whose address of the first node is stored in a pointer, say head and…

SecureCRT中文亂碼解決方法

服務端export LANGzh_CN.UTF-8客戶端SecureCRT編碼選擇UTF-8客戶端SecureCRT字體選擇新宋體,字符集選擇中文總結:客戶端和服務端字符編碼一致,客戶端字體字符集支持轉載于:https://blog.51cto.com/leomars/1972669