1. 程式人生 > >讀書筆記---kubernetes權威指南:從docker到kubernetes實踐 第2章: Kubernetes實踐指南

讀書筆記---kubernetes權威指南:從docker到kubernetes實踐 第2章: Kubernetes實踐指南


以下內容來自
kubernetes權威指南:從docker到kubernetes實踐紀念版

第2章 Kubernetes實踐指南

2.1 Kubernetes安裝與配置
kubeadm:適合初學安裝

kubectl [command] [TYPE] [NAME] -o=<output_format>
-o=yaml:以yaml格式顯示結果

kubectl exec -it pod-name -c container-name /bin/bash

kubectl logs -f pod-name -c container-name

Spec:是Pod中容器的詳細定義
spec.containers[].volumeMounts[]:List,
掛載到容器內部的儲存卷配置
spec.containers[].volumeMounts[].name:
引用Pod定義的共享儲存卷的明策劃嗯,需適用volumes[]部分定義
共享儲存卷的名稱
spec.containers[].volumeMounts[].mountPath:
儲存卷在容器內Mount的絕對路徑

spec.containers[].command[]:列表,容器的啟動命令列表,如果不指定
就適用映象打包時使用的啟動命令
spec.containers[].ports[]:列表,容器需要暴露的埠號列表
spec.containers[].ports[].name:埠的名稱
spec.containers[].ports[].containerPort:整型,容器需要監聽的埠號

spec.volumes[]:列表,在該Pod上定義的共享儲存卷列表
spec.volumes[].namme:字串,共享儲存卷的名稱
                     會被containers[].volumeMounts[].name引用
volume型別包括:emptyDir,hostPath,configMap等
spec.volumes[].emptyDir:物件,型別為emptyDir的儲存卷,與Pod同聲明週期的
                        臨時目錄,其值為i空對想: emptyDir: {}
spec.volumes[].hostPath: hostPatch的儲存卷,表示掛載Pod所在宿主機的目錄,
                         通過volumes[].hostPath.path指定
spec.volumes[].hostPath.path: 字元查un,Pod所在主機的目錄,被用於容器中mount的目錄

spec.volumes[].configMap:物件,configMap的儲存卷,
                         表示掛載叢集預先定義的configMap物件到容器內部

spec.volumes[].livenessProbe:物件,pod內容器進行健康檢查設定,
                             探測無響應,就會重啟該容器

spec.restartPolict:字串,Pod的重啟策略,可選值為
                    Always,OnFailure,預設為Always
                    Always:Pod一旦停止,重啟
                    OnFailure:Pod以非零碼終止,重啟(正常結束退出碼為0)

spec.nodeSelector:物件,設定節點選擇器表示將該Pod
                    排程到包含這些label的Node上,以key:value指定

spec.hostNetwork:布林,是否使用主機網路模式,預設false
                    設定為true,表示容器使用宿主機網路,
                    不再使用Docker網橋,該Pod將無法在同一臺
                    宿主機啟動第二個副本
                    
2.3.2 Pod的基本用法
什麼時候將幾個容器放在同一個Pod?
當幾個容器緊耦合,需要組成整體對外提供服務,就應該
將這兩個容器打包為一個Pod


2.3.3 靜態Pod
含義:kubelet管理的僅存在於特定Node上的Pod,
不能通過API Server進行管理
建立方式:
1 配置檔案:設定kubelet啟動引數 --config
2 HTTP方式
設定kubelet啟動引數: --manifest-url
定期從該URL地址下載Pod的定義檔案

2.3.4 Pod容器共享Volume
同一個Pod的多哥容器可以共享Pod級別的儲存卷,
多個容器各自進行掛載操作
用emptyDir作為目錄

2.3.5 Pod的配置管理
配置與程式分麗

1 ConfigMap概述
作用:
1)生成容器內的環境變數
2)設定容器啟動命令引數
3)以Volume形式掛載為容器內部檔案或目錄
本質: key:value,也可以用於表示完整檔案的內容‘

kubectl create configmap命令列方式建立ConfigMap
kubectl get configmap XXX
kubectl describe configmap XXX
kubectl create configmap NAME --from-file=configile-files-dir

通過volumeMount使用ConfigMap

