溫馨提示×

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

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

kubernetes的存儲(chǔ)卷

發(fā)布時(shí)間:2020-06-18 18:22:06 來源:億速云 閱讀:266 作者:元一 欄目:系統(tǒng)運(yùn)維

序言

kubernetes,簡(jiǎn)稱K8s,是用8代替8個(gè)字符“ubernete”而成的縮寫。是一個(gè)開源的,用于管理云平臺(tái)中多個(gè)主機(jī)上的容器化的應(yīng)用,Kubernetes的目標(biāo)是讓部署容器化的應(yīng)用簡(jiǎn)單并且高效(powerful),Kubernetes提供了應(yīng)用部署,規(guī)劃,更新,維護(hù)的一種機(jī)制。

k8s支持類似地存儲(chǔ)卷功能,不過,其存儲(chǔ)卷是與pod資源綁定而非容器。簡(jiǎn)單來說,存儲(chǔ)卷是定義在pod資源之上、可被其內(nèi)部的所有容器掛載的共享目錄,它關(guān)聯(lián)至某外部的存儲(chǔ)設(shè)備之上的存儲(chǔ)空間,從而獨(dú)立于容器自身的文件系統(tǒng),而數(shù)據(jù)是否具有持久能力則取決于存儲(chǔ)卷自身是否支持持久機(jī)制。

1.emptyDir存儲(chǔ)卷

apiVersion: v1
kind: Pod
metadata:
  name: cunchujuan
spec:
  containers:
  - name: myapp
  #定義第一容器用于顯示index.html文件內(nèi)容
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    volumeMounts:
    #調(diào)用存儲(chǔ)卷
    - name: html
     #使用存儲(chǔ)卷的名稱要和下面定義的一樣
      mountPath: /usr/share/nginx/html/
     #在容器內(nèi)部掛載的路徑
  - name: busybox
  #定義第二個(gè)容器用于產(chǎn)生index.html內(nèi)容
    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']
    #該命令會(huì)不停向,存儲(chǔ)卷的index.html文件追加時(shí)間
  volumes:
  #定義存儲(chǔ)卷
  - name: html
  #定義存儲(chǔ)卷名稱  
    emptyDir: {}
    #定義存儲(chǔ)卷類型

kubernetes的存儲(chǔ)卷
在上面,我們定義了2個(gè)容器,其中第二個(gè)容器是輸入日期到存儲(chǔ)卷的index.html當(dāng)中,因?yàn)閮蓚€(gè)容器都是掛載的同一個(gè)存儲(chǔ)卷,所以第一個(gè)容器的index.html是和第二個(gè)共享的,不停curl 能看見index.html在不停的增長(zhǎng)

2.hostPath存儲(chǔ)卷

apiVersion: v1
kind: Pod
metadata:
  name: cs-hostpath
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: html
    hostPath:
        #存儲(chǔ)卷類型為 hostPath
      path: /data/hostpath
            #實(shí)際node節(jié)點(diǎn)上的路徑
      type: DirectoryOrCreate

kubernetes的存儲(chǔ)卷
先看下調(diào)度到那個(gè)node的節(jié)點(diǎn)上,這邊調(diào)度到cs27節(jié)點(diǎn)上了
mkdir /data/hostpath/ -pv    #在cs27節(jié)點(diǎn)上創(chuàng)建 hostpath的存儲(chǔ)卷文件夾
echo "hostpath存儲(chǔ)卷測(cè)試" >/data/hostpath/index.html #在存儲(chǔ)卷里生成一個(gè)主頁文件
kubernetes的存儲(chǔ)卷
curl 訪問一下,能看到文件內(nèi)容就是上面我們生成的
注意這邊容器在里面修改了數(shù)據(jù),是會(huì)同步到hostpath 的存儲(chǔ)卷的就和掛載一樣

3.nfs共享存儲(chǔ)卷

再找一臺(tái)主機(jī)充當(dāng)nfs server
mkdir data #創(chuàng)建nfs文件夾
echo "nfs測(cè)試">index.html #創(chuàng)建測(cè)試html文件
yum install -y nfs-utils #安裝nfs 軟件
vim /etc/exports  #修改nfs配置文件
/data/ 192.168.0.0/24(rw,no_root_squash)
#配置文件 路徑加共享對(duì)方的網(wǎng)段

每個(gè)node節(jié)點(diǎn)也要安裝 yum install -y nfs-utils ,否則無法沒掛載驅(qū)動(dòng)
kubernetes的存儲(chǔ)卷
#在node的節(jié)點(diǎn)運(yùn)行showmount -e 50.1.1.111 看看有沒有掛載權(quán)限
kubectl apply -f nfs.yaml #載入容器資源
kubernetes的存儲(chǔ)卷
查看下ip ,curl 訪問一下看是不是之前在nfs server上創(chuàng)建的html的測(cè)試文件

