kubernetes系列10—存儲卷詳解

kubernetes系列10—存儲卷詳解

1、認識存儲卷

1.1 背景

  默認情況下容器中的磁盤文件是非持久化的,容器中的磁盤的生命周期是短暫的,這就帶來了一系列的問題:第一,當一個容器損壞之后,kubelet 會重啟這個容器,但是文件會丟失-這個容器會是一個全新的狀態;第二,當很多容器在同一Pod中運行的時候,很多時候需要數據文件的共享。Kubernete Volume解決了這個問題。

?

1.2 介紹

  Docker有一個Volumes的概念,雖然這個Volume有點寬松和管理性比較小。在Docker中,一個 Volume 是一個簡單的所在主機的一個目錄或者其它容器中的。生命周期是沒有辦法管理,直到最近才有 local-disk-backed 磁盤。Docker現在提供了磁盤驅動,但是功能非常有限(例如Docker1.7只能掛在一個磁盤每個容器,并且無法傳遞參數)

  從另外一個方面講,Kubernetes volume,擁有明確的生命周期,與所在的Pod的生命周期相同。因此,Kubernetes volume獨立與任何容器,與Pod相關,所以數據在重啟的過程中還會保留,當然,如果這個Pod被刪除了,那么這些數據也會被刪除。更重要的是,Kubernetes volume 支持多種類型,任何容器都可以使用多個Kubernetes volume

  它的核心,一個 volume 就是一個目錄,可能包含一些數據,這些數據對pod中的所有容器都是可用的,這個目錄怎么使用,什么類型,由什么組成都是由特殊的volume 類型決定的。

  要使用Volume,pod需要指定Volume的類型和內容(spec.volumes字段),和映射到容器的位置(spec.containers.volumeMounts字段)。

  容器中的進程可以看成由Docker鏡像和卷組成的文件系統視圖。Docker鏡像位于文件系統層次結構的根目錄下,任何卷都安裝在圖像中的指定路徑上。卷無法裝入其他卷或具有到其他卷的硬鏈接。Pod中的每個容器必須獨立指定每個卷的安裝位置。

?

1.3 存儲卷常用類型

  • ?非持久性存儲
    • ?emptyDir
    • ?hostPath
  • ?網絡連接性存儲
    • ?SAN:iSCSI
    • ?NFS:nfs,cfs
  • ?分布式存儲
    • ?glusterfs、rbd、cephfs
  • ?云端存儲
    • ?EBS、Azure Disk、阿里云、gitRepo
?
1
$ kubectl explain pod.spec.volumes 查詢k8s支持的所有類型存儲卷

?

2、emptyDir存儲卷

2.1 emptyDir介紹

  使用emptyDir,當Pod分配到Node上時,將會創建emptyDir,并且只要Node上的Pod一直運行,Volume就會一直存。當Pod(不管任何原因)從Node上被刪除時,emptyDir也同時會刪除,存儲的數據也將永久刪除。

  常用于作為臨時目錄、或緩存使用。

?

2.2 演示:創建emptyDir存儲卷

(1)編寫yaml文件,并創建

先創建一個名為html的存儲卷;再由2個pod都掛載此存儲卷;

pod1基于此存儲卷作為nginx的主目錄;pod2向此存儲卷目錄寫入東西;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[root@master volumes]# vim vol-emptyDir-demo.yaml
apiVersion: v1
kind: Pod
metadata:
??name: pod-vol-demo
??namespace: default
??labels:
????app: myapp
????tier: frontend
??annotations:
????along.com/created-by: "cluster admin"
spec:
??volumes:
??- name: html
????emptyDir: {}
??containers:
??- name: myapp
????image: ikubernetes/myapp:v1
????imagePullPolicy: IfNotPresent
????ports:
????- name: http
??????containerPort: 80
????volumeMounts:
????- name: html
??????mountPath: /usr/share/nginx/html/
??- name: busybox
????image: busybox:latest
????imagePullPolicy: IfNotPresent
????volumeMounts:
????- name: html
??????mountPath: /data/
????command:
????- "/bin/sh"
????- "-c"
????- "while true; do echo $(date) >> /data/index.html; sleep 2; done"
[root@master volumes]# kubectl apply -f vol-emptyDir-demo.yaml
pod/pod-vol-demo created

  

