您好,登錄后才能下訂單哦!
這篇文章主要介紹kubernetes中Pod是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
一:Pod 是什么
Pod是Kubernetes的最重要最基本的概念。它是能夠被創建,調度和管理的最小部署單元。一個Pod代表集群中一個運行的進程。
二:Pod的組成
一個Pod由一個特殊的根容器Pause容器和若干個緊密相關的用戶業務容器組成。
Pause容器作為Pod的根容器,它的狀態代表整個容器組的狀態。
Pod里的多個容器共享Pause容器的IP,共享Pause容器掛載的Volume.
Kubernetes為每個Pod都分配了唯一的IP地址,稱之為Pod IP,一個Pod里的多個容器共享Pod IP地址。Kubernetes要求底層網絡支持集群內任意兩個Pod之間的TCP/IP直接通信,這通常采用虛擬二層網絡技術來實現。一個Pod里的容器與另外主機上的Pod容器能夠直接通信。
Pod里面的容器除了共享網絡和存儲外,還共享:
PID namespace:一個Pod內的容器能夠看到對方容器的進程
IPC namespace:一個Pod內的容器能夠使用POSIX消息隊列進行通信
UTS namespace : 一個Pod內的容器共享主機名。
Pod一旦被創建,就會被放入的etcd中存儲,隨后會被Master調度到某個具體的Node上進行綁定,隨后該Pod被對應的Node上的kubelet進程實例化一組相關的Docker容器并啟動起來。在默認情況下,當Pod里的某個容器停止時,Kubernetes會重啟整個Pod;如果Pod所在的Node宕機,則會將這個Node上的所有Pod重新調度到其他節點上。
Event是一個事件的記錄,記錄事件的最早產生時間,最后重現時間,重復次數,發起者,類型以及導致此事件的原因等眾多信息。 Pod同樣有Event記錄,可以用來定位問題查找原因。
三:Pod的生命周期
Pod的重啟策略(RestartPolicy)應用于Pod內所有的容器,并且僅在Pod所處的Node上由kubelet進行判斷和重啟操作。
Pod的重啟策略包括Always、OnFailure及Nerver,默認值為Always。
四:Pod的健康檢查
對Pod的健康檢查可以通過兩類探針來檢查:LivenessProbe和ReadinessProbe:
LivenessProbe探針:用于判斷容器是否存活(running狀態),如果LivenessProbe探針探測到容器不健康,則kubelet殺掉該容器,并根據容器的重啟策略做響應處理.
ReadinessProbe探針:用于判斷容器是否啟動完成(ready狀態),可以接受請求。如果ReadinessProbe探針探測失敗,則Pod的狀態被修改。Endpoint Controller將從service的Endpoint中刪除包含該容器所在的Pod的Endpoint。
kubelet定制執行LivenessProbe探針來診斷容器的健康狀況,有三種方式:
1.ExecAction:在容器內部執行一個命令,如果該命令的返回值為0,則表示容器健康。
2.TCPSocketAction:通過容器ip地址和端口號執行TCP檢查,如果能夠建立tcp連接表明容器健康。
3.HTTPGetAction:通過容器Ip地址、端口號及路徑調用http get方法,如果響應的狀態嗎大于200且小于400,則認為容器健康。
五:Pod的調度
在Kubernetes系統中,Pod在大部分場景下都只是容器的載體而已,通常需要通過RC、Deployment、DaemonSet、Job等對象來完成Pod的調度和自動控制功能。
全自動調度:
NodeSelector:定向調度
Kubernetes Master上的scheduler服務(kube-Scheduler進程)負責實現Pod的調度,整個過程通過一系列復雜的算法,最終為每個Pod計算出一個最佳的目標節點,通常我們無法知道Pod最終會被調度到哪個節點上。實際情況中,我們需要將Pod調度到我們指定的節點上,可以通過Node的標簽和pod的nodeSelector屬性相匹配來達到目的。
NodeAffinity:親和性調度
該調度策略是將來替換NodeSelector的新一代調度策略。由于NodeSelector通過Node的Label進行精確匹配,所有NodeAffinity增加了In、NotIn、Exists、DoesNotexist、Gt、Lt等操作符來選擇Node。調度側露更加靈活
DaemonSet特定場景調度:
如
在每個Node上運行一個日志采集程序,例如fluentd或者logstach。
批處理調度:
六:Pod的文件配置
Kubernetes里的所有資源對象都采用yaml或者JSON格式的文件來定義或描述,下面是Pod資源定義文件的模板:
# yaml格式的pod定義文件完整內容:
apiVersion: v1 #必選,版本號,例如v1
kind: Pod #必選,Pod
metadata: #必選,元數據
name: string #必選,Pod名稱
namespace: string #必選,Pod所屬的命名空間
labels: #自定義標簽
- name: string #自定義標簽名字
annotations: #自定義注釋列表
- name: string
spec: #必選,Pod中容器的詳細定義
containers: #必選,Pod中容器列表
- name: string #必選,容器名稱
image: string #必選,容器的鏡像名稱
imagePullPolicy: [Always | Never | IfNotPresent] #獲取鏡像的策略 Alawys表示下載鏡像 IfnotPresent表示優先使用本地鏡像,否則下載鏡像,Nerver表示僅使用本地鏡像
command: [string] #容器的啟動命令列表,如不指定,使用打包時使用的啟動命令
args: [string] #容器的啟動命令參數列表
workingDir: string #容器的工作目錄
volumeMounts: #掛載到容器內部的存儲卷配置
- name: string #引用pod定義的共享存儲卷的名稱,需用volumes[]部分定義的的卷名
mountPath: string #存儲卷在容器內mount的絕對路徑,應少于512字符
readOnly: boolean #是否為只讀模式
ports: #需要暴露的端口庫號列表
- name: string #端口號名稱
containerPort: int #容器需要監聽的端口號
hostPort: int #容器所在主機需要監聽的端口號,默認與Container相同
protocol: string #端口協議,支持TCP和UDP,默認TCP
env: #容器運行前需設置的環境變量列表
- name: string #環境變量名稱
value: string #環境變量的值
resources: #資源限制和請求的設置
limits: #資源限制的設置
cpu: string #Cpu的限制,單位為core數,將用于docker run --cpu-shares參數
memory: string #內存限制,單位可以為Mib/Gib,將用于docker run --memory參數
requests: #資源請求的設置
cpu: string #Cpu請求,容器啟動的初始可用數量
memory: string #內存清楚,容器啟動的初始可用數量
livenessProbe: #對Pod內個容器健康檢查的設置,當探測無響應幾次后將自動重啟該容器,檢查方法有exec、httpGet和tcpSocket,對一個容器只需設置其中一種方法即可
exec: #對Pod容器內檢查方式設置為exec方式
command: [string] #exec方式需要制定的命令或腳本
httpGet: #對Pod內個容器健康檢查方法設置為HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #對Pod內個容器健康檢查方式設置為tcpSocket方式
port: number
initialDelaySeconds: 0 #容器啟動完成后首次探測的時間,單位為秒
timeoutSeconds: 0 #對容器健康檢查探測等待響應的超時時間,單位秒,默認1秒
periodSeconds: 0 #對容器監控檢查的定期探測時間設置,單位秒,默認10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: false
restartPolicy: [Always | Never | OnFailure] #Pod的重啟策略,Always表示一旦不管以何種方式終止運行,kubelet都將重啟,OnFailure表示只有Pod以非0退出碼退出才重啟,Nerver表示不再重啟該Pod
nodeSelector: obeject #設置NodeSelector表示將該Pod調度到包含這個label的node上,以key:value的格式指定
imagePullSecrets: #Pull鏡像時使用的secret名稱,以key:secretkey格式指定
- name: string
hostNetwork: false #是否使用主機網絡模式,默認為false,如果設置為true,表示使用宿主機網絡
volumes: #在該pod上定義共享存儲卷列表
- name: string #共享存儲卷名稱 (volumes類型有很多種)
emptyDir: {} #類型為emtyDir的存儲卷,與Pod同生命周期的一個臨時目錄。為空值
hostPath: string #類型為hostPath的存儲卷,表示掛載Pod所在宿主機的目錄
path: string #Pod所在宿主機的目錄,將被用于同期中mount的目錄
secret: #類型為secret的存儲卷,掛載集群與定義的secre對象到容器內部
scretname: string
items:
- key: string
path: string
configMap: #類型為configMap的存儲卷,掛載預定義的configMap對象到容器內部
name: string
items:
- key: string
path: string
以上是“kubernetes中Pod是什么”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。