kubernetes入门(03)kubernetes的基本概念
一、Pod
在Kubernetes集群中,Pod是創建、部署和調度的基本單位。一個Pod代表著集群中運行的一個進程,它內部封裝了一個或多個應用的容器。在同一個Pod內部,多個容器共享存儲、網絡IP,以及管理容器如何運行的策略選項。Docker是Kubernetes中最常用的容器運行時。
在Kubrenetes集群中,Pod有兩種使用方式,如下所示:
一個Pod中運行一個容器
這種模式是最常見的用法,可以把Pod想象成是單個容器的封裝,Kubernetes直接管理的是Pod,而不是Pod內部的容器。
一個Pod中同時運行多個容器
一個Pod中也可以同時運行幾個容器,這些容器之間需要緊密協作,并共享資源。這些在同一個Pod中的容器可以互相協作,邏輯上代表一個Service對象。每個Pod都是應用的一個實例,如果我們想要運行多個實例,就應該運行多個Pod。
同一個Pod中的容器,會自動的分配到同一個Node上。每個Pod都會被分配一個唯一的IP地址,該Pod中的所有容器共享網絡空間,包括IP地址和端口。Pod內部的容器可以使用localhost互相通信。Pod中的容器與外界通信時,必須分配共享網絡資源(例如,使用宿主機的端口映射)。
我們可以為一個Pod指定多個共享的Volume,它內部的所有容器都可以訪問共享的Volume。Volume也可以用來持久化Pod中的存儲資源,以防容器重啟后文件丟失。
我們可以使用Kubernetes中抽象的Controller來創建和管理多個Pod,提供副本管理、滾動升級和集群級別的自愈能力。當Pod被創建后,都會被Kuberentes調度到集群的Node上,直到Pod的進程終止而被移除掉。
Pod是在K8s集群中運行部署應用或服務的最小單元,支持多個容器在一個Pod中共享網絡地址和文件系統,可以通過進程間通信和文件共享這種簡單高效的方式組合完成服務。?
比如:運行一個操作系統發行版的軟件倉庫:使用一個Nginx容器用來發布軟件,另一個容器專門用來從源倉庫做同步,這兩個容器的鏡像不太可能是一個團隊開發的,但是他們一塊兒工作才能提供一個微服務;
這種情況下,不同的團隊各自開發構建自己的容器鏡像,在部署的時候組合成一個微服務對外提供服務。?
Pod是K8s集群中所有業務類型的基礎,可以看作運行在K8s集群中的小機器人,不同類型的業務就需要不同類型的小機器人去執行。
目前K8s中的業務主要可以分為長期伺服型(long-running)、批處理型(batch)、節點后臺支撐型(node-daemon)和有狀態應用型(stateful application);分別對應的小機器人控制器為Deployment、Job、DaemonSet和PetSet。?
pod = pause容器 + 業務容器, 業務容器共享pause容器的網絡棧和volume掛載卷。
上述例子中,pause容器,+兩個業務容器,業務容器共享pause容器的網絡棧和volume掛載卷。
二、Node
Node是Kubernetes集群的工作節點,它可以是物理機,也可以是虛擬機。
我們創建的Pod,都運行在Kubernetes集群中的每個Node節點上。而且,在每個Node上還會存在一個運行容器的daemon進程,比如Docker daemon進程,它負責管理Docker容器的運行。
Node在Kubernetes集群中也是一種資源,內部會創建該資源,定義Node示例如下所示:
?
三、namespace
在一個Kubernetes集群中,可以使用Namespace創建多個“虛擬集群”,這些Namespace之間可以完全隔離,也可以通過某種方式,使一個Namespace中的Service可以訪問到其他Namespace中的Service。
查看當前Kubernetes集群中的Namespace列表,執行如下命令:kubectl get namespaces
Namespace是對一組資源和對象的抽象集合,如可以用來將系統內部的對象劃分為不同的項目組或用戶組。
- pods, services, replication controllers和deployments等屬于某一個namespace(默認是default)
- node, persistentVolumes等則不屬于任何namespace??
默認情況下,會有兩個系統自動創建好的Namespace:
- default:Kubernetes集群中沒有Namespace的對象都會放到該默認Namespace中
- kube-system:Kubernetes集群自動創建的Namespace
創建一個名稱為myns的Namespace,配置內容如下所示:
四、service
Service是應用服務的抽象,通過labels為應用提供負載均衡和服務發現,匹配labels的Pod IP和端口列表組成endpoints,由kube-proxy負責將服務IP負載均衡到這些endpoints上。
每個Service都會自動分配一個cluster IP(僅在集群內部可訪問的虛擬地址)和DNS名,其他容器可以通過該地址或DNS來訪問服務,而不需要了解后端容器的運行。
Service從邏輯上定義了一個Pod的集合以及如何訪問這些Pod的策略,有時也被稱作是微服務,它與Pod、ReplicaSet等Kubernetes對象之間的關系,描述如下圖所示:
上圖中,Client請求Service,Service通過Label Selector,將請求轉發到對應的一組Pod上。
同時,ReplicaSet會基于Label Selector來監控Service對應的Pod的數量是否滿足用戶設置的預期個數,最終保證Pod的數量和replica的值一致。
在Kubernetes集群中,每個Node都會運行一個kube-proxy,它主要負責為Service實現一種虛擬IP的代理,這種代理有兩種模式:
- userspace模式
這種模式是在Kubernetes v1.0版本加入的,工作在4層(傳輸層:TCPUDP over IP),稱為userspace模式,如下圖所示:
- iptables模式
這種模式是在Kubernetes v1.1版本新增的,它工作在七層(應用層:HTTP),稱為iptables,如下圖所示:
Service定義了4種服務類型,以滿足使用不同的方式去訪問一個Service,這4種類型包括:ClusterIP、NodePort、LoadBalancer、ExternalName。
- ClusterIP是默認使用的類型,它表示在使用Kubernetes集群內部的IP地址,使用這種方式我們只能在該集群中訪問Service。
- NodePort類型,會在Node節點上暴露一個靜態的IP地址和端口,使得外部通過NodeIP:NodePort的方式就能訪問到該Service。
- LoadBalancer類型,通過使用Cloud提供商提供的負載均衡IP地址,將Service暴露出去。
- ExternalName類型,會使用一個外部的域名來將Service暴露出去(Kubernetes v1.7及以上版本的kube-dns支持該種類型)。
我們可以定義一個Service,對應的配置內容,如下所示:
?以上定義的該服務是一個多端口服務,同時為該服務設置了一個負載均衡的IP(78.11.24.19),所有訪問該服務的應用,通過該負載均衡IP地址都可以訪問到該Service對應的Pod集合中的容器服務(應用服務)。
五、Label
Label是識別Kubernetes對象的標簽,以key/value的方式附加到對象上(key最長不能超過63字節,value可以為空,也可以是不超過253字節的字符串)。
Label不提供唯一性,并且實際上經常是很多對象(如Pods)都使用相同的label來標志具體的應用。
Label定義好后其他對象可以使用Label Selector來選擇一組相同label的對象(比如ReplicaSet和Service用label來選擇一組Pod)。
Label Selector支持以下幾種方式:
等式,如 app=nginx 和 env!=production
集合,如 env in (production, qa)
多個label(它們之間是AND關系),如 app=nginx,env=test
六、Annotations
Annotations是key/value形式附加于對象的注解。不同于Labels用于標志和選擇對象,Annotations則是用來記錄一些附加信息,用來輔助應用部署、安全策略以及調度策略等。
比如deployment使用annotations來記錄rolling update的狀態。
Node是Kubernetes集群的工作節點,它可以是物理機,也可以是虛擬機。我們創建的Pod,都運行在Kubernetes集群中的每個Node節點上。而且,在每個Node上還會存在一個運行容器的daemon進程,比如Docker daemon進程,它負責管理Docker容器的運行。
Node在Kubernetes集群中也是一種資源,內部會創建該資源,定義Node示例如下所示:
| 01 | { |
| 02 | ??"kind": "Node", |
| 03 | ??"apiVersion": "v1", |
| 04 | ??"metadata": { |
| 05 | ????"name": "10.240.79.157", |
| 06 | ????"labels": { |
| 07 | ??????"name": "my-first-k8s-node" |
| 08 | ????} |
| 09 | ??} |
| 10 | } |
總結
以上是生活随笔為你收集整理的kubernetes入门(03)kubernetes的基本概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用户
- 下一篇: next.js 简单使用