(2)驗證

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
---pod創建成功
[root@master ~]# kubectl get pods -o wide
NAME?????????? READY???? STATUS??? RESTARTS?? AGE?????? IP???????????? NODE
pod-vol-demo?? 2/2?????? Running?? 0????????? 13s?????? 10.244.1.106?? node1
---訪問業務,輸出是pod2的輸入
[root@master ~]# curl 10.244.1.106
Tue Jan 29 07:19:13 UTC 2019
Tue Jan 29 07:19:15 UTC 2019
Tue Jan 29 07:19:17 UTC 2019
Tue Jan 29 07:19:19 UTC 2019
Tue Jan 29 07:19:21 UTC 2019
Tue Jan 29 07:19:23 UTC 2019
Tue Jan 29 07:19:25 UTC 2019
Tue Jan 29 07:19:27 UTC 2019
Tue Jan 29 07:19:29 UTC 2019

  

3、hostPath存儲卷

3.1 emptyDir介紹

  hostPath允許掛載Node(宿主機)上的文件系統到Pod里面去。如果Pod需要使用Node上的文件,可以使用hostPath。

?

3.2 hostPath類型

行為
空字符串(默認)用于向后兼容,這意味著在安裝hostPath卷之前不會執行任何檢查。
DirectoryOrCreate如果給定路徑中不存在任何內容,則將根據需要創建一個空目錄,權限設置為0755,與Kubelet具有相同的組和所有權。
Directory目錄必須存在于給定路徑中
FileOrCreate如果給定路徑中不存在任何內容,則會根據需要創建一個空文件,權限設置為0644,與Kubelet具有相同的組和所有權。
File文件必須存在于給定路徑中
SocketUNIX套接字必須存在于給定路徑中
CharDevice字符設備必須存在于給定路徑中
BlockDevice塊設備必須存在于給定路徑中

?

3.2 演示:創建hostPath存儲卷

(1)編寫yaml文件,并創建

創建存儲卷,使用DirectoryOrCreate類型,node節點不存在會自動創建

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@master volumes]# vim vol-hostpath-demo.yaml
apiVersion: v1
kind: Pod
metadata:
??name: vol-hostpath
??namespace: default
spec:
??volumes:
??- name: html
????hostPath:
??????path: /data/pod/volume1/
??????type: DirectoryOrCreate
??containers:
??- name: myapp
????image: ikubernetes/myapp:v1
????volumeMounts:
????- name: html
??????mountPath: /usr/share/nginx/html/
[root@master volumes]# kubectl apply -f vol-hostpath-demo.yaml
pod/vol-hostpath created

  

(2)查詢驗證

?
1
2
3
4
5
6
[root@master volumes]# kubectl get pods -o wide
NAME?????????? READY???? STATUS??? RESTARTS?? AGE?????? IP???????????? NODE
vol-hostpath?? 1/1?????? Running?? 0????????? 3s??????? 10.244.1.111?? node1
---在node1上查詢是否生產目錄
[root@node1 ~]# ll -d /data/pod/volume1/index.html
-rw-r--r-- 1 root root 17 Sep 21 14:44 /data/pod/volume1/index.html

  

(3)驗證存儲卷功能

?
1
2
3
4
5
---在node1上生成文件
[root@node1 ~]# echo "node01.along.com" > /data/pod/volume1/index.html
---訪問pod內服務,顯示成功
[root@master volumes]# curl 10.244.1.111
node01.along.com

  

(4)就算pod被刪除再重建,只要node還在,存儲卷就還在

