kubernetes部署Volume數據卷
分兩類,一類是本地數據卷,一類是網絡數據卷,容器都是暫時的,他不會持久的在某個節點上,他的數據是默認保存在當前容器里的,容器沒了啥都沒了,所以就要使用Volume
了,pod
需要設置來源(spec.volume)和掛載點(spec.containers.volumeMounts)兩個信息后就可以使用相應的Volume
,先看看本地數據卷。
本地數據卷
主要用的兩種,一個是emptyDir
,另一個是hostPath
,分別了解一下。
emptyDir
這個數據卷會在你的宿主機創建一個空目錄,然后掛載到Pod
容器,Pod
刪除這個卷也會被刪除,這個應用場景就是Pod
之間數據共享,說白了就是你想在容器中做數據共享就要用這個卷了,下面一個例子。
[root@k8s01 yml]# cat emptyDir.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-emptydir
spec:
containers:
- image: centos:latest
name: write
command: ["bash","-c","for i in {1..100};do echo $i >> /data/opesn;sleep 1;done"]
volumeMounts:
- mountPath: /data
name: data
- name: read
image: centos:latest
command: ["bash","-c","tail -f /data/opesn"]
volumeMounts:
- mountPath: /data
name: data
volumes:
- name: data
emptyDir: {}
[root@k8s01 yml]#
這個pod
一共是啟動了兩個容器,第一個容器執行了一條命令,應該都能看懂,向/data/opesn
文件寫數據,一秒一次,第二個容器讀取這個文件,注意這是讀取的本地文件,不使用emptyDir
的情況下各個容器之間的文件系統是隔離的。
后三行為數據卷來源,emptyDir
用的格式就是{}
,定義一個空目錄,這個空目錄掛載容器的位置是由volumesMounts
下的mountPath
來定義的,我掛載到了/data
,具體掛載哪個數據卷是通過名字來分辨的,數據卷名我用的是data
,這里可以定義多個數據卷類型,通過名字去定義掛載哪一個,下面啟動查看吧。
[root@k8s01 yml]# kubectl create -f emptyDir.yaml
pod/my-emptydir created
[root@k8s01 yml]# kubectl get pods my-emptydir
NAME READY STATUS RESTARTS AGE
my-emptydir 2/2 Running 0 41s
[root@k8s01 yml]#
[root@k8s01 yml]# kubectl logs my-emptydir --tail=10 -c read
87
88
89
90
91
92
93
94
95
96
[root@k8s01 yml]# kubectl exec -it my-emptydir -c write bash
[root@my-emptydir /]# tail -f /data/opesn
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@my-emptydir /]#
一個在實時寫,一個在實時讀,大概就是這樣
hostPath
這個就是掛載node
節點宿主機目錄到容器中,這個用的比較多
[root@k8s01 yml]# cat hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-hostpath
spec:
containers:
- image: centos:latest
name: write
command: ["bash","-c","for i in {1..100};do echo $i >> /data/opesn;sleep 1;done"]
volumeMounts:
- mountPath: /data
name: data
volumes:
- name: data
hostPath:
path: /tmp
type: Directory
意思是將宿主機的/tmp
目錄掛載到容器的/data
目錄,類型為目錄,操作還是向/data/opesn
寫數據,啟動之后看運行節點的/tmp/opesn
文件就行了,開始創建。
[root@k8s01 yml]# kubectl create -f hostpath.yaml
pod/my-hostpath created
[root@k8s01 yml]# kubectl get pods my-hostpath
NAME READY STATUS RESTARTS AGE
my-hostpath 1/1 Running 0 61s
[root@k8s01 yml]#
[root@k8s01 yml]# ansible 192.168.10.92 -m shell -a "tail /tmp/opesn"
192.168.10.92 | CHANGED | rc=0 >>
22
23
24
25
26
27
28
29
30
31
就是這種結果,容器沒了文件還在,但要注意宿主機要掛在的目錄一定要存在,否則Pod
根本無法啟動
NFS網絡卷
既然是用NFS
,現在還沒有,所以需要安裝一下,nfs01
作為服務端
主機名 | IP地址 | 服務 |
---|---|---|
nfs01 | 192.168.10.41 | nfs |
[root@nfs01 ~]# yum -y install nfs-utils
所有的node
節點要安裝如上軟件包以支持掛載NFS
,但不用啟動。
[root@k8s01 yml]# ansible nodes -m yum -a "name=nfs-utils state=installed"
下面要配置一下服務端的nfs
配置完之后啟動守護進程即可
[root@nfs01 ~]# cat /etc/exports
/data *(rw,no_root_squash)
[root@nfs01 ~]# systemctl start rpcbind.service
[root@nfs01 ~]# systemctl start nfs
[root@nfs01 ~]# showmount -e localhost
Export list for localhost:
/data *
[root@nfs01 ~]#
現在可以通過編譯YAML
文件將NFS
目錄掛載到容器了,不需要你手動掛載,交給K8S
去做就行了
[root@k8s01 yml]# cat nfs.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: web
spec:
selector:
matchLabels:
app: web
replicas: 3
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: wwwroot
mountPath: /usr/share/nginx/html
volumes:
- name: wwwroot
nfs:
server: 192.168.10.41
path: /data
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
spec:
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
nodePort: 30010
selector:
app: web
[root@k8s01 yml]#
NFS
數據卷使用方法是和本地數據卷一樣的,設置了數據源和容器位置,我是掛到了nginx
默認根目錄,設置一下NFS
服務地址和路徑,當然得先把之前的刪掉,然后在創建。
[root@k8s01 yml]# kubectl create -f nfs.yaml
deployment.apps/nginx-deployment created
service/nginx-service created
[root@k8s01 yml]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-6446785f49-9hwbx 1/1 Running 0 3m9s
nginx-deployment-6446785f49-nndx8 1/1 Running 0 3m9s
nginx-deployment-6446785f49-pkq8v 1/1 Running 0 3m9s
[root@k8s01 yml]#
正常啟動了,下面測試一下,這個Service
綁定過域名,訪問一下試試。
[root@k8s01 yml]# curl https://www.opesn.com
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.17.10</center>
</body>
</html>
[root@k8s01 yml]#
現在是沒權限,暫定為找不到index.html
,現在向nfs
目錄創建一個,寫點數據進去,沒意外的話就能訪問到了
[root@nfs01 ~]# echo 'hello world' >>/data/index.html
[root@k8s01 yml]# curl https://www.opesn.com
hello world
[root@k8s01 yml]#
沒問題,說明NFS
掛載正常,這就是pod
實現了遠程存儲