溫馨提示×

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

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

docker中k8s存儲(chǔ)卷的示例分析

發(fā)布時(shí)間:2021-11-19 11:30:40 來(lái)源:億速云 閱讀:146 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)docker中k8s存儲(chǔ)卷的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

    因?yàn)閜od是有生命周期的,pod一重啟,里面的數(shù)據(jù)就沒(méi)了。所以我們需要數(shù)據(jù)持久化存儲(chǔ)。

    在k8s中,存儲(chǔ)卷不屬于容器,而是屬于pod。也就是說(shuō)同一個(gè)pod中的容器可以共享一個(gè)存儲(chǔ)卷。

    存儲(chǔ)卷可以是宿主機(jī)上的目錄,也可以是掛載在宿主機(jī)上的外部設(shè)備。

存儲(chǔ)卷類型

    emptyDIR存儲(chǔ)卷:pod一重啟,存儲(chǔ)卷也刪除,這叫emptyDir存儲(chǔ)卷。一般用于當(dāng)做臨時(shí)空間或緩存關(guān)系

    hostPath存儲(chǔ)卷:宿主機(jī)上目錄作為存儲(chǔ)卷,這種也不是真正意義實(shí)現(xiàn)了數(shù)據(jù)持久性。

    SAN(iscsi)或NAS(nfs、cifs):網(wǎng)絡(luò)存儲(chǔ)設(shè)備

    分布式存儲(chǔ)(ceph,glusterfs,cephfs,rbd)

    云存儲(chǔ)(亞馬遜的EBS,Azure Disk,阿里云):這種一般k8s也在云上部署的。

    關(guān)鍵數(shù)據(jù)一定要有異地備份,否則數(shù)據(jù)一刪,多少個(gè)副本都沒(méi)用。

[root@master ingress]# kubectl explain pods.spec.volumes

 hostPath

功能:使用宿主機(jī)上目錄作為存儲(chǔ)卷,這種也不是真正意義實(shí)現(xiàn)了數(shù)據(jù)持久性。

[root@master ~]# kubectl explain pods.spec.volumes.hostPath.type
KIND:     Pod
VERSION:  v1
FIELD:    type <string>
DESCRIPTION:
     Type for HostPath Volume Defaults to "" More info:
     https://kubernetes.io/docs/concepts/storage/volumes#hostpath

查看幫助: https://kubernetes.io/docs/concepts/storage/volumes#hostpath

hostPath.type的類型說(shuō)明:

DirectoryOrCreate:意思是我們要掛載的路徑在宿主機(jī)上是個(gè)已經(jīng)存在的目錄,不存在就創(chuàng)建一個(gè)新的目錄。

Directory:宿主機(jī)上必須實(shí)現(xiàn)存在目錄,如果不存在就報(bào)錯(cuò)

FileOrCreate:表示掛載的是文件,如果不存在就掛載一個(gè)文件。文件也可以當(dāng)做存儲(chǔ)掛載的。

File:表示要掛載的文件必須事先存在,否則就報(bào)錯(cuò)。

Socket:表示必須是一個(gè)Socket類型的文件。

CharDevice:表示是一個(gè)字符類型的設(shè)備文件。

BlockDevice:表示的是一個(gè)塊類型的設(shè)備文件。

例子:

[root@master volumes]# cat pod-hostpath-vol.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-hostpath
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html #存儲(chǔ)卷的名字叫html
      mountPath: /usr/share/nginx/html/ #掛載路徑
  volumes:
  - name: html
    hostPath:
      path: /data/pod/volume1
      type: DirectoryOrCreate
[root@master volumes]# kubectl apply -f pod-hostpath-vol.yaml 
pod/pod-vol-hostpath created

    然后到node1節(jié)點(diǎn)上可以看到/data/pod/volume1目錄已經(jīng)創(chuàng)建出來(lái)了。

[root@master volumes]# kubectl get pods -o wide
NAME                             READY     STATUS             RESTARTS   AGE       IP             NODE
client                           0/1       Error              0          15d       10.244.2.4     node2
pod-vol-hostpath                 1/1       Running            0          4m        10.244.1.105   node1

    當(dāng)node1節(jié)點(diǎn)宕機(jī)后,pod就飄到node2節(jié)點(diǎn)上,并使用node2節(jié)點(diǎn)上的/data/pod/volume1目錄。這就有問(wèn)題了,因?yàn)閚ode2節(jié)點(diǎn)上的目錄并沒(méi)有同步node1節(jié)點(diǎn)上目錄的數(shù)據(jù),所以出現(xiàn)數(shù)據(jù)不一致。

    解決這個(gè)問(wèn)題的方法就是使用類似nfs方法,讓兩個(gè)node節(jié)點(diǎn)共享一個(gè)存儲(chǔ)。