?
1
2
3
4
5
6
7
8
9
[root@master volumes]# kubectl delete -f vol-hostpath-demo.yaml
pod "vol-hostpath" deleted
[root@master volumes]# kubectl apply -f vol-hostpath-demo.yaml
pod/vol-hostpath created
[root@master volumes]# kubectl get pods -o wide
NAME?????????? READY???? STATUS??? RESTARTS?? AGE?????? IP???????????? NODE
vol-hostpath?? 1/1?????? Running?? 0????????? 3s??????? 10.244.1.112?? node1
[root@master volumes]# curl 10.244.1.112
node01.along.com

  

4、共享存儲NFS存儲卷

4.1 NFS存儲卷介紹

  NFS 是Network File System的縮寫,即網絡文件系統。Kubernetes中通過簡單地配置就可以掛載NFS到Pod中,而NFS中的數據是可以永久保存的,同時NFS支持同時寫操作。Pod被刪除時,Volume被卸載,內容被保留。這就意味著NFS能夠允許我們提前對數據進行處理,而且這些數據可以在Pod之間相互傳遞。

?

4.2 演示:創建NFS存儲卷

4.2.1 在一臺服務器搭建NFS

(1)事前準備

① 修改k8s集群服務的hosts文件,使之能解析nfs服務器

?
1
2
3
4
5
[root@master volumes]# vim /etc/hosts
192.168.130.103 master
192.168.130.104 node1
192.168.130.105 node2
192.168.130.106 nfs

② 在k8s集群服務器,安裝nfs-utils 工具

?
1
$ yum -y install nfs-utils

  

(2)在106服務器上提供nfs服務

?
1
2
3
4
5
6
7
[root@nfs ~]# yum -y install nfs-utils
[root@nfs ~]# mkdir /data/volumes -p
[root@nfs ~]# vim /data/volumes/index.html
<h1>NFS stor</h1>
[root@nfs ~]# vim /etc/exports
/data/volumes?? 192.168.130.0/24(rw,no_root_squash)
[root@nfs ~]# systemctl start nfs

  

4.2.1 創建NFS存儲卷

(1)編寫yaml文件,并創建

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@master volumes]# vim vol-nfs-demo.yaml
apiVersion: v1
kind: Pod
metadata:
??name: vol-nfs
??namespace: default
spec:
??volumes:
??- name: html
????nfs:
??????path: /data/volumes
??????server: nfs
??containers:
??- name: myapp
????image: ikubernetes/myapp:v1
????volumeMounts:
????- name: html
??????mountPath: /usr/share/nginx/html/
[root@master volumes]# kubectl apply -f vol-nfs-demo.yaml
pod/vol-nfs created

  

(2)驗證,訪問服務成功

?
1
2
3
4
5
[root@master ~]# kubectl get pods -o wide
NAME????? READY???? STATUS??? RESTARTS?? AGE?????? IP???????????? NODE
vol-nfs?? 1/1?????? Running?? 0????????? 9s??????? 10.244.1.115?? node1
[root@master ~]# curl 10.244.1.115
<h1>NFS stor</h1>

刪除pod,再創建,也還存在數據。

?

5、一些不常用的存儲卷

5.1 gitRepo

(1)介紹

gitRepo volume將git代碼下拉到指定的容器路徑中

?

(2)示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: v1
kind: Pod
metadata:
??name: server
spec:
??volumes:
??- name: git-volume
????gitRepo:
??????repository: "git@github.com:alonghub/my-git-repository.git"
?????revision: "22f1d8406d464b0c0874075539c1f2e96c253775"
??containers:
??- name: myapp
????image: ikubernetes/myapp:v1
????imagePullPolicy: IfNotPresent
????ports:
????- name: http
??????containerPort: 80
????volumeMounts:
????- name: git-volume
??????mountPath: /usr/share/nginx/html/

  

