天天看點

kubernetes資源對象--pod和jobpodJob

pod

Pod是K8S的最小操作單元,一個Pod可以由一個或多個容器組成;

整個K8S系統都是圍繞着Pod展開的,比如如何部署運作Pod、如何保證Pod的數量、如何通路Pod等。

特點

Pod是能夠被建立、排程和管理的最小單元;

每個Pod都有一個獨立的IP;

一個Pod由一個或多個容器構成,并共享命名空間和共享存儲等;Pod所有容器 在同一個Node上;

容器生命周期管理;

對資源使用進行限制,resources(requests、limits);

對容器進行探測:livenessProbe;

叢集内的Pod之間都可以任意通路,這一般是通過一個二層網絡來實作的。

Pod與容器

在Docker中,容器是最小的處理單元,增删改查的對象是容器,容器是一種虛拟化技術,容器之間是隔離的,隔離是基于Linux Namespace實作的。

而在K8S中,Pod包含一個或者多個相關的容器,Pod可以認為是容器的一種延伸擴充,一個Pod也是一個隔離體,而Pod内部包含的一組容器又是共享的(包括PID、Network、IPC、UTS)。除此之外,Pod中的容器可以通路共同的資料卷來實作檔案系統的共享。

資源請求與限制

建立Pod時,可以指定計算資源(目前支援的資源類型有CPU和記憶體),即指定每個容器的資源請求(Request)和資源限制(Limit),資源請求是容器所需的最小資源需求,資源限制則是容器不能超過的資源上限。關系是: 0<=request<=limit<=infinity

Pod的資源請求就是Pod中所有容器資源請求之和。K8S在排程Pod時,會根據Node中的資源總量(通過cAdvisor接口獲得),以及該Node上已使用的計算資源,來判斷該Node是否滿足需求。

資源請求能夠保證Pod有足夠的資源來運作,而資源限制則是防止某個Pod無限制地使用資源,導緻其他Pod崩潰。特别是在公有雲場景,往往會有惡意軟體通過搶占記憶體來攻擊平台。

具體配置請見http://blog.csdn.net/liyingke112/article/details/77452630

一pod多容器

Pod主要是在容器化環境中建立一個面向應用的“邏輯主機”模型,它可以包含一個或多個互相間緊密聯系的容器。當其中任一容器異常時,該Pod也随之異常。

一pod多容器,讓多個同應用的單一容器整合到一個類虛拟機中,使其所有容器共用一個vm的資源,提高耦合度,進而友善副本的複制,提高整體的可用性。

一pod多容器的優勢:

同個Pod下的容器之間能更友善的共享資料和通信,使用相同的網絡命名空間、IP位址和端口區間,互相之間能通過localhost來發現和通信。

在同個Pod内運作的容器共享存儲空間(如果設定),存儲卷内的資料不會在容器重新開機後丢失,同時能被同Pod下别的容器讀取。

相比原生的容器接口,Pod通過提供更高層次的抽象,簡化了應用的部署和管理,不同容器提供不同服務。Pod就像一個管理橫向部署的單元,主機托管、資源共享、協調複制和依賴管理都可以自動處理。

yaml檔案格式請見http://blog.csdn.net/liyingke112/article/details/76155428

Job

概念

在有些場景下,是想要運作一些容器執行某種特定的任務,任務一旦執行完成,容器也就沒有存在的必要了。在這種場景下,建立pod就顯得不那麼合适。于是就是了Job,Job指的就是那些一次性任務。通過Job運作一個容器,當其任務執行完以後,就自動退出,叢集也不再重新将其喚醒。

從程式的運作形态上來區分,可以将Pod分為兩類:長時運作服務(jboss、mysql等)和一次性任務(資料計算、測試)。RC建立的Pod都是長時運作的服務,Job多用于執行一次性任務、批處理工作等,執行完成後便會停止(status.phase變為Succeeded)。

yaml配置參數說明

重新開機政策

支援兩種重新開機政策:

OnFailure:在出現故障時其内部重新開機容器,而不是建立。

Never:會在出現故障時建立新的,且故障job不會消失。

設定逾時

job執行逾時時間可以通過spec.activeDeadlineSeconds來設定,超過指定時間未完成的job會以DeadlineExceeded原因停止

并行

.spec.completions:這個job運作pod的總次數

.spec.parallelism:并發數,每次同時運作多少個pod

當completions少于parallelism,parallelism的值為completions

可以使用kubectl scale指令來增加或者減少completions的值

pod selector

job同樣可以指定selector來關聯pod。需要注意的是job目前可以使用兩個API組來操作,batch/v1和extensions/v1beta1。當使用者需要自定義selector時,使用兩種API組時定義的參數有所差異。

使用batch/v1時,使用者需要将jod的spec.manualSelector設定為true,才可以定制selector。預設為false。

使用extensions/v1beta1時,使用者不需要額外的操作。因為extensions/v1beta1的spec.autoSelector預設為false,該項與batch/v1的spec.manualSelector含義正好相反。換句話說,使用extensions/v1beta1時,使用者不想定制selector時,需要手動将spec.autoSelector設定為true。

例子

kubectl delete -f kube-lykops-job.yaml
cat << EOF > kube-lykops-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
 labels:
 app: job
 project: lykops
 version: v1
 name: lykops-job
 namespace: default
spec:
 completions: 50
 parallelism: 5 template:
 metadata:
 labels:
 app: job
 job-name: lykops-job
 project: lykops
 version: v1
 name: lykops-job
 spec:
 containers:
 - command: ['sleep','60']
 image: web:apache
 name: lykops-job
 restartPolicy: Never
EOF
kubectl create -f kube-lykops-job.yaml
           

細節

job執行完後,不會自動啟動一個新的pod,pod也不會被自動删除。

使用kubectl get pod無法顯示執行完的job的pod,需要添加參數—all-show或者-a,kubectl get pods -a。

本文轉自掘金-

kubernetes資源對象--pod和job