kubernetes部署Volume數據卷


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實現了遠程存儲


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM