簡介
- Kubernetes(通常稱為k8s)是一個以容器為中心的基礎架構,可以實現在物理集群或虛擬機集群上調度和運行容器,提供容器自動部署、擴展和管理的開源平臺.滿足了應用程序在生產環(huán)境中的一些通用需求:應用實例副本、水平自動擴展、命名與發(fā)現、負載均衡、滾動升級、資源監(jiān)控等
特點
- 可移植:支持公有云,私有云,混合云、多重云
- 可擴展:模塊化、插件化、可掛載、可組合
- 自動化:自動部署、自動重啟、自動復制、自動伸縮/擴展
- 快速部署應用,快速擴展應用
- 無縫對接新的應用功能
- 節(jié)省資源,優(yōu)化硬件資源的使用
核心組件
- Kubernetes遵循master-slave architecture.Kubernetes的組件可分為管理單個的node組件和控制平面的一部分組件
- Kubernetes Master是集群的主要控制單元,用于管理其工作負載并指導整個系統的通信.Kubernetes控制平面由各自的進程組成,每個組件都可以在單個主節(jié)點上運行,也可以支持high-architecture clusters的多個主節(jié)點上運行
| 組件 | 說明 |
|---|---|
| etcd | 保存了整個集群的狀態(tài) |
| apiserver | 提供了資源操作的唯一入口,并提供認證、授權、訪問控制、API注冊和發(fā)現等機制 |
| controller manager | 負責維護集群的狀態(tài),比如故障檢測、自動擴展、滾動更新等 |
| scheduler | 負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上 |
| kubelet | 負責維護容器的生命周期,同時也負責Volume(CVI)和網絡(CNI)的管理 |
| Container runtime | 負責鏡像管理以及Pod和容器的真正運行(CRI) |
| kube-proxy | 負責為Service提供cluster內部的服務發(fā)現和負載均衡 |

image.png

