1 Pod結(jié)構(gòu)
Pod是kubernetes集群進(jìn)行管理的最小單元,程序要運(yùn)行必須部署在容器中,而容器必須存在于Pod中。Pod可以認(rèn)為是容器的封裝,一個(gè)Pod中可以存在一個(gè)或者多個(gè)容器。
每個(gè)Pod中都可以包含一個(gè)或者多個(gè)容器,這些容器可以分為兩類(lèi):
用戶程序所在的容器,數(shù)量可多可少
-
Pause容器,這是每個(gè)Pod都會(huì)有的一個(gè)根容器,它的作用有兩個(gè):
可以以它為依據(jù),評(píng)估整個(gè)Pod的健康狀態(tài)
可以在根容器上設(shè)置Ip地址,其它容器都此Ip(Pod IP),以實(shí)現(xiàn)Pod內(nèi)部的網(wǎng)路通信
2 Pod定義
pod yaml 文件格式
apiVersion: v1 #必選,版本號(hào),例如v1
kind: Pod #必選,資源類(lèi)型,例如 Pod
metadata: #必選,元數(shù)據(jù)
name: string #必選,Pod名稱(chēng)
namespace: string #Pod所屬的命名空間,默認(rèn)為"default"
labels: #自定義標(biāo)簽列表
- name: string
spec: #必選,Pod中容器的詳細(xì)定義
containers: #必選,Pod中容器列表
- name: string #必選,容器名稱(chēng)
image: string #必選,容器的鏡像名稱(chēng)
imagePullPolicy: [ Always|Never|IfNotPresent ] #獲取鏡像的策略
command: [string] #容器的啟動(dòng)命令列表,如不指定,使用打包時(shí)使用的啟動(dòng)命令
args: [string] #容器的啟動(dòng)命令參數(shù)列表
workingDir: string #容器的工作目錄
volumeMounts: #掛載到容器內(nèi)部的存儲(chǔ)卷配置
- name: string #引用pod定義的共享存儲(chǔ)卷的名稱(chēng),需用volumes[]部分定義的的卷名
mountPath: string #存儲(chǔ)卷在容器內(nèi)mount的絕對(duì)路徑,應(yīng)少于512字符
readOnly: boolean #是否為只讀模式
ports: #需要暴露的端口庫(kù)號(hào)列表
- name: string #端口的名稱(chēng)
containerPort: int #容器需要監(jiān)聽(tīng)的端口號(hào)
hostPort: int #容器所在主機(jī)需要監(jiān)聽(tīng)的端口號(hào),默認(rèn)與Container相同
protocol: string #端口協(xié)議,支持TCP和UDP,默認(rèn)TCP
env: #容器運(yùn)行前需設(shè)置的環(huán)境變量列表
- name: string #環(huán)境變量名稱(chēng)
value: string #環(huán)境變量的值
在這里,可通過(guò)一個(gè)命令來(lái)查看每種資源的可配置項(xiàng)
# kubectl explain 資源類(lèi)型 查看某種資源可以配置的一級(jí)屬性
# kubectl explain 資源類(lèi)型.屬性 查看屬性的子屬性
[root@k8s-master01 ~]# kubectl explain pod
KIND: Pod
VERSION: v1
FIELDS:
apiVersion <string>
kind <string>
metadata <Object>
spec <Object>
status <Object>
[root@k8s-master01 ~]# kubectl explain pod.metadata
3 Pod 基本操作
在上面一節(jié)中提到pod yaml文件基本格式,其中重點(diǎn)的spec參數(shù),這一節(jié)我們以一個(gè)例子作為講解
首先編寫(xiě)一個(gè)簡(jiǎn)單的nginx yaml 文件
apiVersion: v1
kind: Pod
metadata:
name: pod-base
namespace: dev
labels:
user: k8s-admin
spec:
containers:
- name: nginx
image: nginx:1.19
- name: busybox
image: busybox:1.30
創(chuàng)建Pod
[root@k8s-master01 pod]# kubectl apply -f pod-base.yaml
pod/pod-base created
查看Pod狀況
[root@k8s-master01 pod]# kubectl get pod -n dev
可以通過(guò)describe查看內(nèi)部的詳情
[root@k8s-master01 pod]# kubectl describe pod pod-base -n dev
進(jìn)入pod中的busybox容器,查看文件內(nèi)容
命令: kubectl exec pod名稱(chēng) -n 命名空間 -it -c 容器名稱(chēng) /bin/sh 在容器內(nèi)部執(zhí)行命
kubectl exec pod-command -n dev -it -c busybox /bin/sh
鏡像拉取
apiVersion: v1
kind: Pod
metadata:
name: pod-imagepullpolicy
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.19
imagePullPolicy: Never # 用于設(shè)置鏡像拉取策略
imagePullPolicy,用于設(shè)置鏡像拉取策略,kubernetes支持配置三種拉取策略:
- Always:總是從遠(yuǎn)程倉(cāng)庫(kù)拉取鏡像(一直遠(yuǎn)程下載)
- IfNotPresent:本地有則使用本地鏡像,本地沒(méi)有則從遠(yuǎn)程倉(cāng)庫(kù)拉取鏡像(本地有就本地 本地沒(méi)遠(yuǎn)程下載)
- Never:只使用本地鏡像,從不去遠(yuǎn)程倉(cāng)庫(kù)拉取,本地沒(méi)有就報(bào)錯(cuò) (一直使用本地)
默認(rèn)值說(shuō)明:
如果鏡像tag為具體版本號(hào), 默認(rèn)策略是:IfNotPresent
如果鏡像tag為:latest(最終版本) ,默認(rèn)策略是always
端口設(shè)置,也就是containers的ports選項(xiàng)。
apiVersion: v1
kind: Pod
metadata:
name: pod-ports
namespace: dev
spec:
containers:
- name: nginx
image: nginx:latest
ports: # 設(shè)置容器暴露的端口列表 對(duì)外提供服務(wù)的端口
- name: nginx-port
containerPort: 80 # 指定端口號(hào)
protocol: TCP #指定端口通訊協(xié)議
資源配額
容器中的程序要運(yùn)行,肯定是要占用一定資源的,比如cpu和內(nèi)存等,如果不對(duì)某個(gè)容器的資源做限制,那么它就可能吃掉大量資源,導(dǎo)致其它容器無(wú)法運(yùn)行。針對(duì)這種情況,kubernetes提供了對(duì)內(nèi)存和cpu的資源進(jìn)行配額的機(jī)制,這種機(jī)制主要通過(guò)resources選項(xiàng)實(shí)現(xiàn),他有兩個(gè)子選項(xiàng):
- limits:用于限制運(yùn)行時(shí)容器的最大占用資源,當(dāng)容器占用資源超過(guò)limits時(shí)會(huì)被終止,并進(jìn)行重啟
- requests :用于設(shè)置容器需要的最小資源,如果環(huán)境資源不夠,容器將無(wú)法啟動(dòng)
接下來(lái),編寫(xiě)一個(gè)測(cè)試案例,創(chuàng)建pod-resources.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-resources
namespace: dev
spec:
containers:
- name: nginx
image: nginx:latest
resources: # 資源配額
limits: # 限制資源(上限)
cpu: "2" # CPU限制,單位是core數(shù)
memory: "10Gi" # 內(nèi)存限制
requests: # 請(qǐng)求資源(下限)
cpu: "1" # CPU限制,單位是core數(shù)
memory: "10Mi" # 內(nèi)存限制
在這對(duì)cpu和memory的單位做一個(gè)說(shuō)明:
- cpu:core數(shù),可以為整數(shù)或小數(shù)
- memory: 內(nèi)存大小,可以使用Gi、Mi、G、M等形式