4 使用ConfigMap的限制條件
1)ConfigMap必須在Pod之前建立
2)處於相同Namespaces中的Pod可以引用
3)Pod對ConfigMap進行掛載,容器內部只能掛載為目錄


2.3.6 在容器內獲取Pod資訊(Downware API)
1)環境變數:用於單個變數,可以將Pod資訊和Container資訊
注入容器內部
2)Volume掛載:將陣列類資訊生成為檔案,掛載到容器內部


2.3.7 Pod生命週期和重啟策略
Pending:建立Pod,但還有容器映象沒有建立
Running:Pod內所有容器已經建立,至少有一個容器處於執行狀態
Succeeded:Pod內所有容器均成功執行退出,且不再重啟
Failed:所有容器已退出,至少有一個容器瑞出為失敗狀態
Unknown:由於某種原因無法獲取該Pod狀態

重啟策略:
Always:容器失效,kubelet自動重啟
OnFailure:容器終止且退出碼不為0,kubelet重啟
Never:永不重啟
重啟間隔:2^n,最長5min

RC和DaemonSet:必須設定為Always,包正容器持續執行
Job:OnFailure或Never,容器執行完不再重啟
kubelet:Pod失效時自動重啟


2.3.8 Pod健康檢查
LivenessProbe和ReadinessProbe
LivenessProbe探針:判斷容器是否存活(running),
                如果探測到不健康,殺掉該容器,
                不包含LivenesProbe探針,認為返回值永遠是Success
ReadinessProbe探針:判斷容器是否啟動完成(ready狀態),可以接收請求
                探測失敗,Pod狀態將被修改
kubelet定期執行LivenessProbe探針診斷容器是否健康
三種實現方式:
1)ExecAction:容器內執行命令,如果命令返回碼為0,表示容器健康
2)TCPSocketAction:通過Ip和埠執行TCP檢查,
                    如果能建立TCP連線,則表明容器健康
3)HTTPGetAction:通過容器IP地址,埠號,路徑呼叫HTTP Get方法,
                如果響應狀態碼>=200,<400,則健康
                
initialDelaySeconds:啟動容器後首次健康檢查等待時間,單位s
timeoutSeconds:健康檢查傳送請求後等待響應的超時時間,單位s

2.3.9 玩轉Pod排程
1 Deployment/RC:全自動排程
功能:自動部署一個容器應用的多份副本,維持指定副本量

2 NodeSelector:定向排程
通過Node標籤和Pod的nodeSelector屬性匹配
命令:
kubectl label nodes <node-name> <label-key>=<label-value>
例子:
kubectl label nodes k8s-node-1 zone=north

標籤:限制Pod所在節點的方法
親和性排程機制:
更具表打理
使用軟限制,退而求其次執行pod
可定義規則描述Pod之間的親和或互斥關係
組成:
節點親和性:NodeAffinity
Pod親和性:PodAffinity
實現原理:通過Pod標籤而不是節點標籤來實現

3 NodeAffinity: Node親和性排程
作用:替換NodeSelector的排程策略
方式:
1 RequireDuringSchedulingIgnoredDuringExecution:
  滿足指定規則才可以排程Pod到Node上
2 PreferredDuringSchedulingIgnoredDuringExecution:
  強調優先滿足指定規則,軟限制,多個優先順序規則可設定權重和順序
  
IgnoredDuringExecution:pod所在節點在Pod執行期間標籤發生變化
                        不再符合該Pod的節點親和性後,雄會忽略Node上
                        Label的變化
NodeAffinity支援In,NotIn,Exists,DoesNotExist,Gt,Lt

規則:
如果同時定義nodeSelector和nodeAffinity,則兩個條件必須都滿足
如果nodeAffinity指定多個nodeSelectorTerms,只需要其中一個
    能夠匹配成功

4 PodAffinity: Pod親和與互斥排程策略
本質:對節點和Pod兩個條件進行匹配
條件設定:
requiredDuringSchedulingIgnoreDuringExecution
preferredDuringSchedulingIgnoredDuringExeution
定義於PodSepc的affinity欄位的podAffinity中
互斥性:podAntiAffinity

topologyKey:使用任何合法的標籤Key賦值

5 Taints和Tolerations
Taint:讓Node拒絕Pod的執行
除非能容忍,否則無法在這些Node上執行
命令:
kubectl taint nodes node1 key=value:NoSchedule
例子:
tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule"
  