image.png
- Add-ons
| 組件 | 說明 |
|---|---|
| kube-dns | 負責為整個集群提供DNS服務 |
| Ingress Controller | 為服務提供外網入口 |
| Heapster | 提供資源監(jiān)控 |
| Dashboard | 提供GUI |
| Federation | 提供跨可用區(qū)的集群 |
| Fluentd-elasticsearch | 提供集群日志采集、存儲與查詢 |
部署Kubernetes
架構
| 角色 | IP | 主機名 |
|---|---|---|
| master | 10.0.0.111/172.16.12.111 | k8s_master |
| node01 | 10.0.0.112/172.16.12.112 | k8s_node01 |
| node02 | 10.0.0.113/172.16.12.113 | k8s_node02 |
master節(jié)點
- 在master設置hosts解析
[root@k8s_master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.11 k8s_master
10.0.0.12 k8s_node01
10.0.0.13 k8s_node02
- 安裝軟件包
[root@k8s_master ~]# yum install etcd docker kubernetes flannel -y
[root@k8s_node01 ~]# yum install docker kubernetes flannel -y
[root@k8s_node02 ~]# yum install docker kubernetes flannel -y
- 修改配置
- yum安裝的etcd默認配置文件在/etc/etcd/etcd.conf
[root@k8s_master ~]# grep -Ev "^$|#" /etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="default"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.111:2379"
- 啟動etcd
[root@k8s_master ~]# systemctl start etcd
[root@k8s_master ~]# systemctl enable etcd
- 測試etcd
[root@k8s_master ~]# etcdctl -C http://10.0.0.111:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://10.0.0.111:2379
cluster is healthy
- 配置并啟動kubernetes
# /etc/kubernetes/apiserver配置文件內容
[root@k8s_master ~]# grep -Ev "^$|#" /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.111:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
KUBE_API_ARGS=""
# /etc/kubernetes/config配置文件內容
[root@k8s_master ~]# grep -Ev "^$|#" /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://10.0.0.111:8080"
- 啟動服務
[root@k8s_master ~]# systemctl start kube-apiserver.service
[root@k8s_master ~]# systemctl enable kube-apiserver.service
[root@k8s_master ~]# systemctl start kube-controller-manager.service
[root@k8s_master ~]# systemctl enable kube-controller-manager.service
[root@k8s_master ~]# systemctl start kube-scheduler.service
[root@k8s_master ~]# systemctl enable kube-scheduler.service
node節(jié)點
- 部署配置node
# node01 /etc/kubernetes/config配置文件內容
[root@k8s_node01 ~]# grep -Ev "^$|#" /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://10.0.0.111:8080"
# node01 /etc/kubernetes/kubelet配置文件內容
[root@k8s_node01 ~]# grep -Ev "^$|#" /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=10.0.0.112"
KUBELET_API_SERVER="--api-servers=http://10.0.0.111:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""
# node02 /etc/kubernetes/config配置文件內容
[root@k8s_node02 ~]# grep -Ev "^$|#" /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://10.0.0.111:8080"
# node02 /etc/kubernetes/kubelet配置文件內容
[root@k8s_node02 ~]# grep -Ev "^$|#" /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=10.0.0.113"
KUBELET_API_SERVER="--api-servers=http://10.0.0.111:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""
- 啟動
[root@k8s_node01 ~]# systemctl start kubelet.service
[root@k8s_node01 ~]# systemctl enable kubelet.service
[root@k8s_node01 ~]# systemctl start kube-proxy.service
[root@k8s_node01 ~]# systemctl enable kube-proxy.service
[root@k8s_node02 ~]# systemctl start kubelet.service
[root@k8s_node02 ~]# systemctl enable kubelet.service
[root@k8s_node02 ~]# systemctl start kube-proxy.service
[root@k8s_node02 ~]# systemctl enable kube-proxy.service
- 在master上查看集群中節(jié)點及節(jié)點狀態(tài)
[root@k8s_master ~]# kubectl -s http://10.0.0.111:8080 get node
NAME STATUS AGE
10.0.0.112 Ready 1m
10.0.0.113 Ready 2m
[root@k8s_master ~]# kubectl get nodes
NAME STATUS AGE
10.0.0.112 Ready 2m
10.0.0.113 Ready 2m
創(chuàng)建覆蓋網絡--Flannel
- 配置Flannel(所有節(jié)點操作)
[root@k8s_node02 ~]# grep "^[a-Z]" /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://10.0.0.111:2379"
FLANNEL_ETCD_PREFIX="/atomic.io/network"
- 配置etcd中關于Flannel的key
- Flannel使用Etcd進行配置,來保證多個Flannel實例之間的配置一致性,所以需要在etcd上進行配置
- /atomic.io/network/config與/etc/sysconfig/flanneld中的FLANNEL_ETCD_PREFIX="/atomic.io/network"是相對應的
# 操作創(chuàng)建網絡
[root@k8s_master ~]# vim /etc/sysconfig/flanneld
[root@k8s_master ~]# etcdctl mk /atomic.io/network/config '{"Network":"172.16.0.0/16"}'
{"Network":"172.16.0.0/16"}
# master節(jié)點操作
[root@k8s_master ~]# systemctl enable flanneld.service
[root@k8s_master ~]# systemctl start flanneld.service
[root@k8s_master ~]# systemctl restart docker
[root@k8s_master ~]# systemctl restart kube-apiserver.service
[root@k8s_master ~]# systemctl restart kube-controller-manager.service
[root@k8s_master ~]# systemctl restart kube-scheduler.service
# node節(jié)點操作
[root@k8s_node01 ~]# systemctl enable flanneld.service
[root@k8s_node01 ~]# systemctl start flanneld.service
[root@k8s_node01 ~]# systemctl restart docker
[root@k8s_node01 ~]# systemctl restart kubelet.service
[root@k8s_node01 ~]# systemctl restart kube-proxy.service
Kubernetes其他安裝方法
kubuadm
minikube
Ansible部署:https://github.com/easzlab/kubeasz
編譯安裝
Kubernetes核心概念
Pod
- Pod是Kubernetes的基本操作單元,也是應用運行的載體.整個Kubernetes系統都是圍繞著Pod展開的,比如如何部署運行Pod、如何保證Pod的數量、如何訪問Pod等

image.png
基本操作
| 操作 | 指令 |
|---|---|
| 創(chuàng)建 | kubectl create -f xxx.yaml |
| 查詢 | kubectl get yourPodName;kubectl describe pod youPodNAme |
| 刪除 | kubectl delete pod yourPodName |
| 更新 | kubectl replace /path/to/yourPodName |
Pod與容器
- 在Docker中,容器是最小的處理單元,增刪改查的對象是容器,容器是一種虛擬化技術,容器之間是隔離的,隔離是基于Linux Namespace實現的.而在kubernetes中,Pod包含一個或者多個相關的容器,Pod可以認為是容器的一種延伸,一個Pod也是一個隔離體,而Pod內部包含的一組容器又是共享的(包括PID、Network、IPC、UTS).除此之外,Pod中的容器可以訪問共同的數據卷來實現文件系統的共享
鏡像
- 在kubernetes中,鏡像的下載策略為
- Always:每次都下載最新的鏡像
- Never:只使用本地鏡像,從不下載
- IfNotPresent:只有當本地沒有的時候才下載鏡像
- Pod被分配到Node之后會根據鏡像下載策略進行下載鏡像,可以根據自身集群的特點來決定采用何種下載策略.無論何種策略,都要確保Node上有正確的鏡像可用
其他設置
- 通過yaml文件,可以在Pod中設置:
- 啟動命令:spec-->containers-->command
- 環(huán)境變量:spec-->containers-->env-->name/value
- 端口橋接:spec-->containers-->ports-->containerPort/Protocol/hostIP/hostPort(使用hostPort時需要注意端口沖突的問題,不過kubernetes在調度Pod的時候回檢查宿主機端口是否沖突,比如當兩個Pod均要求綁定宿主機的80端口,kubernetes會將這兩個Pod分別調度到不同的機器上)
- Host網絡:一些特殊場景下,容器必須要以host方式進行網絡設置(如接收物理機網絡才能夠接收到的組播流),在Pod中也支持host網絡的設置,spec-->hostNetwork=true
- 數據持久化:spec-->containers-->volumeMounts-->mountPath
- 重啟策略:當Pod中的容器終止退出后,重啟容器的策略.這里的Pod重啟,實際上的做法是容器的重建,之前容器中的數據將會丟失,如果需要持久化數據,那么需要使用數據卷進行持久化設置.Pod支持三種重啟策略
- Always(默認策略,當容器終止退出后,總是重啟容器)
- OnFailure(當容器終止且異常退出時,重啟)
- Never(從不重啟)
Replication Controller
- Replication Controller(RC)是Kubernetes的另一個核心概念,應用托管在Kubernetes之后,Kubernetes需要保證應用能夠持續(xù)運行,這是RC的工作內容,它會確保任何時間Kubernetes中都有指定數量的Pod在運行.在此基礎上,RC還提供了一些更高級的特性,比如滾動升級、升級回滾等
RC與Pod的關聯
- RC與Pod的關聯是通過Label來實現的.Label機制是Kubernetes中的一個重要設計,通過Label進行對象的弱關聯,可以靈活地進行分類和選擇.對于Pod,需要設置其自身的Label來進行標識,Label是一些了的key/value對,在Pod-->metadata-->labeks中進行設置
- Lable的定義時任意的,但是Label必須具有可標識性,比如設置Pod的應用名稱和版本號等.另外Label是不具有唯一性的,為了更準確的標識一個Pod,應該為Pod設置多個維度的Label
"release":"stable","release":"canary"
"environment":"dev","environment":"prod"
- 當在RC的yaml文件中定義了該RC的selector中的label為app:myweb,那么這個RC就會去關注Pod-->metadata-->labeks中l(wèi)abel為app:myweb的Pod.修改了對應Pod的Label,就會使Pod脫離RC的控制.同樣,在RC運行正常的時候,若試圖繼續(xù)創(chuàng)建同樣Label的Pod,是創(chuàng)建不出來的.因為RC認為副本數已經正常了,再多起的話會被RC刪掉
彈性伸縮
- 彈性伸縮是指適應負載變化,以彈性可伸縮的方式提供資源.反映到Kubernetes中,指的是可根據負載的高低動態(tài)調整Pod的副本數量.調整Pod的副本數是通過修改RC中Pod的副本來實現的
# 擴容Pod的副本數目到10
kubectl scale relicationcontroller youRcName --replicas=10
# 縮容Pod的副本數目到1
kubectl scale relicationcontroller youRcName --replicas=1
滾動升級
- 滾動升級是一種平滑過渡的升級方式,通過逐步替換的策略,保證整體系統的穩(wěn)定,在初始升級的時候就可以及時發(fā)現、調整問題,以保證問題影響度不會擴大.Kubernetes中滾動升級的命令為:
kubectl rolling-update my-rcName-v1 -f my-rcName-v2-rc.yaml --update-period=10s
- 升級開始后,首先依據提供的定義文件創(chuàng)建v2版本的RC,然后每隔10s(--update-period=10s)逐步增加v2版本的Pod副本數,逐步減少v1版本Pod的副本數.升級完成之后,刪除v1版本的RC,保留v2版本的RC,實現滾動升級
- 升級過程中,發(fā)生了錯誤中途退出時,可以選擇繼續(xù)升級.Kubernetes能夠智能的判斷升級中斷之前的狀態(tài),然后緊接著繼續(xù)執(zhí)行升級,也可以進行回退
kubectl rolling-update my-rcName-v1 -f my-rcName-v2-rc.yaml --update-period=10s --rollback
- 回退的方式實際就是升級的逆操作,逐步增加v1版本的Pod副本數,逐步減少v2版本Pod的副本數
新一代副本控制器replica set
- replica set可以被認為是升級版的Replication Controller.replica set是用于保證與label selector匹配的pod數量維持在期望狀態(tài).區(qū)別在于,replica set引入了對基于自己的selector查詢條件,而Replication Controller僅支持基于值相等的selector條件查詢
Service
- Kubernetes中的核心要素Service提供了一套簡化的服務代理和發(fā)現機制,天然適應微服務架構
原理
在Kubernetes中,在受到RC調控的時候,Pod副本是變化的,對于虛擬IP也是變化的,比如發(fā)生遷移或者伸縮的時候.這對于Pod的訪問者來說是不可接受的.Kubernetes中的Service是一種抽象概念,它定義了一個Pod邏輯集合以及訪問它們的策略,Service同Pod的關聯同樣是基于Label來完成的.Service的目標是提供一種橋梁,它會為訪問者提供一個固定訪問地址,用于在訪問時重定向到相應的后端,這使得非Kubernetes原生應用程序,在無須為Kubernetes編寫特定代碼的前提下,輕松訪問后端
Service同RC一樣,都是通過Label來關聯Pod.當在Service的yaml文件中定義該Service的selector中的lable為app:myweb,那么這個Service會將Pod-->metadata-->labeks中的label為app:myweb的Pod作為分發(fā)請求的后端.當Pod發(fā)生變化時(增加、減少、重建等),Service會及時更新.這樣,Service就可以作為Pod的訪問入口,起到代理服務器的作用,而對于訪問者來說,通過Service進行訪問,無需直接感知Pod
注意的是,Kubernetes分配給Service的固定IP是一個虛擬IP,并不是一個真實的IP,在外部是無法尋址的.真實的系統實現上,kubernetes是通過kube-proxy組件來實現的虛擬IP路由及轉發(fā).實現了kubernetes層級的虛擬轉發(fā)網絡
Service內部負載均衡
- 當Service的Endpoints包含多個IP的時候,及服務器代理存在多個后端,將進行請求的負載均衡.默認的負載均衡策略是輪詢或者隨機(由kube-proxy的模式決定).同時,Service上通過設置Service-->spec-->sessionAffinity=ClientIP,來實現基于源IP地址的會話保持
發(fā)布Service
- Service的虛擬IP是由Kubernetes虛擬出來的內部網絡,外部是無法尋址到的.有些服務需要被外部訪問到,例如Web前端.這時候需要加一層網絡轉發(fā),即外網到內網的轉發(fā),即外網到內網的轉發(fā).Kubernetes提供了NodePort、LoabBalancer、Ingress三種方式
- NodePort:Kubernetes會在每一個Node上暴露一個端口:nodeport,外部網絡可以通過(任一node)[NodeIP]:[NodePort]訪問到后端的Service
- LoadBalance:在NodePort基礎上,Kubernetes可以請求底層云平臺創(chuàng)建一個負載均衡器,將每個Node作為后端,進行服務分發(fā).該模式需要底層云平臺(例如GCE)支持
- Ingress:是一種HTTP方式的路由轉發(fā)機制,由Ingress Controller和HTTP代理服務器組合而成.Ingress Controller實時監(jiān)控Kubernetes API,實時更新HTTP代理服務器的轉發(fā)規(guī)則.HTTP代理服務器有GCE Load-Balancer、Nginx、HaProxy等
Servicede自發(fā)性機制
- Kubernetes中有一個重要的服務自發(fā)現特性.一旦一個Service被創(chuàng)建,該Service的Service IP和Service port等信息都可以被注入到Pod中供它們使用.Kubernetes主要支持兩種Service發(fā)現機制:環(huán)境變量和DNS
- 環(huán)境變量方式:
- Kubernetes創(chuàng)建Pod時會自動添加所有可用的Service環(huán)境變量到該Pod中,如有需要,這些環(huán)境變量就被注入Pod內的容器里,需要注意的是,環(huán)境變量的注入只發(fā)生在Pod創(chuàng)建時,且不會被自動更新.這個特點暗含了Service和訪問該Service的Pod的創(chuàng)建時間的先后順序,即任何想要訪問Service的Pod都需要在Service已經存在后創(chuàng)建,否則與Service相關的環(huán)境變量就無法注入該Pod的容器中,這樣先創(chuàng)建的容器就無法發(fā)現后創(chuàng)建的Service
- DNS方式:
- DNS服務器使用Kubernetes的watchAPI,不間斷的監(jiān)測新的Service的創(chuàng)建并為每個Service新建一個DNS記錄.如果DNS在整個集群范圍內都可用,那么所有的Pod都能夠自動解析Service的域名
多個Service避免地址和端口沖突
- Kubernetes為每個Service分配一個唯一的ClusterIP,當時用ClusterIP:port的組合訪問一個Service的時候,不管port是什么,這個組合一定不會發(fā)生重復.另一方面,kube-proxy為每個Service真正打開的是一個不會重復的隨機端口,用戶在Service描述文件中指定的訪問端口會被映射到這個隨機端口上
Deployment
- Kubernetes提供了一種更加簡單的更新RC和Pod的機制,Deployment.通過在Deployment中描述期望的集群狀態(tài),Deployment Controller會將現在的集群狀態(tài)在一個可控的速度下逐步更新成所期望的集群狀態(tài),Deployment主要功能是保證Pod的數量和健康,90%的功能與Replication Controller一致,具備了Replication Controller之外的新特性
- 事件和狀態(tài)查看:可以查看Deployment的升級詳細進度和狀態(tài)
- 回滾:當升級Pod鏡像或者相關參數的時候發(fā)現問題,可以使用回滾操作回滾到上一個穩(wěn)定的版本或者指定的版本
- 版本記錄:每一次對Deployment的操作,都能保存下來,給予后續(xù)可能的回滾使用
- 暫停和啟動:對于每一次升級,都能夠隨時暫停和啟動
- 多種升級方案:Recreate--刪除所有已存在的Pod,重新創(chuàng)建新的;RollingUpdate--滾動升級,逐步替換的策略,同時滾動升級時,支持更多的附加參數,例如設置最大不可用Pod數量,最小升級間隔時間等
滾動升級
- 相比于RC,Deployment直接使用kubectl edit Deployment/DeploymentName或者kubectl set方法就可以直接升級(原理是Pod的template發(fā)生變化,例如更新label、更新鏡像版本等操作會觸發(fā)Deployment的滾動升級)
Deployment命令
kubectl describe deployments # 查詢詳細信息,獲取進度升級
kubectl rollout pause deployment/nginx-deployment2 # 暫停升級
kubectl rollout resume deployment/nginx-deployment2 # 繼續(xù)升級
kubectl rollout undo deployment/nginx-deployment2 # 升級回滾
kubectl scale deployment nginx-deployment --replicas # 彈性伸縮Pod數量
多重升級
- 關于多重升級,舉例,當創(chuàng)建了一個nginx1.7的Deployment,要求副本數量為5之后,Deployment Controller會逐步的將5個1.7的Pod啟動起來,當啟動到3個的時候,又發(fā)出更新Deployment中Nginx到1.9的命令;這時Deployment Controller會立即將已啟動的3個1.7Pod殺掉,然后逐步啟動1.9的Pod.Deployment Controller不會等到1.7的Pod都啟動完成之后,再次殺掉1.9,啟動1.9
Volume
- 在Docker的設計實現中,容器中的數據是臨時的,即當容器被銷毀時,其中的數據會丟失.如果需要持久化數據,需要使用Docker數據卷掛載宿主機上的文件或者目錄到容器中.在Kubernetes中,當Pod重建的時候,數據是會丟失的,Kubernetes也是通過數據卷掛載來提供Pod數據的持久化.Kubernetes數據卷是對Docker數據卷的擴展,Kubernetes數據卷是Pod級別的,可以用來實現Pod中容器的文件共享.
- Kubernetes支持的數據卷類型
- EmptyDir
- HostPath
- GCE Persistent Disk
- AWS Elastic Block Store
- NFS
- iSCSI
- Flocker
- GlusterFS
- RBD
- Git repo
- Secret
- Persistent Volume Claim
Persistent Volume和Persistent Volume Claim
- Kubernetes提供了Persistent Volume和Persistent Volume Claim機制,這是存儲消費模式.Persistent Volume是由系統管理員配置創(chuàng)建的一個數據卷(HostPath、GCE Persistent Disk、AWS Elastic Block Store、NFS、iSCSI、GlusterFS、RBD),它代表了一類存儲插件實現,對于普通用戶來說,通過Persistent Volume Claim可請求并獲得合適的Persistent Volume,而無須感知后端的存儲實現.Persistent Volume和Persistent Volume Claim的關系類似于Pod和Node,Pod消費Node資源,Persistent Volume Claim則消費Persistent Volume資源.Persistent Volume和Persistent Volume Claim相互關聯,有著完整的生命周期管理
- 準備:系統管理員創(chuàng)建或規(guī)劃一批Persistent Volume
- 綁定:用戶通過創(chuàng)建Persistent Volume Claim來聲明存儲請求,Kubernetes發(fā)現有存儲請求的時候,就去查找符合條件的Persistent Volume(最小滿足策略).找到合適的就綁定上,找不到就一直處于等待狀態(tài)
- 使用:創(chuàng)建Pod的時候使用Persistent Volume Claim
- 釋放:當用戶刪除綁定在Persistent Volume上的Persistent Volume Claim時,Persistent Volume進入釋放狀態(tài),此時Persistent Volume中還殘留著上一個Persistent Volume Claim的數據,狀態(tài)還不可用
- 回收:Persistent Volume需要回收才能再次使用.回收策略可以是人工的也可以是Kubernetes自動進行清理(僅支持NFS和HostPath)