k8s 微服務pod
pod初始
K8s有很多技術概念,同時對應很多API物件,最重要的也是最基礎的是微服務Pod。Pod是在K8s叢集中執行部署應用或服務的最小單元,它是可以支援多容器的。Pod的設計理念是支援多個容器在一個Pod中共享網路地址和檔案系統,可以通過程序間通訊和檔案共享這種簡單高效的方式組合完成服務。Pod對多容器的支援是K8s最基礎的設計理念。比如你執行一個作業系統發行版的軟體倉庫,一個Nginx容器用來發布軟體,另一個容器專門用來從源倉庫做同步,這兩個容器的映象不太可能是一個團隊開發的,但是他們一塊兒工作才能提供一個微服務;這種情況下,不同的團隊各自開發構建自己的容器映象,在部署的時候組合成一個微服務對外提供服務。這就是K8S中的POD。
Pod是K8s叢集中所有業務型別的基礎,可以看作執行在K8s叢集中的小機器人,不同型別的業務就需要不同型別的小機器人去執行。目前K8s中的業務主要可以分為長期伺服型(long-running)、批處理型(batch)、節點後臺支撐型(node-daemon)和有狀態應用型(stateful application);分別對應的小機器人控制器為Deployment、Job、DaemonSet和StatefulSet。
Pod的初體驗
apiVersion: v1 kind: Pod metadata: name: first-pod labels: app: bash spec: containers: - name: bash-container image: busybox command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 10']
執行結果
# 建立k8s資源服務
[root@master1 ~/k8s_test]# kubectl apply -f pod.yaml
pod/first-pod created
# 檢視檔案啟動的服務
[root@master1 ~/k8s_test]# kubectl get -f pod.yaml
NAME READY STATUS RESTARTS AGE
first-pod 0/1 ContainerCreating 0 33s
Pod帶來的好處
-
Pod做為一個可以獨立執行的服務單元,簡化了應用部署的難度,以更高的抽象層次為應用部署管提供了極大的方便。
-
Pod做為最小的應用例項可以獨立執行,因此可以方便的進行部署、水平擴充套件和收縮、方便進行排程管理與資源的分配。
-
Pod中的容器共享相同的資料和網路地址空間,Pod之間也進行了統一的資源管理與分配。
Pod是如何管理多個容器的
Pod中可以同時執行多個程序(作為容器執行)協同工作。同一個Pod中的容器會自動的分配到同一個 node 上。同一個Pod中的容器共享資源、網路環境和依賴,所以它們總是被同時排程。在一個Pod中同時執行多個容器是一種比較高階的用法。只有當你的容器需要緊密配合協作的時候才考慮用這種模式。
Pod中的資料永續性
Pod在設計⽀持就不是作為持久化實體的。在排程失敗、節點故障、缺少資源或者節點維護的狀態下都會死掉會被驅逐。通常,我們是需要藉助類似於Docker儲存卷這樣的資源來做Pod的資料持久化的
Pod的生命週期和重啟策略
Pod 在整個生命週期過程中被系統定義為各種狀態,熟悉 Pod 各種狀態對於我 理解如何設定 Pod的排程策略、重啟策略是很有必要的。
Pod的狀態
狀態值 | 描述 |
---|---|
掛起(Pending) | API Server建立了pod資源物件已存入etcd中,但它尚未被排程完成,或者仍處於從倉庫下載映象的過程中。 |
執行中(Running) | Pod已經被排程至某節點,並且所有容器都已經被kubelet建立完成 |
成功(Succeeded) | Pod中的所有容器都已經成功終止並且不會被重啟 |
失敗(Failed) | Pod中的所有容器都已終止了,並且至少有一個容器是因為失敗終止。即容器以非0狀態退出或者被系統禁止。 |
未知(Unknown) | Api Server無法正常獲取到Pod物件的狀態資訊,通常是由於無法與所在工作節點的kubelet通訊所致。 |
Pod的重啟策略
Pod 重啟策略( RestartPolicy )應用於 Pod 內的所有容器,井且僅在 Pod 所處的 Node 上由kubelet 進行判斷和重啟操作。當某個容器異常退出或者健康檢查失敗時, kubelet將根據 RestartPolicy 設定來進行相應的操作。Pod的重啟策略包括:Always、OnFailure和Never,預設值為Always
-
Always:當容器失效時,由kubelet自動重啟該容器。
-
OnFailure:當容器終止執行且退出碼不為0時,由kubelet自動重啟該容器
-
Never:不論容器執行狀態如何,kubelet都不會重啟該容器。
kubelet 重啟失效容器的時間間隔以 sync-frequency 乘以 2n 來計算;例如1、2、4、8倍等,最長延時 5min ,並且在成功重啟後的 10 min 後重置該時間。
Pod的重啟策略與控制方式息息相關,當前可用於管理Pod的控制器包括ReplicationController、Job、DaemonSet及直接通過kubelet管理(靜態Pod)。每種控制器對Pod的重啟策略要求如下:
- RC和DaemonSet:必須設定為Always,需要保證該容器持續執行。
- Job和CronJob:OnFailure或Never,確保容器執行完成後不再重啟。
- kubelet:在Pod失效時自動重啟它,不論將RestartPolicy設定什麼值,也不會對Pod進行健康檢查。
Pod的資源清單詳解
apiVersion: v1 # 必選,API的版本號
kind: Pod # 必選,型別Pod
metadata: # 必選,元資料
name: nginx # 必選,符合RFC 1035規範的Pod名稱
namespace: web-testing # 可選,不指定預設為default,
# Pod所在的名稱空間
labels: # 可選,標籤選擇器,一般用於Selector
- app: nginx # 應用名稱
annotations: # 可選,註釋列表 解釋資訊
- app: nginx
spec: # 必選,用於定義容器的詳細資訊 說明
containers: # 必選,容器列表
- name: nginx # 必選,符合RFC 1035規範的容器名稱
image: nginx:v1 # 必選,容器所用的映象的地址
imagePullPolicy: Always # 可選,映象拉取策略
workingDir: /usr/share/nginx/html # 可選,容器的工作目錄
volumeMounts: # 可選,儲存卷配置
- name: webroot # 儲存卷名稱
mountPath: /usr/share/nginx/html # 掛載目錄
readOnly: true # 只讀
ports: # 可選,容器需要暴露的埠號列表
- name: http # 埠名稱
containerPort: 80 # 埠號
protocol: TCP # 埠協議,預設TCP
env: # 可選,環境變數配置
- name: TZ # 變數名
value: Asia/Shanghai # 變數值
- name: LANG
value: en_US.utf8
resources: # 可選,資源限制和資源請求限制
limits: # 容器最多能使用的資源量的上限。
cpu: 1000m # cpu資源
memory: 1024MiB # 記憶體資源
requests: # 表示容器希望被分配到的、
# 可完全保證的資源量
cpu: 100m # cpu資源
memory: 512MiB # 記憶體資源
readinessProbe: # 可選,容器狀態檢查 就緒行探測
httpGet: # 檢測方式
path: / # 檢查路徑
port: 80 # 監控埠
timeoutSeconds: 2 # 超時時間
initialDelaySeconds: 60 # 初始化時間
livenessProbe: # 可選,監控狀態檢查 活性探測
exec: # 檢測方式
command: # 命令
- cat
- /health
httpGet: # 檢測方式
path: /_health
port: 8080
httpHeaders:
- name: end-user
value: jason
tcpSocket: # 檢測方式
port: 80
initialDelaySeconds: 60 # 初始化時間
timeoutSeconds: 2 # 超時時間
periodSeconds: 5 # 檢測間隔
successThreshold: 2 # 檢查成功為2次表示就緒
failureThreshold: 1 # 檢測失敗1次表示未就緒
securityContext: # 可選,限制容器不可信的行為
provoleged: false
restartPolicy: Always # 可選,重啟策略 預設為Always
nodeSelector: # 可選,指定Node節點
region: subnet7
imagePullSecrets: # 可選,拉取映象使用的secret
- name: default-dockercfg-86258
hostNetwork: false # 可選,是否為主機模式,
# 如是,會佔用主機端
volumes: # 共享儲存卷列表
- name: webroot # 名稱,與上述對應
emptyDir: {} # 共享卷型別,空
hostPath: # 共享卷型別,本機目錄
path: /etc/hosts
secret: # 共享卷型別,secret模式,一般用於密碼
secretName: default-token-tf2jp # 名稱
defaultMode: 420 # 許可權
configMap: # 一般用於配置檔案
name: nginx-conf
defaultMode: 420
# 補充說明
cpu:200m
表示佔用0.2個cpu資源
按照1000m的1個cpu資源進行計算。
這裡設定的是初始值,若初始值過小可能分到資源不充足的機器,不能向上佔用資源了
記憶體,
java 參考jvm虛擬機器資源設定
golang 不用設定記憶體,靠應用自己去佔用
生產環境CPU設定:
最小設定500m
一般設定1000m
較高設定2000
極高設定3000~4000m
explain檢視屬性的定義和用法
檢視service資源下metadata的定義及用法
kubectl explain service.metadata