6 DaemonSet:在每個Node上排程一個Pod
作用:管理每個Node上僅執行一份Pod的副本例項
適用:儲存,日誌,效能監控

7 Job:批處理排程
含義:並性啟動多哥計算程序去處理一批工作,完成後,整個
    批處理任務結束
模式:
1) Job Template Expansion模式:一個job物件對應待處理的工作
2) Queue with Pod Per Work Item:採用一個任務佇列存放Work item
    一個job去完成Work item, job會啟動N個Pod,每個Pod對應一個工作
3) Queue with Variable Pod Count:採用任務佇列存放
    Work item,一個Job物件作為消費者去完成這些Work item
    
Job型別:
1) Non-parallel Jobs
一個Job只啟動一個Pod,除非Pod異常,才會重啟該Pod
2) Parallel Jobs with a fixed completion count
並行Job會啟動多個Pod
3)Parallel Jobs with a worker queue


8 Crobjob:定時任務
格式:
Minutes Hours DayOfMonth Month DayOfWeek Year

*:匹配該域的任意值
/:表示起始時間開始觸發,然後每隔固定時間觸發一次
例子:
*/1 * * * *


9 自定義排程器


2.3.10 Init Container(初始化容器)
作用:等待其他關聯元件執行,啟動應用容器之前啟動的容器
特點:僅執行一次就結束,而且必須成功執行完成後,才能繼續執行
    下一個容器
與應用容器的區別:
1)初始化容器先於應用容器完成
2)初始化容器可設定資源限制


2.3.11 Pod的升級和回滾
如果Pod是通過Deployment建立的,使用者可以在執行時修改
Deployment的Pod定義或映象名稱;
更新錯誤,還可以通過回滾恢復
例子:設定映象
kubectl set imagedeployment/nginx-deployment nginx=nginx:1.9.1
更新方法使用kubectl edit命令修改Deployment的配置
一旦映象名發生修改,會觸發滾動升級
kubectl rollout status可檢視Deployment更新
升級包正服務不中斷

更新策略:
spec.strategy指定Pod更新策略,支援
RollingUpdate(滾動升級):預設,逐個更新Pod
Recreate(重建):spec,strategy.type=Recreate,
會殺掉所有正在執行的Pod,然後建立新的Pod

spec.strategy.rollingUpdate.maxUnavailable:
指定更新過程中不可用Pod的最大值
spec.strategy.rollingUpdate.maxSurge:
指定更新Pod中Pod總數超過Pod期望部分的最大值

注意:
新增標籤選擇器無法向後相容
P174

2 Deployment的回滾
kubectl rollout history deployment/nginx-deployment

3 暫停和恢復Deployment的部署操作,完成複雜的修改
先暫停Deployment,修改配置,再恢復Deployment
暫停命令:
kubectl rollout pause deployment/nginx-deployment

恢復:
kubectl rollout resume deploy nginx-deployment

4 使用kubectl rolling-update完成RC的滾動升級
kubectl rolling-update

5 其他管理物件的更新策略
1)DaemonSet的更新策略
OnDelete和RollingUpdate
OnDelete: DaemonSet的預設升級策略,刪除
            舊版本Pod,才會觸發新建操作
RollingUpdate:舊版本的Pod將被自動殺掉

2) StatefulSet的更新策略


2.3.12 Pod的擴容和縮容
手動模式:執行kubectl scale對Deployment進行Pod
        副本數量的設定
自動設定:根據效能指標或業務指標

命令:
kubectl scale deployment nginx-deployment --replicas 5

HPA(Horizontal Pod Autoscaler)
kubectl autoscale deployment php-apache --min=1 --max=10 --cpu-percent=50
kubectl get hpa

2.3.13 使用StatefuleSet搭建MongoDb叢集
P 187

2.4 深入掌握Service
Service時Kubernetes最核心的,為一組具有相同功能的容器
應用提供統一入口地址,將請求負載
分發到後端各個容器

解釋:
spec.type:字元查un,需要,Service的型別,指定Service
            的訪問方式,預設為ClusterIP
            ClusterIP:虛擬服務Ip地址,可被叢集內部Pod訪問
            NodePort:使用宿主機的埠,使客戶通過Node
                    的IP和埠就可以訪問服務
            LoadBalancer:負載均衡器完成負載分發
