k8s中的資源
k8s中所有的內(nèi)容都抽象成了資源,資源實(shí)例化后,稱(chēng)為對(duì)象。所有對(duì)象可以通過(guò) get delete edit apply進(jìn)行增刪改查。通常分類(lèi)以下三類(lèi)資源
- namespace級(jí)別資源:pod、rs、rc、deployment、service、ingress、volume、configmap...
- 集群級(jí)別資源:namespace、node...
- 元數(shù)據(jù)型資源:HPA...
namespace為資源提供了集群內(nèi)的邏輯隔離,需要注意的是,這只是邏輯隔離,不同namespace的pod有可能運(yùn)行在同一個(gè)節(jié)點(diǎn)node上。
pod概念理解
pod是k8s編排管理的最小單元,pod內(nèi)允許運(yùn)行多個(gè)容器,pod內(nèi)的容器共享同一個(gè)網(wǎng)絡(luò)命名空間、Linux協(xié)議棧與存儲(chǔ),pod可以簡(jiǎn)單理解為是一臺(tái)邏輯主機(jī)。
pod的生命周期
在pod的啟動(dòng)過(guò)程中,會(huì)依次執(zhí)行InitC容器與MainC容器。InitC容器順序運(yùn)行,運(yùn)行成功后即銷(xiāo)毀,InitC容器全部運(yùn)行成功后,才會(huì)運(yùn)行MainC容器。
k8s擁有三種方式的探針對(duì)mainc容器健康檢查
- ExecAction: 在容器內(nèi)執(zhí)行執(zhí)行指定命令,命令返回0則認(rèn)為探測(cè)成功。
- TcpSocketAction: 向pod內(nèi)指定端口的容器進(jìn)行tcp檢查,端口已經(jīng)打開(kāi)即為成功。
- HttpGetAction: 向pod內(nèi)指定端口與路徑執(zhí)行http get請(qǐng)求,響應(yīng)嗎在200與400之間即為成功。
mainC容器擁有兩種類(lèi)型探針,readiness檢測(cè)與liveness檢測(cè)
- readiness檢測(cè):就緒檢測(cè),檢測(cè)容器是否已經(jīng)準(zhǔn)備好對(duì)外提供服務(wù),如果檢測(cè)失敗,控制器會(huì)將此pod從endpoints中剔除,這個(gè)pod暫時(shí)不對(duì)外提供服務(wù)。readiness通常用于容器內(nèi)服務(wù)啟動(dòng)成功檢查。
- liveness檢測(cè):存活檢測(cè),檢測(cè)容器是否正在運(yùn)行,如果檢測(cè)失敗,kubelet會(huì)殺死容器,容器會(huì)根據(jù)重啟策略來(lái)重啟。
pod內(nèi)的所有容器都可以擁有exec或httpGet類(lèi)型的鉤子,在容器的啟動(dòng)或銷(xiāo)毀階段執(zhí)行。

pod的生命周期
動(dòng)手實(shí)踐一下吧
通過(guò)kubctl apply -f xxx.yaml創(chuàng)建一個(gè)namespace,再創(chuàng)建一個(gè)運(yùn)行著nginx容器的pod。
apiVersion: v1
# 資源類(lèi)型
kind: Namespace
metadata:
# 創(chuàng)建一個(gè)名稱(chēng)為test的命令空間
name: test
apiVersion: v1
# 資源類(lèi)型
kind: Pod
metadata:
# pod名稱(chēng)
name: pod-test
# pod所在namespace是test
namespace: test
spec:
# initC容器
initContainers:
- name: init-container
image: busybox:latest
command: ['sh','-c','echo init container is running && sleep 3600' ]
# mainC容器
containers:
- name: nginx-pod
image: nginx:latest
ports:
- name: nginx-port
containerPort: 80
# 鉤子
lifecycle:
# 容器啟動(dòng)鉤子
postStart:
exec:
command: ["/bin/sh","-c", "echo pod is starting > /tmp/start "]
#容器關(guān)閉鉤子
preStop:
exec:
command: ["/bin/sh","-c", "echo pod is stoping > /tmp/stop "]
# 就緒檢測(cè)
readinessProbe:
# httpGet檢測(cè),podip:80/index.html
httpGet:
port: 80
path: /index.html
# 存活檢測(cè)
livenessProbe:
# tcp檢測(cè),檢測(cè)80端口是否打開(kāi)
tcpSocket:
port: 80