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