spec.clusterIP:

status.loadBalancer.ingress:外部負載均衡器
status.loadBalancer.ingress.ip:外部負載均衡器的IP地址
status.loadBalancer.ingress.hostname:外部負載均衡器的主機名

2.4.2 Service基本用法
對外提供服務通過機制實現,最簡單:
TCP/IP來監聽IP和埠號實現
Pod的IP地址會發生變化
如果容器應用是分散式部署,在這些前端設定
負載均衡器實現請求分發,
Service就是解決這個問題的核心元件
關鍵欄位:
ports:指定Service所需的虛擬埠號,由於與
        Pod容器埠號不一樣,再通過
        targetPort指定後端Pod的埠號
selector:設定後端Pod所擁有的label

kubectl get svc

驗證服務
curl 169.169.28.190:8081
[[email protected] qaadmin]# curl 10.233.10.160:8777
{"error": {"message": "The request you have made requires authentication.", "code": 401, "title": "Unauthorized"}}[[email protected] qaadmin]# 

Kubernetes兩種負載分發策略:
1) RoundRobin:輪詢,輪詢將請求轉發到後端各個pod上面,預設
2) SessionAffinity:基於客戶端IP地址進行會話保持的模式,
                之後從相同客戶端發起的請求被轉發到相同的Pod上

相關推薦

讀書筆記---kubernetes權威指南docker到kubernetes實踐 2: Kubernetes實踐指南

以下內容來自 kubernetes權威指南:從docker到kubernetes實踐紀念版 第2章 Kubernetes實踐指南 2.1 Kubernetes安裝與配置 kubeadm:適合初學安裝 kubectl [command] [TYPE] [NAME] -o

讀書筆記--《程式設計師的自我修養》2編譯和連結

一、從原始碼到可執行檔案的過程 分為4個步驟:預處理(prepressing)、編譯(compilation)、彙編(assembly)和連結(linking)。如圖所示 1、預編譯 (1)首先,原始碼檔案和相關的標頭檔案,會被預編譯器預編譯為一個.i檔案。 對於C++程式來

讀書筆記「Python程式設計入門到實踐」_7.使用者輸入和while迴圈

