目錄
一、Pod 基本概念
二、pod 常用命令
三、Pod 資源共享實現(xiàn)機(jī)制
3.1 共享網(wǎng)絡(luò)
3.2 共享存儲
四、Pod 狀態(tài)管理
五、重啟策略和健康檢查
5.1 基本概念
5.1.1 重啟策略
5.1.2 健康檢查有以下三種類型:
5.1.3 支持以下三種檢查方法:
5.2 示例講解
5.2.1 就緒健康檢查示例
六、Pod環(huán)境變量注入
6.1 變量定義方式
6.2?Pod屬性中獲取
6.3?ConfigMap獲取
七、Init Container
7.1 概念
7.2 應(yīng)用場景
7.3 使用 Init 容器示例
一、Pod 基本概念
Pod?是可以在 Kubernetes 中創(chuàng)建和管理的、最小的可部署的計算單元。
Pod?(就像在鯨魚莢或者豌豆莢中)是一組(一個或多個)?容器; 這些容器共享存儲、網(wǎng)絡(luò)、以及怎樣運(yùn)行這些容器的聲明。
Pod 特點
? ? ? ? ? 一個Pod可以理解為是一個應(yīng)用實例,提供服務(wù)
? ? ? ? ? Pod中容器始終部署在一個Node上
? ? ? ? ? Pod中容器共享網(wǎng)絡(luò)、存儲資源
? ? ? ? ? Kubernetes直接管理Pod,而不是容器
? ? ? ?Pod 的共享上下文包括一組 Linux 名字空間、控制組(cgroup)和可能一些其他的隔離 ,即用來隔離 Docker 容器的技術(shù)。 在 Pod 的上下文中,每個獨立的應(yīng)用可能會進(jìn)一步實施隔離。
就 Docker 概念的術(shù)語而言,Pod 類似于共享命令空間和文件系統(tǒng)卷的一組 Docker 容器。
二、pod 常用命令
創(chuàng)建Pod:
kubectl apply -f pod.yaml
或者使用命令 kubectl run nginx --image=nginx
查看Pod:
kubectl get pods
kubectl describe pod <Pod名稱>
查看日志:
kubectl logs <Pod名稱> [-c CONTAINER]
kubectl logs <Pod名稱> [-c CONTAINER] -f
進(jìn)入容器終端:
kubectl exec <Pod名稱> [-c CONTAINER] -- bash
刪除Pod:
kubectl delete <Pod名稱>
三、Pod 資源共享實現(xiàn)機(jī)制
3.1 共享網(wǎng)絡(luò)
將業(yè)務(wù)容器網(wǎng)絡(luò)加入到“負(fù)責(zé)網(wǎng)絡(luò)的容器”實現(xiàn)網(wǎng)絡(luò)共享
?在一個pod 中運(yùn)行兩個容器,兩個容器之間網(wǎng)絡(luò)是互通的。
apiVersion: v1
kind: Pod
metadata:
labels:
app: test
name: pod-net-test
namespace: default
spec:
containers:
- image: busybox
name: test01
command: ["/bin/sh","-c","sleep 360000"]
- image: nginx:1.17
name: web
?進(jìn)入 web容器中在 index.html 頁面中輸入 “hello world” ,我們再從 test01 容器中下載 訪問
3.2 共享存儲
一個pod中的容器通過數(shù)據(jù)卷共享數(shù)據(jù)。
? ? ? ?通過在 web容器 /data 文件夾下創(chuàng)建一個文件 可以在容器 test 中查看 ,從而可以得出 pod 中容器中的部分?jǐn)?shù)據(jù)是共享的。
apiVersion: v1
kind: Pod
metadata:
labels:
app: test
name: pod-volume-test
namespace: default
spec:
containers:
- image: busybox
name: test
command: ["/bin/sh","-c","sleep 360000"]
volumeMounts:
- name: log
mountPath: /data
- image: nginx
name: web
volumeMounts:
- name: log
mountPath: /data
volumes:
- name: log
emptyDir: {}
? ? ? ? 在web容器中的 /data 文件夾下創(chuàng)建 index.html 文件,我們可以看到 在test容器中可以 查看到 index.html文件。
四、Pod 狀態(tài)管理
Pod 一共有 5 種狀態(tài),這個狀態(tài)反映在 Pod 的 status 屬性中
- Pending:這個狀態(tài)意味著,Pod 的 YAML 文件已經(jīng)提交給了 Kubernetes,API 對象已經(jīng)被創(chuàng)建并保存在 Etcd 當(dāng)中。但是這個 Pod 還沒有被調(diào)度成功,最常見的原因比如 Pod 中某個容器啟動不成功
- Running:這個狀態(tài)下,Pod 已經(jīng)調(diào)度成功。也就是它包含的容器都已經(jīng)創(chuàng)建成功,并且至少有一個正在運(yùn)行中
- Succeeded:這個狀態(tài)意味著,Pod 里的所有容器都正常運(yùn)行成功并退出了。這種情況在運(yùn)行一次性任務(wù)時最為常見
- Failed:這個狀態(tài)下,Pod 里至少有一個容器以不正常的狀態(tài)退出。這個狀態(tài)出現(xiàn)時,你得想辦法 Debug 這個容器,比如查看 Pod 的事件和日志。
- Unknown:這是一個異常狀態(tài),意味著 Pod 的狀態(tài)不能集群檢測到,這很有可能是主從節(jié)點(Master 和 Kubelet)間的通信出現(xiàn)了問題。
五、重啟策略和健康檢查
5.1 基本概念
5.1.1 重啟策略
? Always:當(dāng)容器終止退出后,總是重啟容器,默認(rèn)策略。
? OnFailure:當(dāng)容器異常退出(退出狀態(tài)碼非0)時,才重啟容器。
? Never:當(dāng)容器終止退出,從不重啟容器。
5.1.2 健康檢查有以下三種類型:
? livenessProbe(存活檢查):如果檢查失敗,將殺死容器,根據(jù)Pod 的restartPolicy來操作。
? readinessProbe(就緒檢查):如果檢查失敗,Kubernetes會把Pod從service endpoints中剔除。
? startupProbe(啟動檢查):指示容器中的應(yīng)用是否已經(jīng)啟動。如果提供了啟動探針(startup probe),則禁用所有其他探針,直到它成功為止。如果啟動探針失敗,kubelet 將殺死容器,容器服從其重啟策略進(jìn)行重啟。如果容器沒有提供啟動探針,則默認(rèn)狀態(tài)為成功Success。
5.1.3 支持以下三種檢查方法:
? httpGet:發(fā)送HTTP請求,返回200-400范圍狀態(tài)碼為成功。
? exec:執(zhí)行Shell命令返回狀態(tài)碼是0為成功。
? tcpSocket:發(fā)起TCP Socket建立成功。
5.2 示例講解
官網(wǎng)示例:
Configure Liveness, Readiness and Startup Probes | Kubernetes
5.2.1 就緒健康檢查示例
運(yùn)行一個 pod 在容器中 /tmp/healthy 目錄下創(chuàng)建文件并 刪除 ,存活檢查 檢查 此路徑是否存在。
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: pod-check
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe: # 存活檢查
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
readinessProbe: # 就緒檢查
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
### Pod 健康檢查示例
kubectl apply -f pod-healthy-check.yaml
### 查看pod的詳細(xì)信息
kubectl describe pod pod-check
### 暴露服務(wù)端口
kubectl expose pod pod-check --port=80 --target-port=80
? ? ? ? ? ?存活檢查生效,可以看到 pod 的restarts 次數(shù)已經(jīng)增加了 一次。
? ? ? ? ? ? 就緒檢查失敗, K8s會把Pod從service endpoints中剔除, 從而失去此 service 。
六、Pod環(huán)境變量注入
6.1 變量定義方式
- 自定義變量值
- 變量值從Pod屬性中獲取
- 變量值從Sectet、ConfigMap獲取
官方示例地址:通過環(huán)境變量將 Pod 信息呈現(xiàn)給容器 | Kubernetes
6.2?Pod屬性中獲取
apiVersion: v1
kind: Pod
metadata:
name: pod-env-vars
spec:
containers:
- name: test
image: busybox
command: [ "sh", "-c", "sleep 36000"]
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: MY_POD_SERVICE_ACCOUNT
valueFrom:
fieldRef:
fieldPath: spec.serviceAccountName
- name: Hello
value: "helle Kubernetes!"
restartPolicy: Never
? ? ? ? ? ?進(jìn)入容器 查看Pod 信息,我們使用echo $可以輸出結(jié)果
6.3?ConfigMap獲取
官網(wǎng)示例地址:?ConfigMap | Kubernetes
? ? ? ?ConfigMap 是一種 API 對象,用來將非機(jī)密性的數(shù)據(jù)保存到鍵值對中。使用時,?Pods?可以將其用作環(huán)境變量、命令行參數(shù)或者存儲卷中的配置文件。
? ? ? ?使用 ConfigMap 來將你的配置數(shù)據(jù)和應(yīng)用程序代碼分開。ConfigMap 在設(shè)計上不是用來保存大量數(shù)據(jù)的。在 ConfigMap 中保存的數(shù)據(jù)不可超過 1 MiB。如果你需要保存超出此尺寸限制的數(shù)據(jù),你可能希望考慮掛載存儲卷 或者使用獨立的數(shù)據(jù)庫或者文件服務(wù)。
congfigMap.yaml?
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# 類屬性鍵:每一個鍵都映射到一個值
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
?pod-configMap.yaml
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: demo
image: alpine
command: ["sleep", "3600"]
env:
- name: PLAYER_INITIAL_LIVES # 請注意這里和 ConfigMap 中的鍵名是不一樣的
valueFrom:
configMapKeyRef:
name: game-demo # 這個值來自 ConfigMap
key: player_initial_lives # 需要取值的鍵
- name: UI_PROPERTIES_FILE_NAME
valueFrom:
configMapKeyRef:
name: game-demo
key: ui_properties_file_name
volumeMounts:
- name: config
mountPath: "/config"
readOnly: true
volumes:
- name: config
configMap:
name: game-demo
items:
- key: "game.properties"
path: "game.properties"
- key: "user-interface.properties"
path: "user-interface.properties"
創(chuàng)建Pod?
kubectl apply -f configMap.yaml
kubectl apply -f pod-configMap.yaml
configmap-demo-pod運(yùn)行, 進(jìn)入容器可以看到 掛載目錄成功。
七、Init Container
7.1 概念
Init Container:顧名思義,用于初始化工作,執(zhí)行完就結(jié)束,可以理解為一次性任務(wù)。
? 支持大部分應(yīng)用容器配置,但不支持健康檢查
? 優(yōu)先應(yīng)用容器執(zhí)行
7.2 應(yīng)用場景
? 環(huán)境檢查:例如確保應(yīng)用容器依賴的服務(wù)啟動后再啟動應(yīng)用容器
? 初始化配置:例如給應(yīng)用容器準(zhǔn)備配置文件,工具安裝和安裝腳本運(yùn)行。
7.3 使用 Init 容器示例
? ? ? ?部署一個web網(wǎng)站,網(wǎng)站程序沒有打到鏡像中,而是希望從代碼倉庫中動態(tài)拉取放到應(yīng)用容器中。下面的例子定義了一個具有 一 個 Init 容器的簡單 Pod。 等待 index下載成功 。 一旦這 Init容器 啟動完成,Pod 將啟動 spec 節(jié)中的應(yīng)用容器。
apiVersion: v1
kind: Pod
metadata:
name: init-demo
spec:
initContainers:
- name: download
image: busybox
command: ['wget','-O', '/opt/index.html','http://www.ctnrs.com']
volumeMounts:
- name: wwwroot
mountPath: "/opt"
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: wwwroot
mountPath: /usr/share/nginx/html
volumes:
- name: wwwroot
emptyDir: {}
? ? ? ?從pod 的狀態(tài)中我們可以看到 InitContainer 中的執(zhí)行狀態(tài)處于 Init?
? ? ? ? ? ? init-demo 已處于運(yùn)行之中
因此,Pod中會有這幾種類型的容器:
? Infrastructure Container:基礎(chǔ)容器,維護(hù)整個Pod網(wǎng)絡(luò)空間
? InitContainers:初始化容器,先于業(yè)務(wù)容器開始執(zhí)行
? Containers:業(yè)務(wù)容器,并行啟動文章來源:http://www.zghlxwxcb.cn/news/detail-722907.html
------------------------ 感謝點贊!--------------------------------
文章來源地址http://www.zghlxwxcb.cn/news/detail-722907.html
到了這里,關(guān)于【云原生】kubernetes深入理解Pod對象:基本管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!