優(yōu)秀網(wǎng)站設(shè)計效果圖企業(yè)營銷推廣怎么做
一、Pod介紹
1、Pod的基礎(chǔ)概念
Pod是kubernetes中最小的資源管理組件,Pod也是最小化運行容器化應(yīng)用的資源對象,一個pod代表著集群中運行的一個進(jìn)程。kubernetes中其它大多數(shù)組件都是圍繞著pod來進(jìn)行支持和擴(kuò)展pod功能的。
例如,用于管理pod運行的statefulset和deployment 等控制器對象,用于暴露應(yīng)用的service和ingress對象,為pod提供存儲的persistentVolumes存儲資源對象。
?
在Kubrenetes集群中Pod有如下兩種使用方式:
●一個Pod中運行一個容器。“每個Pod中一個容器”的模式是最常見的用法;在這種使用方式中,你可以把Pod想象成是單個容器的封裝,kuberentes管理的是Pod而不是直接管理容器。
●在一個Pod中同時運行多個容器。一個Pod中也可以同時封裝幾個需要緊密耦合互相協(xié)作的容器,它們之間共享資源。這些在同一個Pod中的容器可以互相協(xié)作成為一個service單位,比如一個容器共享文件,另一個“sidecar”容器來更新這些文件。Pod將這些容器的存儲資源作為一個實體來管理。
一個Pod下的容器必須運行于同一節(jié)點上?,F(xiàn)代容器技術(shù)建議一個容器只運行一個進(jìn)程,該進(jìn)程在容器中PID命令空間中的進(jìn)程號為1,可直接接收并處理信號,進(jìn)程終止時容器生命周期也就結(jié)束了。
若想在容器內(nèi)運行多個進(jìn)程,需要有一個類似Linux操作系統(tǒng)init進(jìn)程的管控類進(jìn)程,以樹狀結(jié)構(gòu)完成多進(jìn)程的生命周期管理。運行于各自容器內(nèi)的進(jìn)程無法直接完成網(wǎng)絡(luò)通信,這是由于容器間的隔離機(jī)制導(dǎo)致,k8s中的Pod資源抽象正是解決此類問題,Pod對象是一組容器的集合,這些容器共享Network、UTS及IPC命令空間,因此具有相同的域名、主機(jī)名和網(wǎng)絡(luò)接口,并可通過IPC直接通信。
namespace | 功能 |
mnt(mount) | 提供磁盤掛載點和文件系統(tǒng)的隔離能力 |
ipc(inter-Process Communication) | 提供進(jìn)程間通信的隔離能力 |
net(network) | 提供網(wǎng)絡(luò)隔離能力 |
uts(Unix Time Sharing) | 提供主機(jī)名隔離能力 |
pid | 提供進(jìn)程號隔離能力 |
user | 提供用戶隔離能力 |
Pod中的pause容器
Pod資源中針對各容器提供網(wǎng)絡(luò)命令空間等共享機(jī)制的是底層基礎(chǔ)容器pause,基礎(chǔ)容器(也可稱為父容器)pause就是為了管理Pod容器間的共享操作,這個父容器需要能夠準(zhǔn)確地知道如何去創(chuàng)建共享運行環(huán)境的容器,還能管理這些容器的生命周期。為了實現(xiàn)這個父容器的構(gòu)想,kubernetes中,用pause容器來作為一個Pod中所有容器的父容器。這個pause容器有兩個核心的功能,一是它提供整個Pod的Linux命名空間的基礎(chǔ)。二來啟用PID命名空間,它在每個Pod中都作為PID為1進(jìn)程(init進(jìn)程),并回收僵尸進(jìn)程。
?
pause容器使得Pod中的所有容器可以共享兩種資源:網(wǎng)絡(luò)和存儲
網(wǎng)絡(luò)
每個Pod都會被分配一個唯一的IP地址,Pod中的所有容器共享網(wǎng)絡(luò)空間,包括IP地址和端口,Pod內(nèi)部的容器可以使用localhost互相通信,Pod中的容器與外界通信時,必須分配共享網(wǎng)絡(luò)資源(例如使用宿主機(jī)的端口映射)
存儲
Pod可以指定多個共享的Volume,Pod中的所有容器都可以訪問共享Volume。Volume也可以用來持久化Pod中的存儲資源,以防止容器后文件丟失。
?
#總的來說
//每個Pod都有一個特殊的被稱為“基礎(chǔ)容器”的pause容器,pause容器對應(yīng)的鏡像屬于kubernetes平臺的一部分,除了pause容器,每個Pod號包含一個或多個緊密相關(guān)的用戶應(yīng)用容器。#kubernetes中pause容器主要為每個容器提供一下功能
//在pod中擔(dān)任linux命名空間(如網(wǎng)絡(luò)命名空間)共享的基礎(chǔ)
//啟用PID命名空間,開啟init進(jìn)程#kubernetes涉及這樣的Pod概念和特殊組成結(jié)構(gòu)有什么用意?
//原因一
在一組容器作為一個單元的情況下,難以對整體的容器簡單的進(jìn)行判斷及有效進(jìn)行行動。比如一個容器死亡了,此時是算整體掛了嗎?那么引入與業(yè)務(wù)無關(guān)的pause容器作為Pod的基礎(chǔ)容器,以它的狀態(tài)代表牌整個容器組的狀態(tài),這樣就可以解決該問題。//原因二
Pod里的多個應(yīng)用容器共享pause容器的IP。共享pause容器掛載的Volume,這樣簡化了應(yīng)用容器之間的通信問題,也解決了容器之間的文件共享問題。//就是產(chǎn)生pause容器的兩個原因是,1、通過pause容器判斷整個pod中容器是否正常,2、通過pause容器共享網(wǎng)絡(luò)和掛載。
2、Pod的分類
通常把Pod分為兩類:
●自主式Pod?
這種Pod本身是不能自我修復(fù)的,當(dāng)Pod被創(chuàng)建后(不論是由你直接創(chuàng)建還是被其它controller),都會被kubernetes調(diào)度到集群的Node上,直到Pod的進(jìn)程終止,被刪掉,因為缺少資源而被驅(qū)逐,或者Node故障之前這個Pod都會一直保持在那個Node上。
Pod不會自愈。如果Pod運行的Node故障,或者是調(diào)度器本身故障,這個Pod就會被刪除,同樣的,如果所在Node缺少資源或者pod處理維護(hù)狀態(tài),Pod也會被驅(qū)逐。
?
●控制器管理的Pod
Kubernetes使用更高級的稱為Controller的抽象層,來管理Pod實例。Controller可以創(chuàng)建和管理多個Pod,提供副本管理、滾動升級和集群級別的自愈能力。
例如,如果一個Node故障,Controller就能自動將該節(jié)點上的Pod調(diào)度到其他健康的Node上。雖然可以直接使用Pod,但是在Kubernetes中通常是使用Controller來管理Pod的。
3、Pod容器的分類
1、基礎(chǔ)容器(infrastructure container)
- 維護(hù)整個Pod網(wǎng)絡(luò)和存儲空間
- node節(jié)點中操作
- 啟動一個容器時,k8s會自動啟動一個基礎(chǔ)容器
2、初始化容器(init container)
Init 容器必須在應(yīng)用程序容器啟動之前運行完成,而應(yīng)用程序容器是并行運行的,所以 Init 容器能夠提供了一種簡單的阻塞或延遲應(yīng)用容器的啟動的方法。Init 容器與普通的容器非常像,除了以下兩點
Init 容器總是運行到成功完成為止
每個 Init 容器都必須在下一個 Init 容器啟動之前成功完成啟動和退出
如果 Pod 的 Init 容器失敗,k8s 會不斷地重啟該 Pod,直到 Init 容器成功為止。然而,如果 Pod 對應(yīng)的重啟策略(restartPolicy)為 Never,它不會重新啟動。
?
#init容器的作用
因為 init 容器具有與應(yīng)用容器分離的單獨鏡像,其啟動相關(guān)代碼具有如下優(yōu)勢1、Init 容器可以包含一些安裝過程中應(yīng)用容器中不存在的實用工具或個性化代碼。例如,沒有必要僅為了在安裝過程中使用類似 sed、 awk、python 或 dig 這樣的工具而去 FROM 一個鏡像來生成一個新的鏡像。
2、Init 容器可以安全地運行這些工具,避免這些工具導(dǎo)致應(yīng)用鏡像的安全性降低。
3、應(yīng)用鏡像的創(chuàng)建者和部署者可以各自獨立工作,而沒有必要聯(lián)合構(gòu)建一個單獨的應(yīng)用鏡像。
4、Init 容器能以不同于 Pod 內(nèi)應(yīng)用容器的文件系統(tǒng)視圖運行。因此,Init 容器可具有訪問 Secrets的權(quán)限,而應(yīng)用容器不能夠訪問。
5、由于 Init 容器必須在應(yīng)用容器啟動之前運行完成,因此 Init容器提供了一種機(jī)制來阻塞或延遲應(yīng)用容器的啟動,直到滿足了一組先決條件。一旦前置條件滿足,Pod 內(nèi)的所有的應(yīng)用容器會并行啟動。
3、應(yīng)用容器( main container)
- 在init容器完成并退出后并行啟動
二、Pod中的容器配置
1、基本配置
vim pod-text.yamlapiVersion: v1
kind: Pod
metadata:name: pod-basenamespace: devlabels:user:ydq
spec:containers:- name: nginximage: nginx:1.17.1- name: busyboximage: busybox:1.30
kubectl apply -f pod-base.yaml
#生成podkubectl get pods -n dev
#查看pod是否生成kubectl describe pod pod-base -n dev
#查看該pod的詳細(xì)信息//READY 1/2 : 表示當(dāng)前pod中有兩個容器,其中一個準(zhǔn)備就緒,1個未就緒
//RESTARTS : 重啟次數(shù),因為有一個1個容器故障了,Pod這一直在重啟試圖恢復(fù)它
//特別說明:
●在Pod啟動過程中,Init容器會按順序在網(wǎng)絡(luò)和數(shù)據(jù)卷初始化之后啟動。每個容器必須在下一個容器啟動之前成功退出。
●如果由于運行時或失敗退出,將導(dǎo)致容器啟動失敗,它會根據(jù)Pod的restartPolicy指定的策略進(jìn)行重試。然而,如果Pod的restartPolicy設(shè)置為Always,Init容器失敗時會使用RestartPolicy策略。
●在所有的Init容器沒有成功之前,Pod將不會變成Ready狀態(tài)。Init容器的端口將不會在Service中進(jìn)行聚集。正在初始化中的Pod處于Pending狀態(tài),但應(yīng)該會將Initializing狀態(tài)設(shè)置為true。
●如果Pod重啟,所有Init容器必須重新執(zhí)行。
●對Init容器spec的修改被限制在容器image字段,修改其他字段都不會生效。更改Init容器的image字段,等價于重啟該P(yáng)od。
●Init容器具有應(yīng)用容器的所有字段。除了readinessProbe,因為Init容器無法定義不同于完成(completion)的就緒(readiness)之外的其他狀態(tài)。這會在驗證過程中強(qiáng)制執(zhí)行。
●在Pod中的每個app和Init容器的名稱必須唯一;與任何其它容器共享同一個名稱,會在驗證時拋出錯誤。
?
2、鏡像拉取策略
鏡像拉取策略(image PullPolicy):
Pod 的核心是運行容器,必須指定容器引擎,比如 Docker,啟動容器時,需要拉取鏡像,k8s 的鏡像拉取策略可以由用戶指定:
1、IfNotPresent:在鏡像已經(jīng)存在的情況下,kubelet 將不再去拉取鏡像,僅當(dāng)本地缺失時才從倉庫中拉取,默認(rèn)的鏡像拉取策略
2、Always:每次創(chuàng)建 Pod 都會重新拉取一次鏡像;
3、Never:Pod 不會主動拉取這個鏡像,僅使用本地鏡像。
?
注意:對于標(biāo)簽為“:latest”的鏡像文件,其默認(rèn)的鏡像獲取策略即為“Always”;而對于其他標(biāo)簽的鏡像,其默認(rèn)策略則為“IfNotPresent”。
apiVersion: v1
kind: Pod
metadata:name: pod-imagepullpolicynamespace: dev
spec:containers:- name: nginximage: nginx:1.17.2imagePullPolicy: Never #用于設(shè)置鏡像拉取策略- name: busyboximage: busybox:1.30
kubectl apply -f pod-imagepullpolicy.yaml
#制作podkubectl get pod -n dev
#查看podkubectl describe pod pod-imagepullpolicy -n dev
#查看詳細(xì)信息
3、重啟策略
重啟策略(restartPolicy):當(dāng) Pod 中的容器退出時通過節(jié)點上的 kubelet 重啟容器。適用于 Pod 中的所有容器。
1、Always:當(dāng)容器終止退出后,總是重啟容器,默認(rèn)策略
2、OnFailure:當(dāng)容器異常退出(退出狀態(tài)碼非0)時,重啟容器;正常退出則不重啟容器
3、Never:當(dāng)容器終止退出,從不重啟容器。
#注意:K8S 中不支持重啟 Pod 資源,只有刪除重建
?
創(chuàng)建pod-restartpolicy.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-restartpolicynamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1ports:- name: nginx-portcontainerPort: 80livenessProbe:httpGet:scheme: HTTPport: 80path: /hellorestartPolicy: Never # 設(shè)置重啟策略為Never
kubectl apply -f pod-restartpolicy.yaml
#創(chuàng)建podkubectl get pod pod-restartpolicy -n dev
#查看pod的狀態(tài)kubectl describe pod pod-restartpolicy -n dev
#查看pod的詳細(xì)信息