您好,登錄后才能下訂單哦!
這篇文章主要講解了“k8s數(shù)據(jù)存儲之Volume如何使用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“k8s數(shù)據(jù)存儲之Volume如何使用”吧!
通過之前學(xué)習(xí)了解到,k8s中Pod是最小的運行單元,Pod中運行的是一個個容器,但是容器的生命周期可能很短,被頻繁地創(chuàng)建和銷毀。
在學(xué)習(xí)docker的時候,創(chuàng)建一個容器,如果沒有指定容器的數(shù)據(jù)卷,容器中的文件在磁盤上通常是臨時存放的,這就給容器中運行的重要應(yīng)用程序帶來了一些問題 ,比如像下面的場景:
當(dāng)容器崩潰時文件丟失,kubelet 會重新啟動容器,但容器會以干凈的狀態(tài)重啟,之前保存在容器中的數(shù)據(jù)也會被清除 ;
當(dāng)在一個 Pod 中同時運行多個容器時,常常需要在這些容器之間共享文件 ;
基于這些問題,k8s中就出現(xiàn)了“卷”這個組件來解決
Kubernetes 卷(Volume) 這一抽象概念能夠解決這兩個問題,卷的核心是包含一些數(shù)據(jù)的目錄,Pod 中的容器可以訪問該目錄
關(guān)于k8s中卷的總結(jié):
Volume是k8s抽象出來的對象,它被定義在Pod上,然后被一個Pod里的多個容器掛載到具體的文件目錄下 ;
kubernetes通過Volume實現(xiàn)同一個Pod中不同容器之間的數(shù)據(jù)共享以及數(shù)據(jù)的持久化存儲 ;
Volume的生命周期不與Pod中單個容器的生命周期相關(guān),當(dāng)容器終止或者重啟時,Volume中的數(shù)據(jù)也不會丟失;
K8S可以支持許多類型的卷,Pod 也能同時使用任意數(shù)量的卷;
k8s中提供了很多種類型的Volume,下面列舉一些常用的類型:
常規(guī)存儲:EmptyDir、HostPath ;
高級存儲:PV、PVC ;
配置存儲:ConfigMap、Secret ;
其他:網(wǎng)絡(luò)存儲系統(tǒng) NFS、CIFS,包括云服務(wù)商提供的、本地、分布式 ;
接下來,針對日常業(yè)務(wù)中使用較多的Volume,通過實例一一演示下各自的使用。
當(dāng) Pod 指定到某個節(jié)點上時,首先創(chuàng)建的是一個 emptyDir
卷,只要 Pod 在該節(jié)點上運行卷就一直存在 ;
當(dāng) Pod 因為某些原因被從節(jié)點上刪除時,emptyDir
卷中的數(shù)據(jù)也會永久刪除 ;
容器崩潰并不會導(dǎo)致 Pod 被從節(jié)點上移除,所以容器崩潰時 emptyDir
卷中的數(shù)據(jù)是安全的;
使用場景:臨時緩存空間,存儲一些運行過程中的中繼日志;
如圖所示,我們的需求是,創(chuàng)建一個類型為EmptyDir的Volume,實現(xiàn)兩個容器日志的共享;
1、是?個集成了三百多個最常? Linux 命令和?具的軟件;
2、包含了簡單的?具,例如 ls 、 cat 和 echo 等等,還包含了?些更復(fù)雜的?具,例grep 、 find 、 telnet等;
下面通過案例演示下使用的步驟
在當(dāng)前目錄下創(chuàng)建一個volume-emptydir.yaml 的文件,配置如下內(nèi)容:
apiVersion: v1 kind: Pod metadata: name: test-volume-emptydir namespace: default spec: containers: - name: test-nginx image: nginx:1.20 ports: - containerPort: 80 volumeMounts: # 將nginx-log-volume掛在到nginx容器中,對應(yīng)的目錄為 /var/log/nginx - name: test-log-volume mountPath: /var/log/nginx - name: test-busybox image: busybox:1.35.0 command: ["/bin/sh","-c","tail -f /usr/local/test/access.log"] # 容器啟動后初始命令,讀取指定文件中內(nèi)容 volumeMounts: # 將nginx-log-volume掛在到busybox容器中,對應(yīng)的目錄為 /logs - name: test-log-volume mountPath: /usr/local/test volumes: # 這里聲明volume存儲劵, name為nginx-log-volume,類型是emptyDir - name: test-log-volume emptyDir: {}
配置中的關(guān)鍵位置如下:
使用apply命令執(zhí)行pod的創(chuàng)建,創(chuàng)建成功后,可以看到在test-volume-emptydir 這個pod里面運行了2個容器;
隨機訪問一下,使nginx中產(chǎn)生部分日志
使用下面的命令查看容器產(chǎn)生的access.log日志
kubectl logs -f test-volume-emptydir -n default -c test-busybox
上面我們聊了EmptyDir的使用,相信實際操作之后的同學(xué)應(yīng)該能看出來,由于EmptyDir創(chuàng)建的這個Volume是一個虛擬的路徑,所以當(dāng)其銷毀后,pod中容器產(chǎn)生的數(shù)據(jù)也就隨之銷毀了,即無法真正實現(xiàn)數(shù)據(jù)的落盤持久化,于是我們在想,是否可以做到下面這樣呢?
當(dāng)然是可以的,這就是接下來要說的另一種Volume : hostPath;
emptyDir中數(shù)據(jù)沒做持久化,隨著Pod的結(jié)束而銷毀,需要持久化到磁盤則選其他方式 ;
hostPath類型的磁盤就是掛在了主機的一個文件或者目錄 ;
某些應(yīng)用需要用到docker的內(nèi)部文件,這時只需要掛在本機的/var/lib/docker作為hostPath ;
根據(jù)使用場景的不同,又可以細分成多個類型
Directory 給定的目錄路徑必須存在 ;
DirectoryOrCreate 如果給定路徑不存在,將根據(jù)需要在那里創(chuàng)建一個空目錄 ;
File 給定路徑上必須存在對應(yīng)文件 ;
FileOrCreate 如果給定路徑不存在,將根據(jù)需要在那里創(chuàng)建一個空文件 ;
在當(dāng)前目錄下創(chuàng)建一個名叫volume-hostpath.yaml的配置文件,內(nèi)容如下:
apiVersion: v1 kind: Pod metadata: name: hostpath-volume-test namespace: default spec: containers: - name: test-nginx image: nginx:1.20 ports: - containerPort: 80 volumeMounts: # 將nginx-log-volume掛在到nginx容器中,對應(yīng)的目錄為 /var/log/nginx - name: test-log-volume mountPath: /var/log/nginx - name: test-busybox image: busybox:1.35.0 command: ["/bin/sh","-c","tail -f /usr/local/test/access.log"] # 容器啟動后初始命令,讀取指定文件中內(nèi)容 volumeMounts: # 將nginx-log-volume掛在到busybox容器中,對應(yīng)的目錄為 /logs - name: test-log-volume mountPath: /usr/local/test volumes: # 這里聲明volume存儲劵, name為test-log-volume,類型是hostPath - name: test-log-volume hostPath: path: /usr/local/test type: DirectoryOrCreate #如果給定路徑不存在,將根據(jù)需要在那里創(chuàng)建一個空目錄
主要的配置和上面的emptyDir的案例中的差不多,最后的volumes類型那里改成hostPath相關(guān)的參數(shù);
創(chuàng)建成功后,可以看到產(chǎn)生了一個hostpath開頭的一個Pod,里面包含兩個容器;
這這里注意使用你自己定義的那個名稱
kubectl logs -f hostpath-volume-test -n default -c test-busybox
工作節(jié)點查看對應(yīng)的掛載目錄的日志文件,登錄工作節(jié)點的服務(wù)器,可以看到對應(yīng)的nginx日志文件也在里面了;
刪除pod之后發(fā)現(xiàn)工作節(jié)點目錄下的日志文件依然存在
通過上面的演示,最后來對比一下emptyDir和hostPath使用上的異同點:
兩者都是本地存儲卷方式 ;
emptyDir是臨時存儲空間,完全不提供持久化支持;
hostPath的卷數(shù)據(jù)是持久化在node節(jié)點的文件系統(tǒng)中的,即便pod已經(jīng)被刪除了,volume卷中的數(shù)據(jù)還留存在node節(jié)點上;
很多應(yīng)用在其初始化或運行期間要依賴一些配置信息 ,并且在大多數(shù)時候, 存在要調(diào)整配置參數(shù)所設(shè)置的數(shù)值的需求,而ConfigMap是Kubernetes 用來向應(yīng)用 Pod 中注入配置數(shù)據(jù)的一種方法 ;
是K8S的一種API對象,用來把【非加密數(shù)據(jù)】保存到鍵值對中,比如etcd ;
可以用作環(huán)境變量、命令行參數(shù)等,將環(huán)境變量、配置信息和容器鏡像解耦,便于應(yīng)用配置的修改 ;
使用方式
kubectl create configmap 命令,基于目錄、 文件或者鍵值對來創(chuàng)建 ConfigMap
如下示例:
kubectl create configmap NAME --from-literal=key1=value1 --from-literal=key2=value2
使用下面的命令進行ConfigMap的創(chuàng)建
kubectl create configmap test-config --from-literal=account=test --from-literal=password=123456
kubectl get configmap test-config -o yaml
在當(dāng)前目錄下創(chuàng)建一個 test-configmap.yaml的文件,核心配置內(nèi)容如下:
apiVersion: v1 kind: ConfigMap metadata: name: congge-configmap namespace: default data: info: username:congge password:123456
使用apply命令執(zhí)行創(chuàng)建
kubectl describe cm congge-configmap -n default
上面演示了兩種創(chuàng)建configmap的方式,configmap創(chuàng)建出來后怎么使用呢?簡單來說,只需要開啟一個pod,將這個configmap掛載進去使用即可;
注意,里面的Volume使用上文yaml中創(chuàng)建的那個configmap的名字:
apiVersion: v1 kind: Pod metadata: name: pod-configmap namespace: default spec: containers: - name: nginx image: nginx:1.20 volumeMounts: # configmap掛載的目錄 - name: config mountPath: /config volumes: # 聲明configmap - name: config configMap: name: congge-configmap
執(zhí)行apply命令進行創(chuàng)建,然后檢查下是否創(chuàng)建成功;
進入pod容器
kubectl exec -it pod-configmap -n default -- /bin/sh
進入配置文件中的掛載目錄 /config,查看配置信息
有些配置需要加密存儲,ConfigMap只能使用明文保存,因此ConfigMap就不適合了;
Secret 作用
用來保存敏感信息,例如密碼、秘鑰、證書、OAuth 令牌和 ssh key等 ;
就不需要把這些敏感數(shù)據(jù)暴露到鏡像或者Pod中 ;
不管是哪種Volume,最終都是為Pod服務(wù)的,對于Pod來說,可以用三種方式之一來使用 Secret:
作為掛載到一個或多個容器上的卷 中的文件 ;作為容器的環(huán)境變量 ;由 kubelet 在為 Pod 拉取鏡像時使用 ;
下面列舉secret中常用的幾種類型
用來存儲私有 docker registry的認證信息
1、只要與Kubernetes API有交互的Pod,都會自動擁有此種類型的Secret;
2、K8S自動創(chuàng)建,并且會自動掛載到Pod的 /run/secrets/kubernetes.io/serviceaccount 目錄中;
7.2.3 Opaque
加密類型為base64,其特點就是將明文改為了密文
下面以Secret中Opaque這種類型進行說明,首先用一個字符串做下測試,簡單來說,就是將字符串進行base64編碼,得到一串類似于密文的字符串;
在當(dāng)前目錄下創(chuàng)建一個secret.yaml的配置文件,內(nèi)容如下,其中,username和password用的就是上面測試中看到的:
apiVersion: v1 kind: Secret metadata: name: my-secret type: Opaque data: username: YWRtaW4= password: MTIzNDU2
創(chuàng)建成功后,可以順便使用get查看下創(chuàng)建的secret;
使用下面的命令進行查看
kubectl get secret my-secret -o yaml
創(chuàng)建一個新的pod并使用上面這個secret,在當(dāng)前目錄下,創(chuàng)建一個名叫pod-secret-volume.yaml的配置文件,內(nèi)容如下:
apiVersion: v1 kind: Pod metadata: name: pod-secret spec: containers: - name: nginx image: nginx:1.20 volumeMounts: # secret掛載 - name: congge-config mountPath: /etc/secret volumes: - name: congge-config secret: secretName: my-secret
使用apply命令執(zhí)行并創(chuàng)建pod
在pod中的secret信息實際已經(jīng)被解密,使用下面的命令進入到pod
kubectl exec -it pod-secret -- /bin/sh
查看指定目錄下secret中配置的username和password,可以看到,在pod中,加密的信息已被解密了;
感謝各位的閱讀,以上就是“k8s數(shù)據(jù)存儲之Volume如何使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對k8s數(shù)據(jù)存儲之Volume如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。