使用nfs做共享存儲(chǔ)

    我這里為了方便,把master節(jié)點(diǎn)當(dāng)做nfs存儲(chǔ)。

[root@master ~]# yum -y install nfs-utils
[root@master ~]# mkdir /data/volumes
[root@master ~]# cat /etc/exports
#no_root_squash:登入 NFS 主機(jī)使用分享目錄的使用者,如果是 root 的話,那么對(duì)于這個(gè)分享的目錄來(lái)說(shuō),他就具有 root 的權(quán)限!這個(gè)項(xiàng)目『極不安全』,不建議使用! 
#root_squash:在登入 NFS 主機(jī)使用分享之目錄的使用者如果是 root 時(shí),那么這個(gè)使用者的權(quán)限將被壓縮成為匿名使用者,通常他的 UID 與 GID 都會(huì)變成 nobody 那個(gè)系統(tǒng)賬號(hào)的身份;
/data/volumes 172.16.0.0/16(rw,no_root_squash)
[root@master ~]# systemctl start nfs

    在node1和node2上也安裝nfs-utils包

[root@node1 ~]# yum -y install nfs-utils

    在node1和node2上掛載:

[root@node1 ~]# mount -t nfs 172.16.1.100:/data/volumes /mnt

    在master上:

[root@master ~]# kubectl explain pods.spec.volumes.nfs
[root@master volumes]# cat pod-vol-nfs.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-nfs
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html #存儲(chǔ)卷的名字叫html
      mountPath: /usr/share/nginx/html/ #掛載路徑,myapp容器里面的路徑
  volumes:
  - name: html
    nfs:
      path: /data/volumes
      server: 172.16.1.100 #nfs server ip
[root@master volumes]# kubectl apply -f pod-vol-nfs.yaml
[root@master volumes]# kubectl get pods -o wide
NAME                             READY     STATUS             RESTARTS   AGE       IP             NODE
pod-vol-nfs                      1/1       Running            0          1m        10.244.1.106   node1
[root@master volumes]# cat /data/volumes/index.html
hello world
[root@master volumes]# curl  10.244.1.106 #容器的ip
hello world

    可見(jiàn)容器使用的是nfs提供的共享存儲(chǔ)。

    不過(guò),nfs自身沒(méi)有冗余能力,所以如果nfs宕機(jī)了,數(shù)據(jù)也丟了。因此,我們一般用glusterfs或者cephfs分布式存儲(chǔ)。

pvc和pv

    用戶只需要掛載pvc到容器中而不需要關(guān)注存儲(chǔ)卷采用何種技術(shù)實(shí)現(xiàn)。pvc和pv的關(guān)系與pod和node關(guān)系類似,前者消耗后者的資源。pvc可以向pv申請(qǐng)指定大小的存儲(chǔ)資源并設(shè)置訪問(wèn)模式。

docker中k8s存儲(chǔ)卷的示例分析

    在定義pod時(shí),我們只需要說(shuō)明我們要一個(gè)多大的存儲(chǔ)卷就行了。pvc存儲(chǔ)卷必須與當(dāng)前namespace的pvc建立直接綁定關(guān)系。pvc必須與pv建立綁定關(guān)系。而pv是真正的某個(gè)存儲(chǔ)設(shè)備上的空間。

docker中k8s存儲(chǔ)卷的示例分析

[root@master volumes]# kubectl explain pods.spec.volumes.persistentVolumeClaim
[root@master volumes]# kubectl explain pvc

    一個(gè)pvc和pv是一一對(duì)應(yīng)關(guān)系,一旦一個(gè)pv被一個(gè)pvc綁定了,那么這個(gè)pv就不能被其他pvc綁定了。

    一個(gè)pvc是可以被多個(gè)pod所訪問(wèn)的。

    在存儲(chǔ)機(jī)器上建立如下幾個(gè)目錄(這里我以master節(jié)點(diǎn)做存儲(chǔ),生產(chǎn)中可以單獨(dú)拿出 一個(gè)機(jī)器做存儲(chǔ)):