4.NFS使用PV和PVC

4.1 pv定義方式介紹

[root@k8s-master ~]# kubectl explain pv    #查看pv的定義方式
FIELDS:
    apiVersion
    kind
    metadata
    spec
[root@k8s-master ~]# kubectl explain pv.spec    #查看pv定義的規(guī)格
spec:
  nfs(定義存儲(chǔ)類型)
    path(定義掛載卷路徑)
    server(定義服務(wù)器名稱)
  accessModes(定義訪問模型,有以下三種訪問模型,以列表的方式存在,也就是說可以定義多個(gè)訪問模式)
    ReadWriteOnce(RWO)  單節(jié)點(diǎn)讀寫
    ReadOnlyMany(ROX)  多節(jié)點(diǎn)只讀
    ReadWriteMany(RWX)  多節(jié)點(diǎn)讀寫
  capacity(定義PV空間的大?。?
    storage(指定大小)

[root@k8s-master volumes]# kubectl explain pvc   #查看PVC的定義方式
KIND:     PersistentVolumeClaim
VERSION:  v1
FIELDS:
   apiVersion   <string>
   kind <string>  
   metadata <Object>
   spec <Object>
[root@k8s-master volumes]# kubectl explain pvc.spec
spec:
  accessModes(定義訪問模式,必須是PV的訪問模式的子集)
  resources(定義申請(qǐng)資源的大小)
    requests:
      storage: 

4.2配置nfs 存儲(chǔ)

mkdir v{1,2,3,}
vim /etc/exports
/data/v1 192.168.0.0/24(rw,no_root_squash)
/data/v2 192.168.0.0/24(rw,no_root_squash)
/data/v3 192.168.0.0/24(rw,no_root_squash)

4.3定義3個(gè)pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
  labels:
    name: pv001
spec:
  nfs:
    path: /data/v1
    server: 50.1.1.111
  accessModes: ["ReadWriteMany","ReadWriteOnce",]
  capacity:
    storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
  labels:
    name: pv002
spec:
  nfs:
    path: /data/v2
    server: 50.1.1.111
  accessModes: ["ReadWriteMany","ReadWriteOnce",]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
  labels:
    name: pv003
spec:
  nfs:
    path: /data/v3
    server: 50.1.1.111
  accessModes: ["ReadWriteMany","ReadWriteOnce",]
  capacity:
    storage: 5Gi

4.4 創(chuàng)建pvc

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
  #name ,給下面調(diào)用的
spec:
  accessModes: ["ReadWriteMany"]
  #聲明訪問類型,只能匹配到,pv包含的
  resources:
    requests:
      storage: 3Gi
      #聲明需要3GB的空間,只能匹配3GB及意思的PV
---
apiVersion: v1
kind: Pod
metadata:
  name: cs-hostpath
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: html
    persistentVolumeClaim:
    #掛載存儲(chǔ)卷類型為 pvc
      claimName: mypvc
      #指定PVC的name為 "mypvc"

配置容器應(yīng)用:Secret和configMap

Secret:用于向Pod傳遞敏感信息,比如密碼,私鑰,證書文件等,這些信息如果在容器中定義容易泄露,Secret資源可以讓用戶將這些信息存儲(chǔ)在急群眾,然后通過Pod進(jìn)行掛載,實(shí)現(xiàn)敏感數(shù)據(jù)和系統(tǒng)解耦的效果。
ConfigMap:主要用于向Pod注入非敏感數(shù)據(jù),使用時(shí),用戶將數(shù)據(jù)直接存儲(chǔ)在ConfigMap對(duì)象當(dāng)中,然后Pod通過使用ConfigMap卷進(jìn)行引用,實(shí)現(xiàn)容器的配置文件集中定義和管理。

通過 --from-literal 創(chuàng)建

kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123456
#創(chuàng)建一個(gè)Secret namae為 mysecret 

通過 --from-file創(chuàng)建
每個(gè)文件內(nèi)容對(duì)應(yīng)一個(gè)信息條目。

[root@cs25 ~]# echo "admin" >username
[root@cs25 ~]# echo "123456" >password
kubectl create secret generic mysecret2 --from-file=username --from-file=password

通過 --from-env-file創(chuàng)建
文件 env.txt 中每行 Key=Value 對(duì)應(yīng)一個(gè)信息條目。

[root@cs25 ~]# cat << EOF > env.txt
> username=admin
> password=12345
> EOF
kubectl create secret generic mysecret3 --from-env-file=env.txt

通過 YAML 配置文件:
kubernetes的存儲(chǔ)卷
先用base64 命令對(duì)密碼等保密的數(shù)據(jù)完成轉(zhuǎn)碼

vim secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysecretyaml
data:
  username: YWRtaW4K
  password: MTIzNDU2Cg==
    #鍵值

查看
kubernetes的存儲(chǔ)卷
kubernetes的存儲(chǔ)卷
kubernetes的存儲(chǔ)卷

kubernetes的存儲(chǔ)卷
#反解碼

使用secret

apiVersion: v1
kind: Pod
metadata:
  name: pod-secret
spec:
  containers:
  - name: pod-secret
    image: nginx
    volumeMounts:
    - name: foo
      #掛載那個(gè)存儲(chǔ)卷
      mountPath: "/etc/foo"
      #pod 掛載的路徑
  volumes:
  - name: foo
    #創(chuàng)建存儲(chǔ)卷,name,用于被pod 調(diào)用
    secret:
    #存儲(chǔ)卷類型
      secretName: mysecret
      #用那個(gè)文件

kubernetes的存儲(chǔ)卷
exec 進(jìn)入容器 cd 到/etc/foo  能看到我們創(chuàng)建mysecret的key 及value

重定向數(shù)據(jù)

apiVersion: v1
kind: Pod
metadata:
  name: pod-secret
spec:
  containers:
  - name: pod-secret
    image: nginx
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
  volumes:
  - name: foo
    secret:
      secretName: mysecret
      items:
      #自定義存放路徑及文件名
      - key: username
        path: 233/name
        #重定向路徑及文件名(key),注意路徑要寫相對(duì)路徑
      - key: password
        path: 233/pass

kubernetes的存儲(chǔ)卷
這時(shí)候數(shù)據(jù)都被重定向到"/etc/foo/233" 文件夾里了

使用這種方式 Secret 還支持動(dòng)態(tài)更新:Secret 更新后,容器中的數(shù)據(jù)也會(huì)更新。
vim secret.yaml
kubernetes的存儲(chǔ)卷
kubernetes的存儲(chǔ)卷
kubectl apply -f secret.yaml
kubernetes的存儲(chǔ)卷
登錄進(jìn)去查看,name 的 value已經(jīng)發(fā)生了變化

環(huán)境變量傳遞 key

apiVersion: v1
kind: Pod
metadata:
  name: pod-secret
spec:
  containers:
  - name: pod-secret
    image: nginx
    env:
      - name: username
        #傳遞到容器內(nèi)部的環(huán)境變量
        valueFrom:
          secretKeyRef:
            name: mysecret
            #使用那個(gè)secret
            key: username
            #使用那個(gè)key
      - name: password
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password

kubernetes的存儲(chǔ)卷
exec 登錄進(jìn)去 echo 環(huán)境變量

通過環(huán)境變量 SECRET_USERNAME 和 SECRET_PASSWORD 成功讀取到 Secret 的數(shù)據(jù)。
需要注意的是,環(huán)境變量讀取 Secret 很方便,但無法支撐 Secret 動(dòng)態(tài)更新。
Secret 可以為 Pod 提供密碼、Token、私鑰等敏感數(shù)據(jù);對(duì)于一些非敏感數(shù)據(jù),比如應(yīng)用的配置信息,則可以用 ConfigMap。

configmap 以上添加都支持就不一一舉例了
configmap 來個(gè)實(shí)例
vim www.conf  #創(chuàng)建nging 配置文件

server {
    server_name www.233.com;
    listen 8860;
    root /data/web/html;
}

kubectl create configmap configmap-cs --from-file=www.conf
#創(chuàng)建一個(gè)name為"configmap-cs"   configmap資源,內(nèi)容就是之前創(chuàng)建的www.conf
vim nginx-configmap #創(chuàng)建pod

 apiVersion: v1
kind: Pod
metadata:
  name: pod-secret
spec:
  containers:
  - name: pod-secret
    image: nginx
    volumeMounts:
    - name: nginxconf
      #調(diào)用名為"nginxconf"的存儲(chǔ)卷
      mountPath: /etc/nginx/conf.d/
  volumes:
  - name: nginxconf
    #創(chuàng)建存儲(chǔ)卷
    configMap:
    #存儲(chǔ)卷類型為configMap
      name: configmap-cs
      #使用configmap里面的"configmap-cs"這個(gè)資源

kubectl apply -f nginx-configmap.yaml  #載入啟動(dòng)
kubernetes的存儲(chǔ)卷
查看IP 訪問我剛才定義的資端口,能正常訪問說明配置文件生效了。
kubernetes的存儲(chǔ)卷
登錄進(jìn)去查看文件

kubectl edit configmaps configmap-cs
#命令修改資源,使用方法和vim 一樣使用
POD掛載過程

 POD先掛載名為"nginxconf"的存儲(chǔ)卷
 "nginxconf"的存儲(chǔ)卷的內(nèi)容是調(diào)用configMap資源里 "configmap-cs"這個(gè)資源生成的
 "configmap-cs" 這個(gè)資源是讀取www.conf 文件生成的
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI