溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

k8s數(shù)據(jù)存儲之Volume如何使用

發(fā)布時間:2023-03-11 10:21:01 來源:億速云 閱讀:214 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“k8s數(shù)據(jù)存儲之Volume如何使用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“k8s數(shù)據(jù)存儲之Volume如何使用”吧!

一、什么是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 中的容器可以訪問該目錄

二、k8s中的Volume

關(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類型

k8s中提供了很多種類型的Volume,下面列舉一些常用的類型:

  • 常規(guī)存儲:EmptyDir、HostPath ;

  • 高級存儲:PV、PVC ;

  • 配置存儲:ConfigMap、Secret ;

  • 其他:網(wǎng)絡(luò)存儲系統(tǒng) NFS、CIFS,包括云服務(wù)商提供的、本地、分布式 ;

接下來,針對日常業(yè)務(wù)中使用較多的Volume,通過實例一一演示下各自的使用。

四、Volume 之 EmptyDir 

4.1 EmptyDir 特點

  • 當(dāng) Pod 指定到某個節(jié)點上時,首先創(chuàng)建的是一個 emptyDir 卷,只要 Pod 在該節(jié)點上運行卷就一直存在 ;

  • 當(dāng) Pod 因為某些原因被從節(jié)點上刪除時,emptyDir 卷中的數(shù)據(jù)也會永久刪除 ;

  • 容器崩潰并不會導(dǎo)致 Pod 被從節(jié)點上移除,所以容器崩潰時 emptyDir 卷中的數(shù)據(jù)是安全的;

使用場景:臨時緩存空間,存儲一些運行過程中的中繼日志;

4.2 EmptyDir 實現(xiàn)文件共享

如圖所示,我們的需求是,創(chuàng)建一個類型為EmptyDir的Volume,實現(xiàn)兩個容器日志的共享;

k8s數(shù)據(jù)存儲之Volume如何使用

4.2.1 關(guān)于busybox
1、是?個集成了三百多個最常? Linux 命令和?具的軟件;
2、包含了簡單的?具,例如 ls 、 cat 和 echo 等等,還包含了?些更復(fù)雜的?具,例grep 、 find 、 telnet等;

4.3 操作步驟

下面通過案例演示下使用的步驟

4.3.1 創(chuàng)建配置模板文件yaml

在當(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)鍵位置如下:

k8s數(shù)據(jù)存儲之Volume如何使用

4.3.2 創(chuàng)建Pod

使用apply命令執(zhí)行pod的創(chuàng)建,創(chuàng)建成功后,可以看到在test-volume-emptydir 這個pod里面運行了2個容器;

k8s數(shù)據(jù)存儲之Volume如何使用

4.3.3 訪問nginx使其產(chǎn)生訪問日志

隨機訪問一下,使nginx中產(chǎn)生部分日志

k8s數(shù)據(jù)存儲之Volume如何使用

4.3.4 查看容器日志

使用下面的命令查看容器產(chǎn)生的access.log日志

kubectl logs -f test-volume-emptydir -n default -c test-busybox

k8s數(shù)據(jù)存儲之Volume如何使用

五、Volume 之 hostPath 

上面我們聊了EmptyDir的使用,相信實際操作之后的同學(xué)應(yīng)該能看出來,由于EmptyDir創(chuàng)建的這個Volume是一個虛擬的路徑,所以當(dāng)其銷毀后,pod中容器產(chǎn)生的數(shù)據(jù)也就隨之銷毀了,即無法真正實現(xiàn)數(shù)據(jù)的落盤持久化,于是我們在想,是否可以做到下面這樣呢?

當(dāng)然是可以的,這就是接下來要說的另一種Volume : hostPath;

k8s數(shù)據(jù)存儲之Volume如何使用

5.1 hostPath 概述

  • emptyDir中數(shù)據(jù)沒做持久化,隨著Pod的結(jié)束而銷毀,需要持久化到磁盤則選其他方式 ;

  • hostPath類型的磁盤就是掛在了主機的一個文件或者目錄 ;

  • 某些應(yīng)用需要用到docker的內(nèi)部文件,這時只需要掛在本機的/var/lib/docker作為hostPath ;

5.2 hostPath類型

根據(jù)使用場景的不同,又可以細分成多個類型

  • Directory 給定的目錄路徑必須存在 ;

  • DirectoryOrCreate 如果給定路徑不存在,將根據(jù)需要在那里創(chuàng)建一個空目錄 ;

  • File 給定路徑上必須存在對應(yīng)文件 ;

  • FileOrCreate 如果給定路徑不存在,將根據(jù)需要在那里創(chuàng)建一個空文件 ;

5.3 hostPath 操作演示

5.3.1 創(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ù);

5.3.2 使用apply命令創(chuàng)建pod

創(chuàng)建成功后,可以看到產(chǎn)生了一個hostpath開頭的一個Pod,里面包含兩個容器;

k8s數(shù)據(jù)存儲之Volume如何使用

5.3.3 訪問nginx使其產(chǎn)生訪問日志

k8s數(shù)據(jù)存儲之Volume如何使用

5.3.4 查看容器輸出日志

這這里注意使用你自己定義的那個名稱

kubectl logs -f hostpath-volume-test -n default -c test-busybox

k8s數(shù)據(jù)存儲之Volume如何使用

5.3.5 查看掛載目錄日志文件

工作節(jié)點查看對應(yīng)的掛載目錄的日志文件,登錄工作節(jié)點的服務(wù)器,可以看到對應(yīng)的nginx日志文件也在里面了;

k8s數(shù)據(jù)存儲之Volume如何使用

5.3.6 刪除當(dāng)前的pod

k8s數(shù)據(jù)存儲之Volume如何使用

刪除pod之后發(fā)現(xiàn)工作節(jié)點目錄下的日志文件依然存在

k8s數(shù)據(jù)存儲之Volume如何使用

5.4 emptyDir和hostPath的對比

通過上面的演示,最后來對比一下emptyDir和hostPath使用上的異同點:

  • 兩者都是本地存儲卷方式 ;

  • emptyDir是臨時存儲空間,完全不提供持久化支持;

  • hostPath的卷數(shù)據(jù)是持久化在node節(jié)點的文件系統(tǒng)中的,即便pod已經(jīng)被刪除了,volume卷中的數(shù)據(jù)還留存在node節(jié)點上;

六、Volume 之 ConfigMap 

6.1 ConfigMap需求場景

很多應(yīng)用在其初始化或運行期間要依賴一些配置信息 ,并且在大多數(shù)時候, 存在要調(diào)整配置參數(shù)所設(shè)置的數(shù)值的需求,而ConfigMap是Kubernetes 用來向應(yīng)用 Pod 中注入配置數(shù)據(jù)的一種方法 ;

6.2 ConfigMap簡介

  • 是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

6.3 ConfigMap 創(chuàng)建操作演示

6.3.1 使用命令行創(chuàng)建

使用下面的命令進行ConfigMap的創(chuàng)建

kubectl create configmap test-config --from-literal=account=test --from-literal=password=123456

k8s數(shù)據(jù)存儲之Volume如何使用

6.3.2 查看創(chuàng)建的configmap
kubectl get configmap test-config -o yaml

k8s數(shù)據(jù)存儲之Volume如何使用

6.3.3 使用yaml配置文件創(chuàng)建

在當(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)建

k8s數(shù)據(jù)存儲之Volume如何使用

6.3.4 查看configmap詳情
kubectl describe cm congge-configmap -n default

k8s數(shù)據(jù)存儲之Volume如何使用

6.4 ConfigMap 使用操作演示

上面演示了兩種創(chuàng)建configmap的方式,configmap創(chuàng)建出來后怎么使用呢?簡單來說,只需要開啟一個pod,將這個configmap掛載進去使用即可;

6.4.1 使用配置文件創(chuàng)建pod

注意,里面的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)建成功;

