這篇文章主要為大家分享Kubernetes管理pod資源對象的方法。文中還介紹了Kubernetes中的Namespace,希望大家通過這篇文章能有所收獲。
創(chuàng)新互聯(lián)公司主營東臺網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App制作,東臺h5小程序設(shè)計搭建,東臺網(wǎng)站營銷推廣歡迎東臺等地區(qū)企業(yè)咨詢
Deployment、Service、Pod是k8s最核心的3個資源對象
Deployment:最常見的無狀態(tài)應(yīng)用的控制器,支持應(yīng)用的擴(kuò)縮容、滾動升級等操作。
Service:為彈性變動且存在生命周期的Pod對象提供了一個固定的訪問接口,用于服務(wù)發(fā)現(xiàn)和服務(wù)訪問。
Pod:是運(yùn)行容器以及調(diào)度的最小單位。同一個pod可以同時運(yùn)行多個容器,這些容器共享net、UTS、IPC,除此之外還有USER、PID、MOUNT。
ReplicationController:用于確保每個Pod副本在任意時刻都能滿足目標(biāo)數(shù)量,簡單來說,它用于每個容器或容器組總是運(yùn)行并且可以訪問的:老一代無狀態(tài)的Pod應(yīng)用控制器。
RwplicatSet:新一代的無狀態(tài)的Pod應(yīng)用控制器,它與RC的不同之處在于支持的標(biāo)簽選擇器不同,RC只支持等值選擇器(鍵值對),RS還額外支持基于集合的選擇器。
StatefulSet:用于管理有狀態(tài)的持久化應(yīng)用,如database服務(wù)程序,它與Deployment不同之處在于,它會為每一個pod創(chuàng)建一個獨(dú)有的持久性標(biāo)識符,并確保每個pod之間的順序性。
DaemonSet:用于確保每一個節(jié)點(diǎn)都運(yùn)行了某個pod的一個副本,新增的節(jié)點(diǎn)一樣會被添加到此類pod,在節(jié)點(diǎn)移除時,此pod會被回收。
Job:用于管理運(yùn)行完成后即可終止的應(yīng)用,例如批量處理做作業(yè)任務(wù);
- Pending:Pod已經(jīng)被創(chuàng)建,但是一個或者多個容器還未創(chuàng)建,這包括Pod調(diào)度階段,以及容器鏡像的下載過程。
- Running:Pod已經(jīng)被調(diào)度到Node,所有容器已經(jīng)創(chuàng)建,并且至少一個容器在運(yùn)行或者正在重啟。
- Succeeded:Pod中所有容器正常退出。
- Failed:Pod中所有容器退出,至少有一個容器是一次退出的。
Pod是能夠被創(chuàng)建、調(diào)度和管理的最小單元;
每個Pod都有一個獨(dú)立的IP;
一個Pod由一個或多個容器構(gòu)成,并共享命名空間和共享存儲等;Pod所有容器在同一個Node上;
容器生命周期管理;
對資源使用進(jìn)行限制,resources(requests、limits);
對容器進(jìn)行探測:livenessProbe;
集群內(nèi)的Pod之間都可以任意訪問,這一般是通過一個二層網(wǎng)絡(luò)來實(shí)現(xiàn)的。
在Docker中,容器是最小的處理單元,增刪改查的對象是容器,容器是一種虛擬化技術(shù),容器之間是隔離的,隔離是基于Linux Namespace實(shí)現(xiàn)的。
而在K8S中,Pod包含一個或者多個相關(guān)的容器,Pod可以認(rèn)為是容器的一種延伸擴(kuò)展,一個Pod也是一個隔離體,而Pod內(nèi)部包含的一組容器又是共享的(包括PID、Network、IPC、UTS)。除此之外,Pod中的容器可以訪問共同的數(shù)據(jù)卷來實(shí)現(xiàn)文件系統(tǒng)的共享。
創(chuàng)建Pod時,可以指定計算資源(目前支持的資源類型有CPU和內(nèi)存),即指定每個容器的資源請求(Request)和資源限制(Limit),資源請求是容器所需的最小資源需求,資源限制則是容器不能超過的資源上限。關(guān)系是: 0<=request<=limit<=infinity
Pod的資源請求就是Pod中所有容器資源請求之和。K8S在調(diào)度Pod時,會根據(jù)Node中的資源總量(通過cAdvisor接口獲得),以及該Node上已使用的計算資源,來判斷該Node是否滿足需求。
資源請求能夠保證Pod有足夠的資源來運(yùn)行,而資源限制則是防止某個Pod無限制地使用資源,導(dǎo)致其他Pod崩潰。特別是在公有云場景,往往會有惡意軟件通過搶占內(nèi)存來平臺。
具體配置請見http://blog.csdn.net/liyingke112/article/details/77452630
Pod主要是在容器化環(huán)境中建立一個面向應(yīng)用的“邏輯主機(jī)”模型,它可以包含一個或多個相互間緊密聯(lián)系的容器。當(dāng)其中任一容器異常時,該P(yáng)od也隨之異常。
一pod多容器,讓多個同應(yīng)用的單一容器整合到一個類虛擬機(jī)中,使其所有容器共用一個vm的資源,提高耦合度,從而方便副本的復(fù)制,提高整體的可用性。
同個Pod下的容器之間能更方便的共享數(shù)據(jù)和通信,使用相同的網(wǎng)絡(luò)命名空間、IP地址和端口區(qū)間,相互之間能通過localhost來發(fā)現(xiàn)和通信。
在同個Pod內(nèi)運(yùn)行的容器共享存儲空間(如果設(shè)置),存儲卷內(nèi)的數(shù)據(jù)不會在容器重啟后丟失,同時能被同Pod下別的容器讀取。
相比原生的容器接口,Pod通過提供更高層次的抽象,簡化了應(yīng)用的部署和管理,不同容器提供不同服務(wù)。Pod就像一個管理橫向部署的單元,主機(jī)托管、資源共享、協(xié)調(diào)復(fù)制和依賴管理都可以自動處理。
核心原則是:將多個應(yīng)用分散到多個Pod中
原因:基于資源的合理應(yīng)用;擴(kuò)縮容,不同應(yīng)用應(yīng)該有不同的擴(kuò)縮容策略等。
如果容器之間不是必須運(yùn)行在一起的話,那么就放到不同的Pod里
如果容器之前是相互獨(dú)立的組件,那么就放到不同的Pod里
如果容器之前擴(kuò)縮容策略不一樣,那么就放到不同的Pod里
結(jié)論:單Pod單容器應(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)中的另一個重要的概念,通過將系統(tǒng)內(nèi)部的對象“分配”到不同的Namespace中,形成邏輯上分組的不同項(xiàng)目、小組或用戶組,便于不同的分組在共享使用整個集群的資源的同時還能被分別管理。
Kubernetes集群在啟動后,會創(chuàng)建一個名為“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資源對象進(jìn)用于資源對象的隔離,并不能隔絕不同名稱空間的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:v1
pod的yaml文件不支持replicas字段
[root@master ~]# kubectl apply -f pod.yaml
[root@master ~]# kubectl get pod
ps:這個pod因?yàn)槭亲约簞?chuàng)建的,所以刪除之后k8s并不會自動生成,相當(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”或鏡像不存在時,總是從指定的倉庫中獲取鏡像。
IfNotPresent:僅當(dāng)本地鏡像不存在時才從目標(biāo)倉庫下載。
Never:禁止從倉庫中下載鏡像,即只使用本地鏡像。
注意:對于標(biāo)簽為“l(fā)aster”或者標(biāo)簽不存在,其默認(rèn)的鏡像下載策略為“Always”,而對于其他的標(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
會發(fā)現(xiàn)修改的90端口并不生效,他只是一個提示字段并不生效。
[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 #容器端口
會發(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)某個容器異常退出或者健康檢查失敗時,kubelet將根據(jù)RestartPolicy的設(shè)置來進(jìn)行相應(yīng)的操作。
Always:(默認(rèn)情況下使用)但凡Pod對象終止就將其重啟;
OnFailure:僅在Pod對象出現(xiàn)錯誤時才將其重啟;
Never:從不重啟;
每個容器啟動時都會執(zhí)行一個進(jìn)程,此進(jìn)程由 Dockerfile 的 CMD 或 ENTRYPOINT 指定。如果進(jìn)程退出時返回碼非零,則認(rèn)為容器發(fā)生故障,Kubernetes 就會根據(jù) restartPolicy
重啟容器。
下面我們模擬一個容器發(fā)生故障的場景,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時運(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)程并不會退出。
[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)容,你們對pod資源對象有進(jìn)一步的了解嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。
分享題目:Kubernetes管理pod資源對象
網(wǎng)址分享:http://www.rwnh.cn/article6/ipcjog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、商城網(wǎng)站、品牌網(wǎng)站制作、網(wǎng)站設(shè)計、小程序開發(fā)、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)