這篇文章主要為大家分享Kubernetes管理pod資源對(duì)象的方法。文中還介紹了Kubernetes中的Namespace,希望大家通過(guò)這篇文章能有所收獲。
創(chuàng)新互聯(lián)公司主營(yíng)東臺(tái)網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都App制作,東臺(tái)h5小程序設(shè)計(jì)搭建,東臺(tái)網(wǎng)站營(yíng)銷推廣歡迎東臺(tái)等地區(qū)企業(yè)咨詢
Deployment、Service、Pod是k8s最核心的3個(gè)資源對(duì)象
Deployment:最常見(jiàn)的無(wú)狀態(tài)應(yīng)用的控制器,支持應(yīng)用的擴(kuò)縮容、滾動(dòng)升級(jí)等操作。
Service:為彈性變動(dòng)且存在生命周期的Pod對(duì)象提供了一個(gè)固定的訪問(wèn)接口,用于服務(wù)發(fā)現(xiàn)和服務(wù)訪問(wèn)。
Pod:是運(yùn)行容器以及調(diào)度的最小單位。同一個(gè)pod可以同時(shí)運(yùn)行多個(gè)容器,這些容器共享net、UTS、IPC,除此之外還有USER、PID、MOUNT。
ReplicationController:用于確保每個(gè)Pod副本在任意時(shí)刻都能滿足目標(biāo)數(shù)量,簡(jiǎn)單來(lái)說(shuō),它用于每個(gè)容器或容器組總是運(yùn)行并且可以訪問(wèn)的:老一代無(wú)狀態(tài)的Pod應(yīng)用控制器。
RwplicatSet:新一代的無(wú)狀態(tài)的Pod應(yīng)用控制器,它與RC的不同之處在于支持的標(biāo)簽選擇器不同,RC只支持等值選擇器(鍵值對(duì)),RS還額外支持基于集合的選擇器。
StatefulSet:用于管理有狀態(tài)的持久化應(yīng)用,如database服務(wù)程序,它與Deployment不同之處在于,它會(huì)為每一個(gè)pod創(chuàng)建一個(gè)獨(dú)有的持久性標(biāo)識(shí)符,并確保每個(gè)pod之間的順序性。
DaemonSet:用于確保每一個(gè)節(jié)點(diǎn)都運(yùn)行了某個(gè)pod的一個(gè)副本,新增的節(jié)點(diǎn)一樣會(huì)被添加到此類pod,在節(jié)點(diǎn)移除時(shí),此pod會(huì)被回收。
Job:用于管理運(yùn)行完成后即可終止的應(yīng)用,例如批量處理做作業(yè)任務(wù);
- Pending:Pod已經(jīng)被創(chuàng)建,但是一個(gè)或者多個(gè)容器還未創(chuàng)建,這包括Pod調(diào)度階段,以及容器鏡像的下載過(guò)程。
- Running:Pod已經(jīng)被調(diào)度到Node,所有容器已經(jīng)創(chuàng)建,并且至少一個(gè)容器在運(yùn)行或者正在重啟。
- Succeeded:Pod中所有容器正常退出。
- Failed:Pod中所有容器退出,至少有一個(gè)容器是一次退出的。
Pod是能夠被創(chuàng)建、調(diào)度和管理的最小單元;
每個(gè)Pod都有一個(gè)獨(dú)立的IP;
一個(gè)Pod由一個(gè)或多個(gè)容器構(gòu)成,并共享命名空間和共享存儲(chǔ)等;Pod所有容器在同一個(gè)Node上;
容器生命周期管理;
對(duì)資源使用進(jìn)行限制,resources(requests、limits);
對(duì)容器進(jìn)行探測(cè):livenessProbe;
集群內(nèi)的Pod之間都可以任意訪問(wèn),這一般是通過(guò)一個(gè)二層網(wǎng)絡(luò)來(lái)實(shí)現(xiàn)的。
在Docker中,容器是最小的處理單元,增刪改查的對(duì)象是容器,容器是一種虛擬化技術(shù),容器之間是隔離的,隔離是基于Linux Namespace實(shí)現(xiàn)的。
而在K8S中,Pod包含一個(gè)或者多個(gè)相關(guān)的容器,Pod可以認(rèn)為是容器的一種延伸擴(kuò)展,一個(gè)Pod也是一個(gè)隔離體,而Pod內(nèi)部包含的一組容器又是共享的(包括PID、Network、IPC、UTS)。除此之外,Pod中的容器可以訪問(wèn)共同的數(shù)據(jù)卷來(lái)實(shí)現(xiàn)文件系統(tǒng)的共享。
創(chuàng)建Pod時(shí),可以指定計(jì)算資源(目前支持的資源類型有CPU和內(nèi)存),即指定每個(gè)容器的資源請(qǐng)求(Request)和資源限制(Limit),資源請(qǐng)求是容器所需的最小資源需求,資源限制則是容器不能超過(guò)的資源上限。關(guān)系是: 0<=request<=limit<=infinity
Pod的資源請(qǐng)求就是Pod中所有容器資源請(qǐng)求之和。K8S在調(diào)度Pod時(shí),會(huì)根據(jù)Node中的資源總量(通過(guò)cAdvisor接口獲得),以及該Node上已使用的計(jì)算資源,來(lái)判斷該Node是否滿足需求。
資源請(qǐng)求能夠保證Pod有足夠的資源來(lái)運(yùn)行,而資源限制則是防止某個(gè)Pod無(wú)限制地使用資源,導(dǎo)致其他Pod崩潰。特別是在公有云場(chǎng)景,往往會(huì)有惡意軟件通過(guò)搶占內(nèi)存來(lái)平臺(tái)。
具體配置請(qǐng)見(jiàn)http://blog.csdn.net/liyingke112/article/details/77452630
Pod主要是在容器化環(huán)境中建立一個(gè)面向應(yīng)用的“邏輯主機(jī)”模型,它可以包含一個(gè)或多個(gè)相互間緊密聯(lián)系的容器。當(dāng)其中任一容器異常時(shí),該P(yáng)od也隨之異常。
一pod多容器,讓多個(gè)同應(yīng)用的單一容器整合到一個(gè)類虛擬機(jī)中,使其所有容器共用一個(gè)vm的資源,提高耦合度,從而方便副本的復(fù)制,提高整體的可用性。
同個(gè)Pod下的容器之間能更方便的共享數(shù)據(jù)和通信,使用相同的網(wǎng)絡(luò)命名空間、IP地址和端口區(qū)間,相互之間能通過(guò)localhost來(lái)發(fā)現(xiàn)和通信。
在同個(gè)Pod內(nèi)運(yùn)行的容器共享存儲(chǔ)空間(如果設(shè)置),存儲(chǔ)卷內(nèi)的數(shù)據(jù)不會(huì)在容器重啟后丟失,同時(shí)能被同Pod下別的容器讀取。
相比原生的容器接口,Pod通過(guò)提供更高層次的抽象,簡(jiǎn)化了應(yīng)用的部署和管理,不同容器提供不同服務(wù)。Pod就像一個(gè)管理橫向部署的單元,主機(jī)托管、資源共享、協(xié)調(diào)復(fù)制和依賴管理都可以自動(dòng)處理。
核心原則是:將多個(gè)應(yīng)用分散到多個(gè)Pod中
原因:基于資源的合理應(yīng)用;擴(kuò)縮容,不同應(yīng)用應(yīng)該有不同的擴(kuò)縮容策略等。
如果容器之間不是必須運(yùn)行在一起的話,那么就放到不同的Pod里
如果容器之前是相互獨(dú)立的組件,那么就放到不同的Pod里
如果容器之前擴(kuò)縮容策略不一樣,那么就放到不同的Pod里
結(jié)論:?jiǎn)蜳od單容器應(yīng)用,除非特殊原因
| 主機(jī) | IP地址 | 服務(wù) |
|---|---|---|
| master | 192.168.1.21 | k8s |
| node01 | 192.168.1.22 | k8s |
| node02 | 192.168.1.23 | k8s |
基于https://blog.51cto.com/14320361/2464655 的實(shí)驗(yàn)繼續(xù)進(jìn)行
默認(rèn)的名稱空間:Default
Namespace(命名空間)是kubernetes系統(tǒng)中的另一個(gè)重要的概念,通過(guò)將系統(tǒng)內(nèi)部的對(duì)象“分配”到不同的Namespace中,形成邏輯上分組的不同項(xiàng)目、小組或用戶組,便于不同的分組在共享使用整個(gè)集群的資源的同時(shí)還能被分別管理。
Kubernetes集群在啟動(dòng)后,會(huì)創(chuàng)建一個(gè)名為“default”的Namespace,如果不特別指明Namespace,則用戶創(chuàng)建的Pod、RC、Service都被系統(tǒng)創(chuàng)建到“default”的Namespace中。
[root@master ~]# kubectl get namespaces
[root@master ~]# kubectl describe ns default
[root@master ~]# kubectl create ns bdqn[root@master ~]# kubectl get namespaces
[root@master ~]# kubectl explain ns
//查看nasespace的yaml文件的格式[root@master ~]# vim test-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test[root@master ~]# kubectl apply -f test-ns.yaml [root@master ~]# kubectl get ns
[root@master ~]# kubectl delete ns test
[root@master ~]# kubectl delete -f test-ns.yaml 注意:namespace資源對(duì)象進(jìn)用于資源對(duì)象的隔離,并不能隔絕不同名稱空間的Pod之間的通信。那是網(wǎng)絡(luò)策略資源的功能。
可使用--namespace或-n選項(xiàng)
[root@master ~]# kubectl get pod -n kube-system
[root@master ~]# kubectl get pod --namespace kube-system [root@master ~]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-app
image: 192.168.1.21:5000/web:v1pod的yaml文件不支持replicas字段
[root@master ~]# kubectl apply -f pod.yaml [root@master ~]# kubectl get pod
ps:這個(gè)pod因?yàn)槭亲约簞?chuàng)建的,所以刪除之后k8s并不會(huì)自動(dòng)生成,相當(dāng)于docker中創(chuàng)建
[root@master ~]# vim pod.yaml
kind: Pod #資源類型
apiVersion: v1 #api版本
metadata:
name: test-pod #指定控制器名稱
namespace: bdqn #指定namespace(名稱空間)
spec:
containers: #容器
- name: test-app #容器名稱
image: 192.168.1.21:5000/web:v1 #鏡像[root@master ~]# kubectl apply -f pod.yaml [root@master ~]# kubectl get pod -n bdqn
//根據(jù)namespace名稱查看
Always:鏡像標(biāo)簽為“l(fā)aster”或鏡像不存在時(shí),總是從指定的倉(cāng)庫(kù)中獲取鏡像。
IfNotPresent:僅當(dāng)本地鏡像不存在時(shí)才從目標(biāo)倉(cāng)庫(kù)下載。
Never:禁止從倉(cāng)庫(kù)中下載鏡像,即只使用本地鏡像。
注意:對(duì)于標(biāo)簽為“l(fā)aster”或者標(biāo)簽不存在,其默認(rèn)的鏡像下載策略為“Always”,而對(duì)于其他的標(biāo)簽鏡像,默認(rèn)策略為“IfNotPresent”。
[root@master ~]# vim pod.yaml
kind: Pod #資源類型
apiVersion: v1 #api版本
metadata:
name: test-pod #指定控制器名稱
namespace: bdqn #指定namespace(名稱空間)
spec:
containers: #容器
- name: test-app #容器名稱
image: 192.168.1.21:5000/web:v1 #鏡像
imagePullPolicy: IfNotPresent #獲取的策略
ports:
- protocol: TCP
containerPort: 80 [root@master ~]# kubectl delete pod -n bdqn test-pod [root@master ~]# kubectl apply -f pod.yaml [root@master ~]# kubectl get pod -n bdqn 
[root@master ~]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: test-pod
namespace: bdqn
spec:
containers:
- name: test-app
image: 192.168.1.21:5000/web:v1
imagePullPolicy: IfNotPresent
ports:
- protocol: TCP
containerPort: 90 #改一下端口[root@master ~]# kubectl delete pod -n bdqn test-pod [root@master ~]# kubectl apply -f pod.yaml [root@master ~]# kubectl get pod -n bdqn -o wide

會(huì)發(fā)現(xiàn)修改的90端口并不生效,他只是一個(gè)提示字段并不生效。
[root@master ~]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: test-pod
namespace: bdqn
labels: #標(biāo)簽
app: test-web #標(biāo)簽名稱
spec:
containers:
- name: test-app
image: 192.168.1.21:5000/web:v1
imagePullPolicy: IfNotPresent
ports:
- protocol: TCP
containerPort: 90 #改一下端口[root@master ~]# vim test-svc.yaml
apiVersion: v1 #api版本
kind: Service #資源類型
metadata:
name: test-svc #指定控制器名稱
namespace: bdqn #指定namespace(名稱空間)
spec:
selector: #標(biāo)簽
app: test-web #標(biāo)簽名稱(須和pod的標(biāo)簽名稱一致)
ports:
- port: 80 #宿主機(jī)端口
targetPort: 80 #容器端口會(huì)發(fā)現(xiàn)添加的80端口生效了,所以不能亂改。
[root@master ~]# kubectl apply -f test-svc.yaml[root@master ~]# kubectl get svc -n bdqn 
[root@master ~]# kubectl describe svc -n bdqn test-svc 
[root@master ~]# curl 10.98.57.97 
Pod的重啟策略(RestartPolicy)應(yīng)用與Pod內(nèi)所有容器,并且僅在Pod所處的Node上由kubelet進(jìn)行判斷和重啟操作。當(dāng)某個(gè)容器異常退出或者健康檢查失敗時(shí),kubelet將根據(jù)RestartPolicy的設(shè)置來(lái)進(jìn)行相應(yīng)的操作。
Always:(默認(rèn)情況下使用)但凡Pod對(duì)象終止就將其重啟;
OnFailure:僅在Pod對(duì)象出現(xiàn)錯(cuò)誤時(shí)才將其重啟;
Never:從不重啟;
每個(gè)容器啟動(dòng)時(shí)都會(huì)執(zhí)行一個(gè)進(jìn)程,此進(jìn)程由 Dockerfile 的 CMD 或 ENTRYPOINT 指定。如果進(jìn)程退出時(shí)返回碼非零,則認(rèn)為容器發(fā)生故障,Kubernetes 就會(huì)根據(jù) restartPolicy 重啟容器。
下面我們模擬一個(gè)容器發(fā)生故障的場(chǎng)景,Pod 配置文件如下:
[root@master ~]# vim healcheck.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
test: healcheck
name: healcheck
spec:
restartPolicy: OnFailure #指定重啟策略
containers:
- name: healcheck
image: busybox:latest
args: #生成pod時(shí)運(yùn)行的命令
- /bin/sh
- -c
- sleep 20; exit 1 [root@master ~]# kubectl apply -f healcheck.yaml[root@master ~]# kubectl get pod -o wide
[root@master ~]# kubectl get pod -w | grep healcheck
在上面的例子中,容器進(jìn)程返回值非零,Kubernetes 則認(rèn)為容器發(fā)生故障,需要重啟。但有不少情況是發(fā)生了故障,但進(jìn)程并不會(huì)退出。
[root@master ~]# kubectl create ns xgp[root@master ~]# kubectl get ns xgp 
[root@master ~]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: test-pod
namespace: xgp
labels:
app: test-web
spec:
restartPolicy: Never
containers:
- name: www
image: 192.168.1.21:5000/web:v1
imagePullPolicy: Never
args:
- /bin/sh
- -c
- sleep 90; exit 1
ports:
- protocol: TCP
containerPort: 80[root@master ~]# kubectl apply -f pod.yaml [root@master ~]# kubectl get pod -n xgp -w | grep test-pod
刪除test-pod
[root@master ~]# kubectl delete pod -n xgp test-pod
[root@master ~]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: test-pod
namespace: xgp
labels:
app: test-web
spec:
restartPolicy: Never
containers:
- name: www
image: 192.168.1.21:5000/web:v1
imagePullPolicy: Never
ports:
- protocol: TCP
containerPort: 80[root@master ~]# vim svc.yaml
apiVersion: v1
kind: Service
metadata:
name: test-svc
namespace: xgp
spec:
selector:
app: test-web
ports:
- port: 80
targetPort: 80[root@master ~]# kubectl apply -f svc.yaml [root@master ~]# kubectl get pod -o wide -n xgp 
[root@master ~]# curl 10.244.1.21
看完上述內(nèi)容,你們對(duì)pod資源對(duì)象有進(jìn)一步的了解嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。
分享題目:Kubernetes管理pod資源對(duì)象
網(wǎng)址分享:http://chinadenli.net/article6/ipcjog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、商城網(wǎng)站、品牌網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、小程序開(kāi)發(fā)、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)