Kubernetes学习笔记(一)
2019獨角獸企業重金招聘Python工程師標準>>>
Kubernetes學習筆記(一) 博客分類: Kubernetes導語
2015年4月,傳聞已久的Borg論文伴隨Kubernetes的高調宣傳被谷歌首次公開;?
Kubernetes是一個完備的分布式系統支撐平臺,具有完備的集群管理能力,包括多層次的安全防護和準入機制、多租戶應用支撐能力、透明的服務注冊和服務發現機制、內建智能負載均衡器、強大的故障發現和自我修復能力、服務滾動升級和在線擴容能力、可擴展的資源自動調度機制,以及多粒度的資源配額管理能力。同時,Kubernetes還提供了完善的管理工具,這些工具涵蓋了包括開發、部署測試、運維監控在內的各個環節。因此,Kubernetes是一個全新的基于容器技術的分布式架構解決方案,并且是一個一站式的完備的分布式系統開發和支撐平臺。
一、核心概念
1、Node
Node作為集群中的工作節點,運行真正的應用程序,在Node上Kubernetes管理的最小運行單元是Pod。Node上運行著Kubernetes的Kubelet、kube-proxy服務進程,這些服務進程負責Pod的創建、啟動、監控、重啟、銷毀、以及實現軟件模式的負載均衡。
Node包含的信息:
- Node地址:主機的IP地址,或Node ID。
- Node的運行狀態:Pending、Running、Terminated三種狀態。
- Node Condition:…
- Node系統容量:描述Node可用的系統資源,包括CPU、內存、最大可調度Pod數量等。
- 其他:內核版本號、Kubernetes版本等。
查看Node信息:
kubectl describe node2、Pod
Pod是Kubernetes最基本的操作單元,包含一個或多個緊密相關的容器,一個Pod可以被一個容器化的環境看作應用層的“邏輯宿主機”;一個Pod中的多個容器應用通常是緊密耦合的,Pod在Node上被創建、啟動或者銷毀;每個Pod里運行著一個特殊的被稱之為Pause的容器,其他容器則為業務容器,這些業務容器共享Pause容器的網絡棧和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名作為容器間通信的主機名等。
3、Service
在Kubernetes的世界里,雖然每個Pod都會被分配一個單獨的IP地址,但這個IP地址會隨著Pod的銷毀而消失,這就引出一個問題:如果有一組Pod組成一個集群來提供服務,那么如何來訪問它呢?Service!
一個Service可以看作一組提供相同服務的Pod的對外訪問接口,Service作用于哪些Pod是通過Label Selector來定義的。
- 擁有一個指定的名字(比如my-mysql-server);
- 擁有一個虛擬IP(Cluster IP、Service IP或VIP)和端口號,銷毀之前不會改變,只能內網訪問;
- 能夠提供某種遠程服務能力;
- 被映射到了提供這種服務能力的一組容器應用上;
如果Service要提供外網服務,需指定公共IP和NodePort,或外部負載均衡器;
NodePort?
系統會在Kubernetes集群中的每個Node上打開一個主機的真實端口,這樣,能夠訪問Node的客戶端就能通過這個端口訪問到內部的Service了
4、Volume
Volume是Pod中能夠被多個容器訪問的共享目錄。
5、Label
Label以key/value的形式附加到各種對象上,如Pod、Service、RC、Node等,以識別這些對象,管理關聯關系等,如Service和Pod的關聯關系。
6、RC(Replication Controller)
- 目標Pod的定義;
- 目標Pod需要運行的副本數量;
- 要監控的目標Pod標簽(Lable);
Kubernetes通過RC中定義的Lable篩選出對應的Pod實例,并實時監控其狀態和數量,如果實例數量少于定義的副本數量(Replicas),則會根據RC中定義的Pod模板來創建一個新的Pod,然后將此Pod調度到合適的Node上啟動運行,直到Pod實例數量達到預定目標。
二、Kubernetes總體架構
Master和Node
Kubernetes將集群中的機器劃分為一個Master節點和一群工作節點(Node)。其中,Master節點上運行著集群管理相關的一組進程etcd、API Server、Controller Manager、Scheduler,后三個組件構成了Kubernetes的總控中心,這些進程實現了整個集群的資源管理、Pod調度、彈性伸縮、安全控制、系統監控和糾錯等管理功能,并且全都是自動完成。在每個Node上運行Kubelet、Proxy、Docker?daemon三個組件,負責對本節點上的Pod的生命周期進行管理,以及實現服務代理的功能。
流程?
通過Kubectl提交一個創建RC的請求,該請求通過API Server被寫入etcd中,此時Controller Manager通過API Server的監聽資源變化的接口監聽到這個RC事件,分析之后,發現當前集群中還沒有它所對應的Pod實例,于是根據RC里的Pod模板定義生成一個Pod對象,通過API Server寫入etcd,接下來,此事件被Scheduler發現,它立即執行一個復雜的調度流程,為這個新Pod選定一個落戶的Node,然后通過API Server講這一結果寫入到etcd中,隨后,目標Node上運行的Kubelet進程通過API Server監測到這個“新生的”Pod,并按照它的定義,啟動該Pod并任勞任怨地負責它的下半生,直到Pod的生命結束。
隨后,我們通過Kubectl提交一個新的映射到該Pod的Service的創建請求,Controller Manager會通過Label標簽查詢到相關聯的Pod實例,然后生成Service的Endpoints信息,并通過API Server寫入到etcd中,接下來,所有Node上運行的Proxy進程通過API Server查詢并監聽Service對象與其對應的Endpoints信息,建立一個軟件方式的負載均衡器來實現Service訪問到后端Pod的流量轉發功能。
-
etcd?
用于持久化存儲集群中所有的資源對象,如Node、Service、Pod、RC、Namespace等;API Server提供了操作etcd的封裝接口API,這些API基本上都是集群中資源對象的增刪改查及監聽資源變化的接口。 -
API Server?
提供了資源對象的唯一操作入口,其他所有組件都必須通過它提供的API來操作資源數據,通過對相關的資源數據“全量查詢”+“變化監聽”,這些組件可以很“實時”地完成相關的業務功能。 -
Controller Manager?
集群內部的管理控制中心,其主要目的是實現Kubernetes集群的故障檢測和恢復的自動化工作,比如根據RC的定義完成Pod的復制或移除,以確保Pod實例數符合RC副本的定義;根據Service與Pod的管理關系,完成服務的Endpoints對象的創建和更新;其他諸如Node的發現、管理和狀態監控、死亡容器所占磁盤空間及本地緩存的鏡像文件的清理等工作也是由Controller Manager完成的。 -
Scheduler?
集群中的調度器,負責Pod在集群節點中的調度分配。 -
Kubelet?
負責本Node節點上的Pod的創建、修改、監控、刪除等全生命周期管理,同時Kubelet定時“上報”本Node的狀態信息到API Server里。 -
Proxy?
實現了Service的代理與軟件模式的負載均衡器。
客戶端通過Kubectl命令行工具或Kubectl Proxy來訪問Kubernetes系統,在Kubernetes集群內部的客戶端可以直接使用Kuberctl命令管理集群。Kubectl Proxy是API Server的一個反向代理,在Kubernetes集群外部的客戶端可以通過Kubernetes Proxy來訪問API Server。
API Server內部有一套完備的安全機制,包括認證、授權和準入控制等相關模塊。
三、Hello World
啟動Kubernetes
systemctl start etcd systemctl start docker systemctl start kube-apiserver systemctl start kube-controller-manager systemctl start kube-scheduler systemctl start kubelet systemctl start kube-proxy kubectl delete service redis-master //刪除原來的Service,Pod、RC命令類似- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
定義RC來創建Pod?
Redis-master-controller.yaml
執行命令,將它發布到kubernetes集群中:
kubectl create -f redis-master-controller.yaml查看命令
kubectl get rc kubectl get pods提供Redis服務的Pod已經創建并正常運行了,接下來創建一個與之關聯的Service服務?
redis-master-service.yaml
執行命令:
kubectl create -f redis-master-service.yaml kubectl get services創建成功后會分配IP、端口,但由于IP地址是在服務創建后由Kubernetes系統自動分配的,在其他Pod中無法預先知道某個Service的虛擬IP地址,因此需要一個機制來找到這個服務。為此,Kubernetes巧妙地使用了Linux環境變量,在每個Pod的容器里都增加了一組Service相關的環境變量,用來記錄從服務名到虛擬IP地址的映射關系。以redis-master服務為例,在容器的環境變量中會增加如下兩條記錄
REDIS_MASTER_SERVICE_HOST=10.254.144.74 REDIS_MASTER_SERVICE_PORT=6379于是,其他應用就可以通過環境變量得到redis-master服務的虛擬IP、端口;
redis-slave-controller.yaml
apiVersion: v1 kind: ReplicatioinController metadata:name: redis-slavelabels:name: redis-slave spec:replicas: 2selector:name: redis-slavetemplate:metadata:labels:name:redis-slavespec:containers:- name: slaveimage: kubeguide/guestbook-redis-slaveenv:- name: GET_HOSTS_FROMvalue: envports:- containerPort: 6379執行命令
kubectl create -f redis-slave-controller.yaml kubectl get rc kubectl get pods為了實現Redis集群的主從數據同步,redis-slave需要知道redis-master的地址,所以在redis-slave鏡像的啟動命令/run.sh中,其最后的啟動命令為:
redis-server --slaveof ${REDIS_MASTER_SERVICE_HOST} 6379redis-slave-service.yaml
apiVersion: v1 kind: Service metadata:name: redis-slavelabels:name: redis-slave spec:ports:- port: 6379selector:name: redis-slave執行命令:
kubectl create -f redis-slave-service.yaml kubectl get services創建web Pod和Service?
frontend-controller.yaml
執行命令
kubectl create -f frontend-controller.yaml kubectl get rc kubectl get pods- 1
- 2
- 3
- 1
- 2
- 3
frontend-service.yaml
apiVersion: v1 kind: Service metadata:name: frontendlabels:name: frontendspec:type: NodePortports:- port: 80nodePort: 30001 //物理機上的端口selector:name: frontend執行命令
kubectl create -f frontend-service.yaml kubectl get services http://blog.csdn.net/test103/article/details/55663562轉載于:https://my.oschina.net/xiaominmin/blog/1598596
總結
以上是生活随笔為你收集整理的Kubernetes学习笔记(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ant编译、FatJar编译方式
- 下一篇: 如何使用Elasticsearch gr