[root@master volumes]# mkdir v{1,2,3,4,5}
[root@master volumes]# cat  /etc/exports
#no_root_squash:登入 NFS 主機(jī)使用分享目錄的使用者,如果是 root 的話,那么對(duì)于這個(gè)分享的目錄來(lái)說(shuō),他就具有 root 的權(quán)限!這個(gè)項(xiàng)目『極不安全』,不建議使用! 
#root_squash:在登入 NFS 主機(jī)使用分享之目錄的使用者如果是 root 時(shí),那么這個(gè)使用者的權(quán)限將被壓縮成為匿名使用者,通常他的 UID 與 GID 都會(huì)變成 nobody 那個(gè)系統(tǒng)賬號(hào)的身份;
/data/volumes/v1 172.16.0.0/16(rw,no_root_squash) 
/data/volumes/v2 172.16.0.0/16(rw,no_root_squash) 
/data/volumes/v3 172.16.0.0/16(rw,no_root_squash) 
/data/volumes/v4 172.16.0.0/16(rw,no_root_squash) 
/data/volumes/v5 172.16.0.0/16(rw,no_root_squash)
[root@master volumes]# exportfs  -arv #不用重啟nfs服務(wù),配置文件就會(huì)生效
exporting 172.16.0.0/16:/data/volumes/v5
exporting 172.16.0.0/16:/data/volumes/v4
exporting 172.16.0.0/16:/data/volumes/v3
exporting 172.16.0.0/16:/data/volumes/v2
exporting 172.16.0.0/16:/data/volumes/v1
[root@master volumes]# showmount -e
Export list for master:
/data/volumes/v5 172.16.0.0/16
/data/volumes/v4 172.16.0.0/16
/data/volumes/v3 172.16.0.0/16
/data/volumes/v2 172.16.0.0/16
/data/volumes/v1 172.16.0.0/16
[root@master volumes]# kubectl explain pv.spec.nfs
[root@master ~]# kubectl explain pv.spec
FIELDS:
   accessModes<[]string>
     AccessModes contains all ways the volume can be mounted. More info:
     https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes

訪問(wèn)  https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes看幫助。

accessModes模式有:

ReadWriteOnce:?jiǎn)温纷x寫(xiě),可以簡(jiǎn)寫(xiě)為RWO

ReadOnlyMany:多路只讀,可以簡(jiǎn)寫(xiě)為ROX

ReadWriteMany :多路讀寫(xiě),可以簡(jiǎn)寫(xiě)為RWX

不同類型的存儲(chǔ)卷支持的accessModes也不同。

docker中k8s存儲(chǔ)卷的示例分析

[root@master volumes]# cat pv-demo.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001 #注意,定義pv時(shí)一定不要加名稱空間,因?yàn)閜v是屬于整個(gè)集群,而不是屬于某個(gè)名稱空間。但pvc是屬于某個(gè)名稱空間的
  labels:
    name: pv001
spec:
  nfs:
    path: /data/volumes/v1
    server: 172.16.1.100
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity: #分配磁盤(pán)空間大小
    storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002 #注意,定義pv時(shí)一定不要加名稱空間,因?yàn)閜v是屬于整個(gè)集群,而不是屬于某個(gè)名稱空間。但pvc是屬于某個(gè)名稱空間的
  labels:
    name: pv002
spec:
  nfs:
    path: /data/volumes/v2
    server: 172.16.1.100
  accessModes: ["ReadWriteOnce"]
  capacity: #分配磁盤(pán)空間大小
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003 #注意,定義pv時(shí)一定不要加名稱空間,因?yàn)閜v是屬于整個(gè)集群,而不是屬于某個(gè)名稱空間。但pvc是屬于某個(gè)名稱空間的
  labels:
    name: pv003
spec:
  nfs:
    path: /data/volumes/v3
    server: 172.16.1.100
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity: #分配磁盤(pán)空間大小
    storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv004 #注意,定義pv時(shí)一定不要加名稱空間,因?yàn)閜v是屬于整個(gè)集群,而不是屬于某個(gè)名稱空間。但pvc是屬于某個(gè)名稱空間的
  labels:
    name: pv004
