# Kubernetes持久化存儲
## 前言
之前我們有提到數據卷:`emptydir` ,是本地存儲,pod重啟,數據就不存在了,需要對數據持久化存儲
對于數據持久化存儲【pod重啟,數據還存在】,有兩種方式
- nfs:網絡存儲【通過一臺服務器來存儲】
## 步驟
### 持久化服務器上操作
- 找一臺新的服務器nfs服務端,安裝nfs
- 設置掛載路徑
使用命令安裝nfs
```bash
yum install -y nfs-utils
```
首先創建存放數據的目錄
```bash
mkdir -p /data/nfs
```
設置掛載路徑
```bash
# 打開文件
vim /etc/exports
# 添加如下內容
/data/nfs *(rw,no_root_squash)
```
執行完成后,即部署完我們的持久化服務器
### Node節點上操作
然后需要在k8s集群node節點上安裝nfs,這里需要在 node1 和 node2節點上安裝
```bash
yum install -y nfs-utils
```
執行完成后,會自動幫我們掛載上
### 啟動nfs服務端
下面我們回到nfs服務端,啟動我們的nfs服務
```bash
# 啟動服務
systemctl start nfs
# 或者使用以下命令進行啟動
service nfs-server start
```

### K8s集群部署應用
最后我們在k8s集群上部署應用,使用nfs持久化存儲
```bash
# 創建一個pv文件
mkdir pv
# 進入
cd pv
```
然后創建一個yaml文件 `nfs-nginx.yaml`

通過這個方式,就掛載到了剛剛我們的nfs數據節點下的 /data/nfs 目錄
最后就變成了: /usr/share/nginx/html -> 192.168.44.134/data/nfs 內容是對應的
我們通過這個 yaml文件,創建一個pod
```bash
kubectl apply -f nfs-nginx.yaml
```
創建完成后,我們也可以查看日志
```bash
kubectl describe pod nginx-dep1
```

可以看到,我們的pod已經成功創建出來了,同時下圖也是出于Running狀態

下面我們就可以進行測試了,比如現在nfs服務節點上添加數據,然后在看數據是否存在 pod中
```bash
# 進入pod中查看
kubectl exec -it nginx-dep1 bash
```

## PV和PVC
對于上述的方式,我們都知道,我們的ip 和端口是直接放在我們的容器上的,這樣管理起來可能不方便

所以這里就需要用到 pv 和 pvc的概念了,方便我們配置和管理我們的 ip 地址等元信息
PV:持久化存儲,對存儲的資源進行抽象,對外提供可以調用的地方【生產者】
PVC:用于調用,不需要關心內部實現細節【消費者】
PV 和 PVC 使得 K8S 集群具備了存儲的邏輯抽象能力。使得在配置Pod的邏輯里可以忽略對實際后臺存儲
技術的配置,而把這項配置的工作交給PV的配置者,即集群的管理者。存儲的PV和PVC的這種關系,跟
計算的Node和Pod的關系是非常類似的;PV和Node是資源的提供者,根據集群的基礎設施變化而變
化,由K8s集群管理員配置;而PVC和Pod是資源的使用者,根據業務服務的需求變化而變化,由K8s集
群的使用者即服務的管理員來配置。
### 實現流程
- PVC綁定PV
- 定義PVC
- 定義PV【數據卷定義,指定數據存儲服務器的ip、路徑、容量和匹配模式】
### 舉例
創建一個 pvc.yaml

第一部分是定義一個 deployment,做一個部署
- 副本數:3
- 掛載路徑
- 調用:是通過pvc的模式
然后定義pvc

然后在創建一個 `pv.yaml`

然后就可以創建pod了
```bash
kubectl apply -f pv.yaml
```
然后我們就可以通過下面命令,查看我們的 pv 和 pvc之間的綁定關系
```bash
kubectl get pv, pvc
```

到這里為止,我們就完成了我們 pv 和 pvc的綁定操作,通過之前的方式,進入pod中查看內容
```bash
kubect exec -it nginx-dep1 bash
```
然后查看 /usr/share/nginx.html

也同樣能看到剛剛的內容,其實這種操作和之前我們的nfs是一樣的,只是多了一層pvc綁定pv的操作
- Kubernetes簡介
- 搭建K8S集群前置知識
- 使用kubeadm方式搭建K8S集群
- 使用二進制方式搭建K8S集群
- Kubeadm和二進制方式對比
- Kubernetes集群管理工具kubectl
- Kubernetes集群YAML文件詳解
- Kubernetes核心技術Pod
- Kubernetes核心技術Controller
- Kubernetes核心技術Service
- Kubernetes控制器Controller詳解
- Kubernetes配置管理
- Kubernetes集群安全機制
- Kubernetes核心技術Ingress
- Kubernetes核心技術Helm
- Kubernetes持久化存儲
- Kubernetes集群資源監控
- Kubernetes搭建高可用集群
- Kubernetes容器交付介紹
- 使用kubeadm-ha腳本一鍵安裝K8S
- Kubernetes可視化界面kubesphere
- Kubernetes配置默認存儲類
- 使用Rancher搭建Kubernetes集群
- Kubernetes中的CRI