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