spec:
  nfs:
    path: /data/volumes/v4
    server: 172.16.1.100
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity: #分配磁盤(pán)空間大小
    storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv005 #注意,定義pv時(shí)一定不要加名稱空間,因?yàn)閜v是屬于整個(gè)集群,而不是屬于某個(gè)名稱空間。但pvc是屬于某個(gè)名稱空間的
  labels:
    name: pv005
spec:
  nfs:
    path: /data/volumes/v5
    server: 172.16.1.100
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity: #分配磁盤(pán)空間大小
    storage: 1Gi
[root@master volumes]# kubectl apply -f pv-demo.yaml 
persistentvolume/pv001 created
persistentvolume/pv002 created
persistentvolume/pv003 created
persistentvolume/pv004 created
persistentvolume/pv005 created
[root@master volumes]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
pv001     1Gi        RWO,RWX        Retain           Available                                      2m
pv002     2Gi        RWO            Retain           Available                                      2m
pv003     1Gi        RWO,RWX        Retain           Available                                      2m
pv004     1Gi        RWO,RWX        Retain           Available                                      2m
pv005     1Gi        RWO,RWX        Retain           Available                                      2m

    回收策略:如果某個(gè)pvc在pv里面存數(shù)據(jù)了,后來(lái)pvc刪了,那么 pv里面的數(shù)據(jù)怎么處理呢。有如下幾種策略:

    reclaim_policy:即pvc刪了,但是pv里面的數(shù)據(jù)不擅長(zhǎng),還保留著。

    recycle:即pvc刪了,那么就把pv里面的數(shù)據(jù)也刪了。

    delete:即pvc刪了,那么就把pv也刪了。

    下面我們?cè)賱?chuàng)建pvc的清單文件。

[root@master ~]# kubectl explain pvc.spec
[root@master ~]# kubectl explain pods.spec.volumes.persistentVolumeClaim
[root@master volumes]# cat pod-vol-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim #簡(jiǎn)稱pvc
metadata:
  name: mypvc
  namespace: default #pvc和pod是在同一個(gè)名稱空間
spec:
  accessModes: ["ReadWriteMany"] #一定是pv策略的子集
  resources:
    requests:
      storage: 1Gi #表示我要pvc 為1G的空間
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-pvc
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html #存儲(chǔ)卷的名字叫html
      mountPath: /usr/share/nginx/html/ #掛載路徑
  volumes:
  - name: html
    persistentVolumeClaim:
      claimName: mypvc #表示我要使用哪個(gè)pvc
[root@master volumes]# kubectl apply -f pod-vol-pvc.yaml 
persistentvolumeclaim/mypvc created
pod/pod-vol-pvc created
[root@master volumes]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON    AGE
pv001     1Gi        RWO,RWX        Retain           Available                                            7h
pv002     2Gi        RWO            Retain           Available                                            7h
pv003     1Gi        RWO,RWX        Retain           Available                                            7h
pv004     1Gi        RWO,RWX        Retain           Bound       default/mypvc                            7h
pv005     1Gi        RWO,RWX        Retain           Available                                            7h

    上面看到pv004被default名稱空間的mypvc綁定了。

[root@master volumes]# kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mypvc     Bound     pv004     1Gi        RWO,RWX                       33m
[root@master volumes]# kubectl get pods 
NAME                             READY     STATUS             RESTARTS   AGE
client                           0/1       Error              0          16d
pod-vol-pvc                      1/1       Running            0          35m

    生產(chǎn)上,pv并不屬于node節(jié)點(diǎn),而是獨(dú)立于node節(jié)點(diǎn)的。所以,node節(jié)點(diǎn)壞了,pv里面的數(shù)據(jù)還在。另外,pod才是屬于node節(jié)點(diǎn)的。

    在k8s 1.10之后,不能手工從底層刪除pv,這樣做很安全。

 StorageClass(存儲(chǔ)類)

docker中k8s存儲(chǔ)卷的示例分析

    Kubernetes集群管理員通過(guò)提供不同的存儲(chǔ)類,可以滿足用戶不同的服務(wù)質(zhì)量級(jí)別、備份策略和任意策略要求的存儲(chǔ)需求。動(dòng)態(tài)存儲(chǔ)卷供應(yīng)使用StorageClass進(jìn)行實(shí)現(xiàn),其允許存儲(chǔ)卷按需被創(chuàng)建。如果沒(méi)有動(dòng)態(tài)存儲(chǔ)供應(yīng),Kubernetes集群的管理員將不得不通過(guò)手工的方式類創(chuàng)建新的存儲(chǔ)卷。通過(guò)動(dòng)態(tài)存儲(chǔ)卷,Kubernetes將能夠按照用戶的需要,自動(dòng)創(chuàng)建其需要的存儲(chǔ)。

    storageclass底層可以是glusterfs,cephfs等不同的集群。

configmap   

    configmap和secret是兩種特殊的存儲(chǔ)卷,它們不是給pod提供存儲(chǔ)空間用的,而是給我們的管理員或者用戶提供了從外部向pod內(nèi)部注入信息的方式。

    configmap:把配置文件放在配置中心上,然后多個(gè)pod讀取配置中心的配置文件。不過(guò),configmap中的配置信息都是明文的,所以不安全。

     secret:功能和configmap一樣,只不過(guò)配置中心存儲(chǔ)的配置文件不是明文的。

    configmap和secret也是專屬于某個(gè)名稱空間的。

[root@master ~]# kubectl explain configmap
[root@master ~]# kubectl explain cm #簡(jiǎn)寫(xiě)
[root@master ~]# kubectl create configmap --help

    簡(jiǎn)單的我們可以用命令行來(lái)創(chuàng)建configmap。

[root@master ~]# kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=myapp.zhixin.com
configmap/nginx-config created
[root@master ~]# kubectl get cm
NAME           DATA      AGE
nginx-config   2         3m
[root@master ~]# kubectl describe cm nginx-config
Name:         nginx-config
Namespace:    default
Labels:       <none>
Annotations:  <none>
Data
====
nginx_port:
----
80
server_name:
----
myapp.zhixin.com

    下面我們用配置清單的方式來(lái)創(chuàng)建configmap:

[root@master configmap]# cat www.conf 
server {
      server_name myapp.zhixin.com;
      listen 80;
      root /data/web/html;
}
[root@master configmap]# kubectl create configmap nginx-www --from-file=www.conf
configmap/nginx-www created
[root@master configmap]# kubectl get cm
NAME           DATA      AGE
nginx-config   2         3m
nginx-www      1         7s
[root@master configmap]# kubectl describe cm nginx-www 
Name:         nginx-www
Namespace:    default
Labels:       <none>
Annotations:  <none>
Data
====
www.conf:
----
server {
      server_name myapp.zhixin.com;
      listen 80;
      root /data/web/html;
}

    我們創(chuàng)建的configmap,可用ENV等方式注入到Pod中。

    我們用ENV方式來(lái)把configmap注入到pod中去。

[root@master configmap]# cat pod-configmap.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-1
  namespace: default
  labels:
    app: myapp  #kv格式的,也可以用花括號(hào)表示
    tier: frontend #定義所屬的層次
  annotations:
    chenzx.com/created-by: "cluster-admin" #這是注解的鍵值對(duì)
spec:
  containers: 
  - name: myapp  #前面的-號(hào)表示這是一個(gè)列表格式的,也可以用中括號(hào)表示
    image: tomcat 
    ports:
    - name: http
      containerPort: 80
    env: #這是一個(gè)容器的屬性
    - name: NGINX_SERVER_PORT
      valueFrom: #kubectl explain pods.spec.containers.env.valueFrom
        configMapKeyRef: #表示我們要引用一個(gè)configmap來(lái)獲取數(shù)據(jù)
          name: nginx-config #這是configmap的名字,也就是通過(guò)kubectl get cm獲取的名字
          key: nginx_port #通過(guò)kubectl describe cm nginx-config的鍵
     #下面開(kāi)始引用第二個(gè)環(huán)境變量
    - name: NGINX_SERVER_NAME
      valueFrom:
        configMapKeyRef:
          name: nginx-config
          key: server_name
[root@master configmap]# kubectl apply -f pod-configmap.yaml 
pod/pod-cm-1 created

    這樣,我們就建立了一個(gè)pod-cm-1的pod,并且這個(gè)pod的配置文件來(lái)自于configmap。