k8s數(shù)據(jù)存儲之Volume如何使用

6.4.2 驗證configmap中配置的值

進入pod容器

kubectl exec -it pod-configmap -n default -- /bin/sh

k8s數(shù)據(jù)存儲之Volume如何使用

進入配置文件中的掛載目錄 /config,查看配置信息

k8s數(shù)據(jù)存儲之Volume如何使用

七、Volume 之 Secret 

有些配置需要加密存儲,ConfigMap只能使用明文保存,因此ConfigMap就不適合了;

7.1 Secret 簡介

Secret 作用

  • 用來保存敏感信息,例如密碼、秘鑰、證書、OAuth 令牌和 ssh key等 ;

  • 就不需要把這些敏感數(shù)據(jù)暴露到鏡像或者Pod中 ;

不管是哪種Volume,最終都是為Pod服務(wù)的,對于Pod來說,可以用三種方式之一來使用 Secret:

作為掛載到一個或多個容器上的卷 中的文件 ;作為容器的環(huán)境變量 ;由 kubelet 在為 Pod 拉取鏡像時使用 ;

7.2 secret 常見類型

下面列舉secret中常用的幾種類型

7.2.1 dockerconfigjson

用來存儲私有 docker registry的認證信息

7.2.2 Service Account

1、只要與Kubernetes API有交互的Pod,都會自動擁有此種類型的Secret;

2、K8S自動創(chuàng)建,并且會自動掛載到Pod的 /run/secrets/kubernetes.io/serviceaccount 目錄中;

7.2.3 Opaque

加密類型為base64,其特點就是將明文改為了密文

7.3 Secret  

Opaque使用

下面以Secret中Opaque這種類型進行說明,首先用一個字符串做下測試,簡單來說,就是將字符串進行base64編碼,得到一串類似于密文的字符串;

k8s數(shù)據(jù)存儲之Volume如何使用

7.3.1 創(chuàng)建模板配置文件

在當(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
7.3.2 使用apply命令創(chuàng)建secret

創(chuàng)建成功后,可以順便使用get查看下創(chuàng)建的secret;

k8s數(shù)據(jù)存儲之Volume如何使用

7.3.3 查看my-secret詳細信息

使用下面的命令進行查看

kubectl get secret my-secret -o yaml

k8s數(shù)據(jù)存儲之Volume如何使用

7.3.4 創(chuàng)建pod

創(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

k8s數(shù)據(jù)存儲之Volume如何使用

7.3.5 查看secret信息

在pod中的secret信息實際已經(jīng)被解密,使用下面的命令進入到pod

kubectl exec -it pod-secret -- /bin/sh

查看指定目錄下secret中配置的username和password,可以看到,在pod中,加密的信息已被解密了;

k8s數(shù)據(jù)存儲之Volume如何使用

感謝各位的閱讀,以上就是“k8s數(shù)據(jù)存儲之Volume如何使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對k8s數(shù)據(jù)存儲之Volume如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責(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)容。

AI