5.2 glusterfs

  glusterfs,允許將Glusterfs(一個開源網絡文件系統)Volume安裝到pod中。不同于emptyDir,Pod被刪除時,Volume只是被卸載,內容被保留。味著glusterfs能夠允許我們提前對數據進行處理,而且這些數據可以在Pod之間“切換”。

  注意::必須先運行自己的GlusterFS安裝,然后才能使用它。

  有關更多詳細信息,請參閱GlusterFS示例。

?

5.3 RBD

  RBD允許Rados Block Device格式的磁盤掛載到Pod中,同樣的,當pod被刪除的時候,rbd也僅僅是被卸載,內容保留,rbd能夠允許我們提前對數據進行處理,而且這些數據可以在Pod之間“切換”。

  有關更多詳細信息,請參閱RBD示例。

?

5.4 cephfs

  cephfs Volume可以將已經存在的CephFS Volume掛載到pod中,與emptyDir特點不同,pod被刪除的時,cephfs僅被被卸載,內容保留。cephfs能夠允許我們提前對數據進行處理,而且這些數據可以在Pod之間“切換”。

  提示:可以使用自己的Ceph服務器運行導出,然后在使用cephfs。

  有關更多詳細信息,請參閱CephFS示例

轉載于:https://www.cnblogs.com/dengbingbing/p/10399203.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449429.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449429.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449429.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

真格量化-隱含波動率計算

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np from copy import *#開始時間,用于初始化一些參數 def OnStart(context) :context.myacc = None#登錄交易賬號if context.accounts["回測期權"].Login…

Vue 后臺管理

這里是結合vue和element快速成型的一個demo 里面展示了基本的后臺管理界面的大體結構和element的基本操作 GitHub的地址&#xff1a;https://github.com/wwwming/adminDemo 轉載于:https://www.cnblogs.com/wangming1002/p/10613014.html

生活竅門 這樣用錢就會富足

當我終于從惡劣處境中解脫之后&#xff0c;我想買棟房子&#xff0c;然而父親卻絲毫不為我感到興奮。他說&#xff1a;“在盡一項新的支付義務前&#xff0c;你應該多投資。”那個時候&#xff0c;許多人相信自己的房子是一種投資。我的父親問我&#xff1a;“如果你買了一棟房…

如何在Kubernetes集群動態使用 NAS 持久卷

1. 介紹&#xff1a; 本文介紹的動態生成NAS存儲卷的方案&#xff1a;在一個已有文件系統上&#xff0c;自動生成一個目錄&#xff0c;這個目錄定義為目標存儲卷&#xff1b; 鏡像地址&#xff1a;registry.cn-hangzhou.aliyuncs.com/acs/alicloud-nas-controller:v1.11.5.4-43…

Linux查看MySQL版本的四種方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1 在終端下執行 mysql -V 2 在help中查找 mysql --help |grep Distrib 3 在mysql 里查看 select version() 4 在mysql 里查看 status…

行業指數動量策略+akshare

以周為單位&#xff0c;獲取本周最強的5只行業指數&#xff0c;進行均值購買。 數據源采用akshare。 導入包 import akshare as ak import pandas as pd import numpy as np import matplotlib 日線換為周線 #日線換為周線數據 def transferToWeekLine(df):data1dfstock_da…

2019-03-28 SQL Server Pivot

--現在我們是用PIVOT函數將列[WEEK]的行值轉換為列&#xff0c;并使用聚合函數Count(TotalPrice)來統計每一個Week列在轉換前有多少行數據&#xff0c;語句如下所示 select * from ShoppingCart as C PIVOT(count(TotalPrice) FOR [Week] IN([1],[2],[3],[4],[5],[6],[7])) AS…

C/C++開發者必不可少的15款編譯器+IDE

摘要&#xff1a;C/C這兩門語言依然活躍在編程領域里&#xff0c;其不僅擁有強大的功能集&#xff0c;而且還提供了強大的安全保障。為此&#xff0c;筆者專為C/C編碼者收集了15款令人印象深刻的IDE和編譯器。 Web開發者可選擇的編程語言有很多比如&#xff0c;Java、.Net、PH…