[root@master configmap]# kubectl get pods
NAME                             READY     STATUS                       RESTARTS   AGE
pod-cm-1                         0/1       Running   0          15m
[root@master configmap]# kubectl exec -it pod-cm-1 -- /bin/sh
# printenv
NGINX_SERVER_PORT=80
NGINX_SERVER_NAME=myapp.zhixin.com
[root@master configmap]# kubectl edit cm nginx-config
configmap/nginx-config edited

    通過(guò)edit方式編輯的配置文件,在Pod里面不會(huì)立即理解生效,需要重啟pod才能生效。

[root@master configmap]# kubectl delete -f pod-configmap.yaml 
pod "pod-cm-1" deleted

    下面我們用配置mount存儲(chǔ)卷的方法把configmap注入到pod中。

[root@master configmap]# cat pod-configmap2.ymal 
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-2
  namespace: default
  labels:
    app: myapp  #kv格式的,也可以用花括號(hào)表示
    tier: frontend #定義所屬的層次
  annotations:
    chenzx.com/created-by: "cluster-admin" #這是注解的鍵值對(duì)
spec:
  containers: 
  - name: myapp  #前面的-號(hào)表示這是一個(gè)列表格式的,也可以用中括號(hào)表示
    image: ikubernetes/myapp:v1 
    ports:
    - name: http
      containerPort: 80
    volumeMounts:
    - name: nginxconf
      mountPath: /etc/nginx/conf.d/
      readOnly: true
  volumes:
  - name: nginxconf
    configMap:
      name: nginx-config
[root@master configmap]# kubectl apply -f pod-configmap2.ymal 
pod/pod-cm-2 created
[root@master configmap]# kubectl get pods
NAME                             READY     STATUS             RESTARTS   AGE
pod-cm-2                         1/1       Running            0          1m
[root@master configmap]# kubectl exec -it pod-cm-2 -- /bin/sh
/ # cd /etc/nginx/conf.d/
/etc/nginx/conf.d # ls
nginx_port   server_name
/etc/nginx/conf.d # ls -l
total 0
lrwxrwxrwx    1 root     root            17 Sep 27 05:07 nginx_port -> ..data/nginx_port
lrwxrwxrwx    1 root     root            18 Sep 27 05:07 server_name -> ..data/server_name
/etc/nginx/conf.d # cat nginx_port
8080

    下面我們?cè)侔亚懊嫖覀儎?chuàng)建的www.conf文件注入到pod中:

[root@master configmap]# cat pod-configmap3.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-3
  namespace: default
  labels:
    app: myapp  #kv格式的,也可以用花括號(hào)表示
    tier: frontend #定義所屬的層次
  annotations:
    chenzx.com/created-by: "cluster-admin" #這是注解的鍵值對(duì)
spec:
  containers: 
  - name: myapp  #前面的-號(hào)表示這是一個(gè)列表格式的,也可以用中括號(hào)表示
    image: ikubernetes/myapp:v1 
    ports:
    - name: http
      containerPort: 80
    volumeMounts:
    - name: nginxconf
      mountPath: /etc/nginx/conf.d/
      readOnly: true
  volumes:
  - name: nginxconf
    configMap:
      name: nginx-www
[root@master configmap]# kubectl apply -f pod-configmap3.yaml 
pod/pod-cm-3 created
[root@master configmap]# 
[root@master configmap]# kubectl get pods
NAME                             READY     STATUS             RESTARTS   AGE
client                           0/1       Error              0          16d
pod-cm-3                         1/1       Running            0          1m
[root@master configmap]# kubectl exec -it pod-cm-3 -- /bin/sh
/ # cd /etc/nginx/conf.d/
/etc/nginx/conf.d # ls
www.conf
/etc/nginx/conf.d # cat www.conf 
server {
      server_name myapp.zhixin.com;
      listen 80;
      root /data/web/html;
}

    通過(guò)上面的例子,大家看到我們已經(jīng)把 www.conf中的內(nèi)容注入到了pod  myapp中。

[root@master configmap]# kubectl edit cm nginx-www

    改個(gè)端口,然后再到pod里面,多等一會(huì)就會(huì)看到剛才修改的在pod里面生效了。

