目錄
前言
一,docker 資源配額
docker容器控制cpu
CPU配額控制引數的混合使用
docker容器控制記憶體
docker 容器控制IO
概念總結:
二,docker swarm集群
1,docker swarm集群是什么
2,Docker Swarm
3,Docker Swarm架構
4,swarm特性
三,命名空間namespace
概念
考什么
四,Pod(重頭戲開始)
1,Pod是什么
2,Pod
3,Pod作業方式
4,PodIP
5,Pod的狀態
6,相關命令
7,自主式Pod
五,Deployment和Replicase
六,Label與Label Selector
1,標簽是干什么的
2,個數
3,標簽的作用
4,相關命令
七,Service服務發現
1,什么是Kubernets中的Service
2,Service的型別
3,Endpoint Controller
4,ClusterIP的創建
5,NodePort的創建
6,CoreDNS
7,Headless Service
8,相關命令
八,DaemonSet與Job
1,DamonSet是什么?
2、DaemonSet和Deployment的區別是什么?
3、Job和CronJob是什么,區別是什么?
4,創建DaemonSet
5,創建一次性任務Job
6,創建CronJob
7,相關命令
九,Pod健康檢查
1,概念
2,探針的種類
3,實作方法Handler
4、存活性探測livenessProbe和就緒性探測readinessProbe的區別是什么?
5、兩種探針都支持的三種探測方法是,檢測判斷依據是什么?
6、探針探測結果有哪三種值?
7,存活探針execaction
8,存活探針TCP
9,存活探針HTTP
10,就緒探針
十,Kubernetes存盤
1,Kubernetes的存盤方式
2,emptyDir
3,HostPath
4,創建pv,pvc
十一,ConfigMip與Secret
1,Config
2,Secret
十二,StatefulSet
1,無狀態與有狀態
2,創建有狀態的三個步驟
十三,kubernets服務質量QoS
1,Best-Effort
2,Burstable
3,Guaranteed
結語
前言
我剛開始感覺一二三部分考的內容不多,可能第一部分就考一些命令,第二部分就考一些概念,要不然還能考什么?考搭建docker swarm集群?不可能!后邊還有一堆kubernets的內容沒考,在這給你考搭建?做夢,第三部分考的幾率也比較小,但是有幾條命令,就寫了點,后來才知道根本不考,所以為了應付考試的話,可以不看哈!重點在第四部分及之后(導圖里全是重點),那才是kubernets的大方向,
下面是老師給的考試的思維導圖奉上