白山云科技 CTO 童劍:空降后,如何有技術又有藝術地破局?

TGO 鯤鵬會北京分會舉行了一場線下分享活動——《 CTO 空降如何平穩落地 》&#xff0c;白山云科技&#xff08;下稱“白山”&#xff09;CTO 童劍分享了他的故事和經驗。在工作中&#xff0c;“空降”這個問題不僅僅是 CTO 會遇到&#xff0c;每一個帶團隊的領導都會遇到。如何…

linux 的 df命令:顯示磁盤分區上的可用空間

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 df命令用于顯示磁盤分區上的可使用的磁盤空間。默認顯示單位為KB。可以利用該命令來獲取硬盤被占用了多少空間&#xff0c;目前還剩下多…

akshare改寫公募基金輪動策略

群友說&#xff0c;行業指數不行&#xff0c;沒辦法跟買。這次我換成了etf進行動量策略&#xff0c;選擇本周上漲最強的5個etf&#xff0c;平均持倉&#xff0c;一周后移倉。查看回測效果。 不廢話&#xff0c;上傳代碼&#xff0c;但還是有點毛糙。下次加上日期這些數據&#…

BZOJ 離線網站

https://acm.taifua.com/bzoj/index.html https://lydsy.download/archive/ http://lbn187.is-programmer.com/posts/103404.html轉載于:https://www.cnblogs.com/Agnel-Cynthia/p/10614287.html

Python--day48--ORM框架SQLAlchemy操作表

ORM框架SQLAlchemy操作表&#xff1a; 表結構和數據庫連接&#xff1a; 1 #!/usr/bin/env python2 # -*- coding:utf-8 -*-3 from sqlalchemy.ext.declarative import declarative_base4 from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index…

如何理解指向指針的指針?

本文由 伯樂在線 - 菜鳥浮出水 翻譯自 StackOverflow。歡迎加入 技術翻譯小組。轉載請參見文章末尾處的要求。問題&#xff1a;如何理解指向指針的指針&#xff1f; 我在一篇教程中看到下面這段&#xff0c;它描述指向指針的指針是如何運作的。 引用文章相關段落如下&#x…

Linux定時任務Crontab命令詳解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 linux 系統則是由 cron (crond) 這個系統服務來控制的。Linux 系統上面原本就有非常多的計劃性工作&#xff0c;因此這個系統服務是默認…

akshare寫etf動量滾動策略

導入包&#xff1a; import akshare as ak import pandas as pd import numpy as np import matplotlib 日線換周線&#xff1a; #日線換為周線數據 def transferToWeekLine(df,periodW):data1dfstock_data pd.DataFrame(data1)#設定轉換周期period_type 轉換為周是W,月M,…

中小企業網絡安全提升

為什么80%的碼農都做不了架構師&#xff1f;>>> 據外媒報道&#xff0c;絕大多數網絡罪犯的目標是中小企業&#xff0c;然而研究表明&#xff0c;大多數企業主并不認為自己有成為網絡犯罪分子目標的可能。為了保護自己不受網絡攻擊&#xff0c;企業應該關注以下五個…

用Linux命令行生成隨機密碼的十種方法

本文由 極客范 - 小道空空 翻譯自 Lowell Heddings。歡迎加入極客翻譯小組&#xff0c;同我們一道翻譯與分享。轉載請參見文章末尾處的要求。Linux操作系統的一大優點是對于同樣一件事情&#xff0c;你可以使用高達數百種方法來實現它。例如&#xff0c;你可以通過數十種方法…

50ETF期權波動率策略

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np #日線級別 #開始時間,用于初始化一些參數 def OnStart(context) :print("I\m starting...")#設定一個全局變量品種,本策略交易50ETF期權g.code = &quo…

Docker容器硬盤熱擴容-centos6

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 前面已介紹了docker很多知識點的操作記錄&#xff0c;今天這里梳理下docker容器空間擴展的操作。默認情況下&#xff0c;docker容器的空…