7.1 函式input()的工作原理   函式input() 讓程式暫停執行,等待使用者輸入一些文字。獲取使用者輸入後,Python將其儲存在一個變數中,以方便你使用。   message = input("Tell me something, and I will repeat it back t

讀書筆記「Python程式設計入門到實踐」_11.測試函式

11.1 測試函式   要學習測試,得有要測試的程式碼。下面是一個簡單的函式,它接受名和姓並返回整潔的姓名: def get_formatted_name(first, last): """Generate a neatly formatted full name.""" full_

讀書筆記--《程式設計師的自我修養》4靜態連結(1)

本章以 如何將a.c檔案與b.c檔案連結成一個可執行檔案 來探討如何進行靜態連結 其中a.c和b.c檔案如下: a.c檔案 extern int shared; int main() { int a = 100; swap(&a,&shared);

讀書筆記--《程式設計師的自我修養》3目標檔案裡有什麼(3)

3.5 連結的介面–符號 在連結中,我們將函式名和變數統稱為符號,函式名和變數名就是符號名。 每一個目標檔案都有一個符號表,裡面記錄了目標檔案中所有用到的符號。 每一個符號都有一個對應的值,叫做符號值。對於變數和函式來說,符號值就是地址。 符號分為5類。 **(1)本目標檔案中定

讀書筆記--《程式設計師的自我修養》3目標檔案裡有什麼(2

3.4 ELF檔案結構描述 ELF檔案結構如圖所示: ELF目標檔案格式最前面是ELF檔案頭,它包含了描述整個檔案的基本屬性,如ELF檔案版本、目標機器型號、程式入口地址等。接著是ELF檔案各個段。 其中ELF檔案中與段有關的重要結構是段表。該表描述了ELF檔案包含的所有段的資訊

讀書筆記--《程式設計師的自我修養》3目標檔案裡有什麼(1)

3.1、目標檔案的格式 1、目標檔案從結構上講,它是已經編譯後的可執行檔案格式,只是還沒有經過連結的過程,其中可能有些符號或有些地址還沒有調整。其實它本身就是按照可執行檔案格式儲存的。 2、現在PC平臺流行的可執行檔案格式主要是windows下的PE和Linux下的ELF,他們都是C

讀書筆記 ---- 《深入理解Java虛擬機器》---- 2垃圾回收演算法

上一篇:Java記憶體區域與記憶體溢位異常:https://blog.csdn.net/pcwl1206/article/details/83990008 第2篇:垃圾回收演算法 一、判斷物件是否存活的演算法 1、引用計數法 2、可達性分析演算法 3、再談引用 4 

讀書筆記--《Python基礎教程第二版》-- 條件、循環和其他語句

ja5.1 print和import的更多信息5.1.1 使用獨號輸出>>> print ‘Age:‘,42Age: 42>>> 1,2,3(1, 2, 3)>>> print 1,2,31 2 3>>> print (1,2,3)(1,

讀書筆記--《Python基礎教程第二版》-- 抽象

ja6.1 懶惰即美德>>> fibs=[0,1]>>> for i in range(8):... fibs.append(fibs[-2]+fibs[-1])... >>> fibs[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]6

讀書筆記--《Python基礎教程第二版》-- 更加抽象

ja7.1 對象的魔力 多態 不同的類的對象使用同樣的操作 封裝 繼承7.1.1 多態 1、多態和方法 >>>object.getPrice() >>> ‘abc‘.count(‘a‘)1>>> [1,2,‘a‘].count(‘a‘)1>&

讀書筆記】《Python自然語言處理》1 語言處理與Python

1.1 語言計算:文字和詞彙 入門 nltk下載地址 使用pip安裝 >>>import nltk 檢驗是否成功。 >>>nltk.download() 選擇語料下載 使用python直譯器載入book模組中的條目 >&g

筆記深入理解JVM 2 Java記憶體區域與記憶體溢位

1、JVM 執行時資料區 所有執行緒共享的資料區:方法區(持久代)、堆區 執行緒隔離的資料區:程式計數器、Java虛擬機器棧區 堆區構成:新生代 ( 由Eden, From Survivor, To Survivor 構成)、老生代 執行時常量池:方法區一部分,用於存放編

Python編程入門到實踐-2-字符串

string als 作用 小寫 mes 換行符 col scrip The 一、字符串:一系列字符,python中用一號括起來的即為字符串,可單可雙 "This is a string." ‘This is also a string.‘ #引號靈活性的作用:可在

【vue大師晉級之路第一集Vue基礎】2——Vue 例項

建立一個 Vue 例項 每個 Vue 應用都是通過用 Vue 函式建立一個新的 Vue 例項開始的: var vm = new Vue({ // 選項 }) Vue 應用由一個通過 new Vue 建立的根 Vue 例項,以及可選的巢狀的、可複用的元件樹組成。

程式碼註釋機器學習實戰2 k-近鄰演算法

寫在開頭的話:在學習《機器學習實戰》的過程中發現書中很多程式碼並沒有註釋,這對新入門的同學是一個挑戰,特此貼出我對程式碼做出的註釋,僅供參考,歡迎指正。 1、匯入資料: #coding:gbk from numpy import * import operator de

商務參考體系結構企業對消費者 (B2C電子商務實踐) 2 概念設計階段

商務參考體系結構:企業對消費者 第 2 章:概念設計階段 Microsoft Corporation 2001年5月 摘要:本章將說明 Microsoft 解決方案框架 (MSF) 設計過程的概念階段。在這一階段,設計小組將從潛在使用者和業務的角度來確定主要的解決方案概

Kubernetes權威指南Docker到Kubernetes實踐全接觸》pdf附網盤下載連結+(附一個菜鳥的java學習之路)

技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總結都會有特別好的作用。 對於每一章的知識,先閱讀標題,弄懂大概講的是什麼主題,再去快速看一遍,不懂也沒有關係,但是一定要在不懂的

讀書筆記-Mycat權威指南-08-Mycat中的Join

存儲位置 優先 讀書筆記 思路 執行 徹底 cat 條件 ash Join Join 絕對是關系型數據庫中最常用一個特性,然而在分布式環境中,跨分片的 join 確是最復雜的,最難解決一 個問題。 Join:inner ,left,right,full,cross 盡