一,docker 資源配額
docker容器控制cpu
Docker是通過CGroups來實作對CPU,記憶體和磁盤I/O等資源的控制,
1,指定docker容器可以使用的cpu份額
例1:給容器分配512權重的cpu使用份額
docker run -it --cpu-shares 512 centos /bin/bash
--cpu-share int :CPU配額引數
例2:設定容器行程需要每秒使用單個CPU的0.2s時間
docker run -dit --cpu-period 100000 --cpu-quota 200000 centos
--cpu-period指定容器對CPU的使用多長時間重新分配一次
--cpu-quota指定在這個周期內最多可以使用的時間
CPU core 核心控制:
引數:--cpuset 可以系結 CPU
CPU配額控制引數的混合使用
例1:指定docker1只能在CPU0和CPU1上運行,且使用份額為512
dockre run -dit --name docker1 --cpuset-cpus 0,1 --cpu-shares 512 centos /bin/bash
例2:指定docker2只能在CPU0和CPU2上運行,且使用份額為1024
docker -dit --name docker2 --cpuset-cpus 0,1 --cpu-shares 1024 centos /bin/bash
docker容器控制記憶體
引數:--memory-swappiness:設定容器的虛擬記憶體控制行為
--kernel-memory:核心記憶體限制
--memory:設定容器使用的最大記憶體上限
--memory-swap:記憶體和swap的總和
--memory-reservation:啟用彈性的記憶體共享
例:創建一個docker,只能使用2個核心,且只能使用128M記憶體,
docker run -it --cpuset-cpus 0,1 -m 128m centos
docker 容器控制IO
引數:--device-read-bps:限制設備的讀速度
--device-read-iops:限制設備每秒讀I/O的次數
--device-write-bps:限制設備的寫速度
--device-write-iops:限制設備每秒寫I/O的次數
例:限制容器實體對硬碟的最高寫入速度為2MB/s,
docker run -it -v /var/www/html/:/var/www/html --device /dev/sda:/dev/sda --device-write-bps /dev/sda:2mb centos /bin/bash
docker容器運行結束自動釋放資源
引數:--rm:當容器運行結束后,自動洗掉容器,釋放資源
例:
docker run -it --rm --name c1 centos sleep
概念總結:
資源配額就是可以實作容器的資源調度使用的控制,及容器的讀寫速度,運行在哪個CPU上,
二,docker swarm集群
1,docker swarm集群是什么
是一套管理Docker集群的工具,將一群Docker宿主機變成一個單一的,虛擬的主機
2,Docker Swarm
服務(Service):實在作業節點所允許的一組任務的定義,是整個swarm的核心,一個service由多個任務組成
任務(Task):是swarm中最小調度單元,任務就是一個容器,容器中運行的命令或應用,
3,Docker Swarm架構
Swarm Manager管理節點:負責swarm集群管理,并向作業節點分配作業
Swarm Node作業節點:接受并執行來自管理節點分配的任務
一個Node就是一臺Docker宿主機,管理節點是領導,作業節點是小兵,但領導也會作業,小兵也可以被提拔為領導,
4,swarm特性
動態擴展服務--水平擴展
負載均衡,節點宕機,節點提權/降權
三,命名空間namespace
概念
kubernetes支持多個虛擬集群,它們底層依賴于同一個物理集群,這些虛擬集群被稱為命名空間,
考什么
既然是命名空間,那就肯定是考創建,查看,洗掉,切換……
例1:查看有哪些命名空間
kubectl get namespace
例2:查看命名空間及其資源物件
kubectl get pods -n kube-system k8s的安裝組件在此
例3:創建一個test命名空間
kubectl create ns test
例4:切換命名空間
kubectl config set-context --current --namespace=kube-system
例5:洗掉命名空間
kubectl delete ns test
例6:查看命名空間詳細資訊
kubectl describe ns test
還有一個點就是namespace的資源限額,這個可能就考考你yaml清單檔案里的內容什么意思
例7:所有容器的記憶體請求總額不得超過2GiB,
所有容器的記憶體限額總額不得超過4 GiB,
所有容器的CPU請求總額不得超過2 CPU,
所有容器的CPU限額總額不得超過4CPU,
hard:
requests.cpu: "2"
requests.memory: 2Gi
limits.cpu: "4"
limits.memory: 4Gi
四,Pod(重頭戲開始)
1,Pod是什么
Kubernets中的最小調度單元,
2,Pod
Pod中運行容器,容器中指定鏡像,容器可以有多個,為避免管理復雜化,盡量采用一個容器的Pod,
3,Pod作業方式
Pod需要調度到nod作業節點中來運行,具體哪個節點看scheduler調度器,
4,PodIP
每個Pod都會有一個唯一的IP地址,
5,Pod的狀態
Pending(掛起),Running(正常運行中,一般都是這個),Succeeded(成功運行完畢),Unknown(未知),Failed(失敗)
6,相關命令
創建pod,洗掉pod,查看pod,查看pod詳細資訊,查看所有podIP節點資訊,進入pod
kubectl apply -f filename.yaml
kubectl delete podname
kubectl get pods
kubectl describe pod podname
kubectl get pods -o wide
kubectl exec -it podname /bin/bash
7,自主式Pod
一般我們都會以yaml資源清單的方式(就是檔案名可以隨便起,擴展名必須是.yaml)去創建,考的時候也是這么考,可能考你這個yaml檔案怎么寫,也可能給出你來,讓你去解釋每行什么意思,下面就來簡單介紹一下吧!
apiVersion: v1 ##版本資訊
kind: Pod ##創建的是什么型別
metadata: ##物件,定義元資料屬性資訊
name: Podname ##Pod的名字
namespace: default ##此Pod屬于哪個命名空間
labels: ##Pod的標簽
app:tomcat ##app=tomcat
spec: ##代表下面是容器的資訊
containers: ##容器中會執行的命令
- name: dockername1 ##容器的名字
image: centos ##容器要用到的鏡像
ports: ##埠資訊
- containerPort: 8080 ##暴露8080埠
imagePullPolicy: IfNotPresent ##鏡像的拉取策略,分為三種,下邊會說到
- name: dockername2 ##第二個容器的資訊,與第一個基本相似
image: ……
…… ……
…… ……
- Always:不管鏡像是否存在都會進行一次拉取,
- Never:不管鏡像是否存在都不會進行拉取
- IfNotPresent:只有鏡像不存在時,才會進行鏡像拉取
通過上面這個檔案創建出來的Pod,我們稱之為自主式Pod,簡單來說就是,刪掉后就是刪掉了,這就是他的一個缺陷,所以就會用到下邊的Deployment或者Replicaset控制器的方式來管理Pod,
五,Deployment和Replicase
其實我在一篇文章中已經詳細的講過Deployment控制器了,本篇文章就不再詳細說了,可以去看這篇:K8S控制器之Deployment詳解及配置,_無求道賈的博客-CSDN博客,這次就來說說Deployment和replicase的區別,
首先:是Deployment包含Replicase,再一個需要注意i的地方,就是Deployment在更新回滾Pod的時候是全自動的,不需要手動去洗掉舊的Pod,而Replicase是不會自動洗掉的,它需要你手動去洗掉,這是他的缺陷,還有一個就是Replicase=rc=rs,基本都是一個東西,
六,Label與Label Selector
1,標簽是干什么的
標簽(Label)就是附在Kubernets物件(如Pod,Deployment)上的鍵對值(Key-Value),可以在創建時指定,也可以在創建后指定
2,個數
一個物件可以有多個標簽,
3,標簽的作用
其實Label的作業不僅僅是一種物件的標識,后面我們會通過特殊的標簽去對應Pod等等一些服務,這才是它的關鍵作用,
還有一個就是更方便的管理不同的Pod,比如你有5個Pod,但你想統一管理其中3個Pod,就可以給這三個Pod打上相同的Label,從而實作更方便的批量管理,
4,相關命令
這一部分內容,除了上邊的理論之外,就是如何給物件打標簽的語法了,一起來看看吧!
例1:查看所有Pod的所有label,
kubectl get pods --show-labels
例2:給Pod打標簽,給pod打上一個time=2021的標簽,
kubecal label pod podname time=2021
例3:基于等值的標簽選擇器查,查標簽為time=2021的pod,并顯示其標簽,
kubectl label pod -l time=2021 --show-labels
例4:基于集合的標簽選擇器查,查標簽time不是2022的,并顯示其標簽,
kubectl get pod -l time!=2022 --show-labels
例5:還有就是再yaml資源清單中的metadata欄位下來定義,
metadata:
app: nginx
time: 2021
key: value
例6:除此之外還可以給node節點打標簽,一般用于讓這個Pod運行在這個node節點上,
kubectl label nodes nodename env=test
在yaml檔案中通過nodeSector欄位來選擇這個節點
nodeSelector:
env: test
七,Service服務發現
1,什么是Kubernets中的Service
簡單來說就是外界訪問pod的橋梁,對外暴露服務的方式,那么問題來了,每個Pod不是有自己唯一的IP嗎?我們在擴容,更新時Pod是會改變的,所以就引入了Service,通過Service去訪問所對應的Pod,而它們之間就是通過相同的labels來關聯的
2,Service的型別
ClusterIP:默認模式,提供一個集群內部的虛擬IP專供集群內部訪問,外部無法訪問,
NodePort:在所有節點上開放一個特定埠,任何發送到該埠的流量都被轉發到對應服務,
Load Balancer:直接暴露服務,所有通往你指定的埠的流量都會被轉發到對應的服務,它沒有過濾條件,沒有路由,
3,Endpoint Controller
負責維護Service和Pod IP之間的對應關系,當Service對應的Pod發生變化時,endpoints也會自動改變,
4,ClusterIP的創建
同樣,Service的創建也是寫yaml資源清單,
apiVersion: v1
kind: Service
metadata:
name: Servicename
spec:
selector:
app: httpd ##通過此標簽自動匹配相同標簽的Pod
ports:
- protocol: TCP
port: 8080 ##Service的埠,客戶端通過此埠訪問
targetPort: 80 ##后端Pod的埠,需與Pod提供服務的埠一致
5,NodePort的創建
apiVersion: v1
kind: Service
metadata:
name: Servicename
spec:
type: NodePort ##新增加的用于指定Service型別
selector:
app: httpd ##和上一個一樣用于做匹配關聯
ports:
- protocol: TCP
port: 8080 ##Service的埠
targetPort: 80 ##后端容器埠
nodePord: 30144 ##訪問時通過“節點IP地址:埠”
6,CoreDNS
以域名的方式來訪問Pod,
kubeDNS是前期版本kubernets中默認的dns組件
IPVS需要手動開啟方可使用
7,Headless Service
沒有IP地址的Service服務,主要用于StatefulSet(后邊會講到)
apiVersion: v1
kind: Service
metadata:
name: Servicename
spec:
selector:
app: httpd ##通過此標簽自動匹配相同標簽的Pod
ports:
- protocol: TCP
port: 8080 ##Service的埠,客戶端通過此埠訪問
targetPort: 80 ##后端Pod的埠,需與Pod提供服務的埠一致
clusterIP: None ##多出來的一條,就是為了說明此Service沒有IP
8,相關命令
例:應用Service,查看Service,洗掉Service,查看endpoint資訊:
kubectl apply -f Servicefiel.yaml
kubectl get service -o wide
kubectl delete service servicename
kubectl get endpoints
八,DaemonSet與Job
1,DamonSet是什么?
DaemonSet是另一種Pod控制器,不同于Deployment和rs,
2、DaemonSet和Deployment的區別是什么?
DaemonSet在每個節點都會自動生成一個pod跟隨節點的變化而變化,節點存在則存在,節點消失則消失,而Deployment是始終維持副本數量,
3、Job和CronJob是什么,區別是什么?
job:一次性任務
cronjob:周期性任務,每執行依次都會生成一個一次性的pod
4,創建DaemonSet
通過yaml資源清單檔案
apiVersion: apps/v1 ##版本不同
kind: DaemonSet ##型別不一樣
metadata:
name: DaemonSetname
spec:
selector:
matchLabels:
app: nginx
template: ##Pod模板資訊
metadata:
labels:
app: nginx
spec:
containers:
- name: dockername
image: nginx
ports:
- containerPort: 80
5,創建一次性任務Job
通過yaml資源清單檔案
apiVersion: batch/v1 ##版本不同
kind: Job ##型別不一樣
metadata:
name: Jobname
spec:
selector:
matchLabels:
app: nginx
template: ##Pod模板資訊
metadata:
labels:
app: nginx
spec:
containers:
- name: dockername
image: nginx
command: ["/bin/bash","-c","-- sleep 30000"]
restartPolicy: Never ##重啟策略,只能為Never或OnFailure
backoffLimit: 3 ##job失敗后重啟的次數
在deployment,restartPolicy還可以設定為always
6,創建CronJob
通過yaml資源清單檔案,Cron Job不是Job的一種,屬于不同Kind
apiVersion: batch/v1beta1 ##版本不同
kind: CronJob ##型別不一樣
metadata:
name: CronJobname
spec:
schedule: "*/1 * * * *" ##分時日月周
jobTemplate: ##一次性任務的模板資訊
spec:
template: ##Pod模板資訊
spec:
containers:
- name: dockername
image: nginx
command: ["/bin/bash","-c","-- sleep 30000"]
Kubernetes cluster
restartPolicy: OnFailure ##重啟策略,只能為Never或OnFailure
7,相關命令
例:應用,洗掉,查看一次性Job日志,查看job,cronjob,deamonset
kubectl apply -f filename.yaml
kubectl delete job jobname
kubectl delete cronjob cronjobname
kubectl delete deamonset deamonsetname
kubectl logs jobname
kubectl get job/cronjob/deamonset
九,Pod健康檢查
1,概念
簡單來說就是Kubernets借助不同種類的探針來檢查Pod是否正常運行或正常提供服務
2,探針的種類
Liveness探針:存活探針,用于捕獲容器是否處于存活狀態,若失敗,會嘗試重啟策略恢復容器,
Readiness探針:就緒探針,顧名思義,就是檢查Pod是否準備好對外提供服務,若沒有,則會將Pod從匹配的endpointcontroller中刪掉,
3,實作方法Handler
兩種種類的探針使用的都是以下三種實作方法,
ExecAction:在容器內執行命令來診斷是否成功,
TCPSockerAction:對指定埠上的容器的IP地址進行TCP檢查,埠打開為成功,
HTTPGetAction:對指定埠上的容器的IP地址執行HTTP Get請求,若回傳碼>=200且<400,則為成功,
4、存活性探測livenessProbe和就緒性探測readinessProbe的區別是什么?
| 存活探針(livenessProbe) | 就緒探針(readinessProbe) | |
| Pod出錯時 | 殺死出錯Pod,重啟Pod | 等待 |
| 服務 | Endpoint中自動更新Pod資訊 | 從Endpoint洗掉錯誤的Pod |
| 功能 | 查看Pod是否存活 | 查看Pod是否準備好提供服務 |
5、兩種探針都支持的三種探測方法是,檢測判斷依據是什么?
| 三種探測方式 | 判斷依據 |
| ExecAction | 進入容器,執行一條命令 |
| TCPSocketAction | Tcp埠是否成功 |
| HTTPGetAction | Http服務獲取值是否在[200,400) |
6、探針探測結果有哪三種值?
| 三種探測方式 | 探測結果 |
| ExecAction | 0成功,其余失敗 |
| TCPSocketAction | Tcp埠打開則成功,否則為是被 |
| HTTPGetAction | Http服務回應狀態碼在[200,400)為成功,否則為失敗, |
7,存活探針execaction
使用方法就是在pod資源清單檔案中containers內容下加入如下代碼:
spec:
containers:
- name: dockernaem
image: centos
args:
- /bin/bash
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe: ##探針的型別
exec: ##探針的實作方法
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 ##探測延遲5秒
periodSeconds: 5 ##探測周期5秒
默認情況下,三次探測失敗,則認為容器不存活,一次探測成功,則認為容器存活,這個默認次數可變,
8,存活探針TCP
spec:
containers:
- name: dockername
image: centos
livenessProbe: ##探針型別
tcpSocket: ##探針實作方法
port: 23 ##檢查的埠
initialDelaySeconds: 60
periodSeconds: 20
9,存活探針HTTP
spec:
containers:
- name: dockername
image: centos
livenessProbe: ##探針型別
httpGet: ##探針實作方法
port: 8080
httpHeaders:
- name: headersname
value:
10,就緒探針
把livernessProbe改為readinessProbe即可,其他都一樣,只是處理方式不同,
十,Kubernetes存盤
1,Kubernetes的存盤方式
emptyDir:當Pod被成功分配到某個節點時,就會自動創建一個emptyDir,只要Pod在這個節點上,emptyDir就一直在,Pod無emptyDir也隨之永遠洗掉,雖方便,但不安全,
君生即我生,君去隨君去
pod有,我就有,pod無,我也無
HostPath:需在pod被分配到的node節點上建一個目錄,但因為不知道pod會被分配到哪個節點,所以要每個節點都建一個目錄(弊端),pod洗掉后,目錄及檔案依然在,
君生伴我生,君去我不去
PV和PVC:pv:由管理員配置的一塊存盤空間,是集群中的資源,可以是NFS,云存盤等等,PVC:用戶的存盤請求,去請求pv
2,emptyDir
就是在Pod的資源清單里通過volumes欄位掛載
spec:
containers:
- image: centos
name: docekrname
volumeMounts: ##掛載卷
- mountPath: /ceshi ##容器內路徑
name: ceshi-volume ##通過名字去匹配卷
volumes: ##卷
- name: ceshi-volume ##卷名
empytyDir: {} ##大小
3,HostPath
volumeMounts:
- mountPath: /tmp
name: test
volumes:
- name: test
hostPath:
path: /tmp
type: Directory
4,創建pv,pvc
apiVersion: v1
kind: PersistentVolume ##型別pv
metadata:
name: jpzpv1
spec:
capacity: ##大小
storage: 1Gi
accessModes: ##訪問模式
- ReadWriteMany ##多次讀寫
persistentVolumeReclaimPolicy: Recycle ##回收策略
storageClassName: jpz-sc
nfs:
path: /nfs/jpzpv1
server: 192.168.100.31
訪問模式:Read'Write'Once: 讀寫模式,一個節點,
ReadOnlyMany:只讀模式,多個節點,
Read Write Many:讀寫模式,多個節點,同時加載,
回收策略:Retain:保留,手動洗掉 Reycle:回收 Delete:洗掉
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jpzpvc1
spec:
accessModes: ##和pv一樣
- ReadWriteMany
volumeName: jpzpv1 ##匹配pv名
resources:
requests:
storage: 1Gi
其實關于pv和pvc還有很多沒有涉及到的,深入學習的話還需學習其它文章,
十一,ConfigMip與Secret
1,Config
用于保存非機密性的配置(明文配置),資料通過key--value的鍵值對形式存盤,也可以是檔案,
Config可以做成Volume,通過volume的方式映射到容器內部目錄,從而實作對容器內部組態檔更方便的統一管理,局限性是資料不可超過1MB,
2,Secret
用于存放一些敏感資料內容,如密碼,密鑰等資料,保證這些資料不會暴露到鏡像或者Pod Spec中,
十二,StatefulSet
1,無狀態與有狀態
無狀態stateless:無持久化存盤,IP地址變換,
有狀態stateful:持久化的存盤,通過pvc,穩定的網路,通過Headless Service,Pod基于序號的有序操作,
2,創建有狀態的三個步驟
搭建存盤服務器,如nfs,創建pv和pvc,創建StatefulSet(它包含了pvc),創建Headless Se rvice,無固定IP的方式被請求,
十三,kubernets服務質量QoS
spec:
containers:
- name:
image:
resources:
limits:
memory: ""
cpu: ""
requests:
memory: ""
cpu: ""
1,Best-Effort
沒有limit和request
2,Burstable
中級:一般limit>request
3,Guaranteed
最高級別,requests和limits數值一樣
結語
后來老師講了復習之后,我就感覺我寫的太詳細了,于是后邊就寫的簡單了些,只寫了考點,也是快考試沒時間了,這篇文章就先這樣吧,等到以后有時間了,我會把每一部分,尤其是后邊的再細化,可以作為一個簡單的學習手冊來用,
這篇文章寫了好長時間,因為一直有課,挺不容易的,一萬三千字,大家多多支持吧!有錯誤的話歡迎指出,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/383073.html
標籤:其他
上一篇:辦公網路環境搭建