[root@master configmap]# kubectl exec -it pod-cm-3 -- /bin/sh
/ # cd /etc/nginx/conf.d/
/etc/nginx/conf.d # cat www.conf 
server {
      server_name myapp.zhixin.com;
      listen 8081;
      root /data/web/html;
[root@master configmap]# /etc/init.d/nginx reload #重載nginx使8081端口生效

    如果我們期望只注入部分,而非所有,該怎么做呢?

[root@master configmap]# kubectl explain pods.spec.volumes.configMap.items
[root@master configmap]# kubectl create secret generic --help

    通過(guò)items來(lái)注入部分,這里面就不演示了,請(qǐng)讀者自行解決。

secret

    功能和configmap一樣,只不過(guò)secret配置中心存儲(chǔ)的配置文件不是明文的。

 [root@master configmap]# kubectl create secret --help
 generic:保存密碼用的類型
 tls:保存證書(shū)用的類型
 docker-registry:保存docker認(rèn)證信息用的類型,比如從私有docker倉(cāng)庫(kù)拉鏡像時(shí),就用這個(gè)類型。
 備注:k8s拖鏡像的進(jìn)程是kublete
[root@master configmap]# kubectl explain pods.spec.imagePullSecrets
如果是從私有倉(cāng)庫(kù)拉鏡像,就用imagePullSecrets存登錄驗(yàn)證的信息

例子:

[root@master configmap]# kubectl create secret generic mysql-root-password --from-literal=password=123456
secret/mysql-root-password created
[root@master configmap]# kubectl get secret
NAME                    TYPE                                  DATA      AGE
default-token-5r85r     kubernetes.io/service-account-token   3         19d
mysql-root-password     Opaque                                1         40s
tomcat-ingress-secret   kubernetes.io/tls                     2         2d
[root@master configmap]# kubectl describe secret mysql-root-password
Name:         mysql-root-password
Namespace:    default
Labels:       <none>
Annotations:  <none>
Type:  Opaque
Data
====
password:  6 bytes

    看到password的內(nèi)容就是base64加密的形式了。

[root@master configmap]# kubectl get secret mysql-root-password -o yaml
apiVersion: v1
data:
  password: MTIzNDU2
kind: Secret
metadata:
  creationTimestamp: 2018-09-27T06:01:24Z
  name: mysql-root-password
  namespace: default
  resourceVersion: "2482795"
  selfLink: /api/v1/namespaces/default/secrets/mysql-root-password
  uid: c3d3e8ec-c21a-11e8-bb35-005056a24ecb
type: Opaque

    可以用命令base64命令進(jìn)行明文解碼:

[root@master configmap]# echo MTIzNDU2 |base64 -d
123456

    可見(jiàn)secret是防君子不防小人,是個(gè)偽加密,哈哈。

    下面我們把secret通過(guò)env的方式注入到pod里面。

[root@master configmap]# cat  pod-secret-1.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-secret-1
  namespace: default
  labels:
    app: myapp  #kv格式的,也可以用花括號(hào)表示
    tier: frontend #定義所屬的層次
  annotations:
    chenzx.com/created-by: "cluster-admin" #這是注解的鍵值對(duì)
spec:
  containers: 
  - name: myapp  #前面的-號(hào)表示這是一個(gè)列表格式的,也可以用中括號(hào)表示
    image: tomcat 
    ports:
    - name: http
      containerPort: 80
    env: #這是一個(gè)容器的屬性
    - name: MYSQL_ROOT_PASSWORD
      valueFrom: #kubectl explain pods.spec.containers.env.valueFrom
        secretKeyRef: #表示我們要引用一個(gè)configmap來(lái)獲取數(shù)據(jù)
          name: mysql-root-password  #這是configmap的名字,也就是通過(guò)kubectl get secret獲取的名字
          key: password #通過(guò)kubectl describe secret mysql-root-password的鍵
     #下面開(kāi)始引用第二個(gè)環(huán)境變量
    - name: NGINX_SERVER_NAME
      valueFrom:
        configMapKeyRef:
          name: nginx-config
          key: server_name
[root@master configmap]# kubectl apply -f pod-secret-1.yaml 
pod/pod-secret-1 created
[root@master configmap]# kubectl get pods
NAME                             READY     STATUS             RESTARTS   AGE
pod-secret-1                     1/1       Running            0          1m
[root@master configmap]# kubectl exec -it pod-secret-1 -- /bin/sh
# printenv
MYSQL_ROOT_PASSWORD=123456

感謝各位的閱讀!關(guān)于“docker中k8s存儲(chǔ)卷的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(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