六は、ストレージボリューム管理をkubernetes

ストレージボリュームは、ポッド属しK8Sは、複数の容器がデータ共有を実現するために、ストレージボリュームとポッドに装着されています

pause是基础架构容器,每个Pod都有一个pause,该Pod里的所有容器都共享pause的名称空间,使得一个Pod里的容器交互更加效率

K8Sストレージボリュームは、ホストディレクトリ間のマッピングを確立しています。ストレージ・ボリュームが影響を受けたホストの故障に起因しないようにするためには、ホスト上の一般的なディレクトリには、ホストからの特別なストレージデバイスをマウントすることです。

ストレージボリュームの種類K8S
emptydir:ストレージボリュームのライフサイクルは、何の持続性がない、ポッドライフサイクルに従ってください。
ホストパス:ホストデータがまだ不足しているいったんホストヘッドロード、半永続的失敗とのマッピング関係を確立します。
従来のネットワーク・ベースのストレージ:SAN、NASなど
のようにglusterfs CEPH cephfs:ストレージを分散
EBS(アマゾン):クラウドストレージ

K8Sを使用することができ、ストレージシステムの表示pod.spec.volumesを説明kubectl

emptydirストレージ・ボリュームの使用
emptyDirは常に、各容器ポッド経路中の同一または異なるに取り付けることができるポッドのライフサイクルに存在するポッド、上に作成されます。ポッドが何らかの理由で削除されると、これらのデータは完全に削除されます。注:コンテナの崩壊は、ポッドを削除しないための容器は、不足しているデータの崩壊につながることはありません。

kubectl explain pod.spec.volumes.emptyDir  #获取emptyDir存储卷的定义字段,该字段的值是字典,该字典有两个键
medium,值有Memory和"",默认是""使用宿主机的硬盘,Memory使用宿主机的内存
sizeLimit,用于限制存储卷的空间大小

emptyDirポッド、定義の次のリストを使用してストレージ・ボリュームの例

apiVersion: v1
kind: Pod
metadata:
   name: pod-demo
   namespace: default
   labels:
     app: ngx

spec:
   containers:
   ##定义一个容器将名为html的存储卷挂载为目录/usr/share/nginx/html/
   - name: ngxapp
     image: 192.168.80.146:5000/my_ngx:v1
     imagePullPolicy: IfNotPresent
     volumeMounts:
     - name: html
       mountPath: /usr/share/nginx/html/
   ##定义一个容器将名为html的存储卷挂载为目录/data/,每2秒写入时间到/data/index.html文件
   - name: busybox
     image: 192.168.80.146:5000/busybox:latest
     imagePullPolicy: IfNotPresent
     volumeMounts:
     - name: html
       mountPath: /data/
     command: ["/bin/sh"]
     args: ["-c", "while true; do echo $(date) >> /data/index.html; sleep 2; done"]
   ##定义一个存储卷供Pod中的容器使用,名字为html,类型emptyDir,参数默认。
   volumes:  
   - name: html
     emptyDir: {}

有する2つのコンテナに、このポッドは、ngxappデータがコンテナから読み出され、記憶容量、busyboxのストレージボリュームにライトデータを搭載しました。ngxapp /usr/share/nginx/html/index.htmlコンテナに対応する/data/index.html busyboxの

ホストパスストレージ・ボリュームの使用
ホストパスはポッドと仲間関係のポッドホストは、ポッドに格納されたデータが失われない、削除されたディレクトリにあります。ときにホスト障害、ポッドは、別のノードに移行するが、ホストパスません。

kubectl explain pod.spec.volumes.hostPath  #获取hostPath存储卷的定义字段,该字段的值是字典,该字典有两个键
path,定义使用宿主机的路径
type,对path的类型设定,有四个可选值
 1. DirectoryOrCreate  宿主机上不存在则创建此目录   
 2. Directory 宿主机必须存在挂载目录,否则创建失败
 3. FileOrCreate 宿主机上不存在挂载文件就创建   
 4. File 宿主机上必须存在文件,否则创建失败

ホストパスポッド、定義の次のリストを使用してストレージ・ボリュームの例

apiVersion: v1
kind: Pod
metadata:
   name: pod-hostpath
   namespace: default
   labels:
     app: ngx

spec:
   containers:
   - name: ngxapp
     image: 192.168.80.146:5000/my_ngx:v1
     imagePullPolicy: IfNotPresent
     volumeMounts:
     - name: html
       mountPath: /usr/share/nginx/html/

   volumes:
   - name: html
     hostPath: 
        path: /tmp/data
        type: DirectoryOrCreate

マウントを確認します

[root@k8s-master volumes]# kubectl apply -f hostpath.yaml 
pod/pod-hostpath created
[root@k8s-master volumes]# kubectl get pod -o yaml
···
    hostIP: 192.168.80.147
    phase: Running
    podIP: 10.244.3.21
···
##在node2节点的被挂载目录下创建文件
[root@k8s-node2 ~]# echo "this is test" > /tmp/data/index.html
##访问pod,验证文件内容是否相同
[root@k8s-master volumes]# curl 10.244.3.21
this is test

使用してNFS共有ストレージボリューム
NFSストレージボリュームを実現することができる、ポッドは、それが設けられたリングパスをNFSマウント時に作成、PODが解放されたときマウントポッドが削除され、NFSが、NFSのないデータとの関係。ポッドNFSがマウントされ、リードとライトの複数することができます。

##创建nfs服务
[root@192-168-80-114 ~]# mkdir /data/volumes -pv
mkdir: 已创建目录 "/data/volumes"
[root@192-168-80-114 ~]# vim /etc/exports
/data/volumes 192.168.80.0/24(rw,no_root_squash)
[root@192-168-80-114 ~]# systemctl start nfs
[root@192-168-80-114 ~]# showmount -e
Export list for 192-168-80-114:
/data/volumes 192.168.80.0/24
[root@k8s-master volumes]# kubectl explain pod.spec.volumes.nfs##查看nfs存储卷的定义字段,该字段的值为字典,有三个建
path  必须键,NFS服务提供的路径
server  必须键,NFS服务的IP或域名
readonly  可选键,值为true或false

ポッド、定義の以下のリストNFS使用してストレージ・ボリュームの例

apiVersion: v1
kind: Pod
metadata:
   name: pod-nfs
   namespace: default
   labels:
     app: ngx
spec:
   containers:
   - name: ngxapp
     image: 192.168.80.146:5000/my_ngx:v1
     imagePullPolicy: IfNotPresent
     volumeMounts:
     - name: html
       mountPath: /usr/share/nginx/html/
   volumes:
   - name: html
     nfs:
        path: /data/volumes
        server: 192.168.80.114

マウントを確認します

[root@k8s-master volumes]# kubectl apply -f nfs.yaml 
pod/pod-nfs created
[root@k8s-master volumes]# kubectl get pod -o wide
NAME           READY     STATUS    RESTARTS   AGE       IP            NODE        NOMINATED NODE
pod-nfs   1/1       Running   0          1m        10.244.2.19   k8s-node1   <none>
##nfs服务器创建验证文件
[root@192-168-80-114 ~]# echo "this is test for nfs volumes" > /data/volumes/index.html
##访问pod的文件
[root@k8s-master volumes]# curl 10.244.2.19
this is test for nfs volumes
##删除pod重建后观察文件
[root@k8s-master volumes]# kubectl delete -f nfs.yaml      
pod "pod-nfs" deleted
[root@k8s-master volumes]# kubectl get pod -o wide    
No resources found.
[root@k8s-master volumes]# kubectl apply -f nfs.yaml  
pod/pod-nfs created
[root@k8s-master volumes]# kubectl get pod -o wide
NAME           READY     STATUS    RESTARTS   AGE       IP            NODE        NOMINATED NODE
pod-hostpath   1/1       Running   0          12s       10.244.3.22   k8s-node2   <none>
[root@k8s-master volumes]# curl 10.244.3.22
this is test for nfs volumes

そしてPVC PVの使用
kubernetesのストレージボリュームは、さまざまなストレージシステムの使用をサポートしていますが、それぞれが独自のストレージシステムは、ユーザkubernetesのストレージボリュームを簡単にするために、PVとPVCは、2つの新しいリソースを立ち上げ、店舗パラメータに設定する必要がありました。

PVとPVCはK8S、PVCとPVが1対1の関係であるオブジェクト、PVがよりPVC再利用できない資源です。
PVC複数のポッドを搭載してもよいが、ポッドストレージシステムを複数使用することができ、PVCのPVを設け特性に依存します。

PVは、クラスタレベルのリソースであるストレージ管理者が作成した説明したネットワークストレージ装置の期間の名前空間で定義することができません。
PVCは、リソースの名前空間レベルであるPV用K8Sユーザーの要件を記述するために使用される名前空間に定義する必要があります。

##查看pv和pvc的定义
[root@k8s-master ~]# kubectl explain pv    #查看pv的定义方式
FIELDS:
    apiVersion
    kind
    metadata
    spec
[root@k8s-master ~]# kubectl explain pv.spec  #查看pv支持存储系统及参数设置(以nfs举例)
spec:
  nfs(定义存储类型)
    path(定义挂载卷路径)
    server(定义服务器名称)
  accessModes(定义访问模型,有以下三种访问模型,以列表的方式存在,也就是说可以定义多个访问模式)
    ReadWriteOnce(RWO)  单节点读写
    ReadOnlyMany(ROX)  多节点只读
    ReadWriteMany(RWX)  多节点读写
  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(定义申请资源的大小)
    requests:
      storage: 
 
##定义pv
```shell
[root@k8s-master volumes]# vim pv-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
  labels:
    name: pv001
spec:
  nfs:
    path: /data/volumes/v1
    server: stor01
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
  labels:
    name: pv002
spec:
  nfs:
    path: /data/volumes/v2
    server: stor01
  accessModes: ["ReadWriteOnce"]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
  labels:
    name: pv003
spec:
  nfs:
    path: /data/volumes/v3
    server: stor01
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv004
  labels:
    name: pv004
spec:
  nfs:
    path: /data/volumes/v4
    server: 192.168.80.114
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 4Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv005
  labels:
    name: pv005
spec:
  nfs:
    path: /data/volumes/v5
    server: 192.168.80.114
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 5Gi
                                                                                                                                                        
"pv-demo.yaml" [New] 69L, 1165C written
[root@k8s-master volumes]# kubectl apply -f pv-demo.yaml 
persistentvolume/pv001 created
persistentvolume/pv002 created
persistentvolume/pv003 created
persistentvolume/pv004 created
persistentvolume/pv005 created
[root@k8s-master volumes]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
pv001     1Gi        RWO,RWX        Retain           Available                                      6s
pv002     2Gi        RWO            Retain           Available                                      6s
pv003     2Gi        RWO,RWX        Retain           Available                                      6s
pv004     4Gi        RWO,RWX        Retain           Available                                      5s
pv005     5Gi        RWO,RWX        Retain           Available                                      5s

##定义pvc
定义pvc的访问模式为多路读写,该访问模式必须在前面pv定义的访问模式之中。定义PVC申请的大小为2Gi,此时PVC会自动去匹配多路读写且大小为2Gi的PV
[root@k8s-master volumes]# vim pvc-demo.yaml 
      storage: 2Gi
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
  namespace: default
spec:
  accessModes: ["ReadWriteMany"]
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:
   name: pod-pvs
   namespace: default
   labels:
     app: ngx

spec:
   containers:
   - name: ngxapp
     image: 192.168.80.146:5000/my_ngx:v1
     imagePullPolicy: IfNotPresent
     volumeMounts:
     - name: html
       mountPath: /usr/share/nginx/html/

   volumes:
   - name: html
     persistentVolumeClaim:
        claimName: mypvc
~                                                                                                                                                           
"pvc-demo.yaml" 32L, 553C written 
[root@k8s-master volumes]# kubectl apply -f pvc-demo.yaml  
persistentvolumeclaim/mypvc created
pod/pod-pvs created
[root@k8s-master volumes]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON    AGE
pv001     1Gi        RWO,RWX        Retain           Available                                            6m
pv002     2Gi        RWO            Retain           Available                                            6m
pv003     2Gi        RWO,RWX        Retain           Bound       default/mypvc                            6m
pv004     4Gi        RWO,RWX        Retain           Available                                            6m
pv005     5Gi        RWO,RWX        Retain           Available                                            6m
[root@k8s-master volumes]# kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mypvc     Bound     pv003     2Gi        RWO,RWX                       12s

マウントを確認します

[root@192-168-80-114 volumes]# echo "welcome to use pv3" > /data/volumes/v3/index.html
[root@k8s-master volumes]# kubectl get pods -o wide
NAME      READY     STATUS    RESTARTS   AGE       IP            NODE        NOMINATED NODE
pod-pvs   1/1       Running   0          2m        10.244.2.20   k8s-node1   <none>
[root@k8s-master volumes]# curl 10.244.2.20
welcome to use pv3

ときポッドの作成は確立された関係に応じて適切なPVのPVCを探します、その後、PVの記述は、ストレージ・システムをマウントします。既存のPVのPVCが要件を満たしていないときは、動的に、彼らは新しいコンセプトのStorageClassesを必要とする適切なPVを作成することができ、例えば、Kubernetesに利用できるストレージ容量の1TBの分割は時にユーザーのニーズ、ストレージ・システムで使用されますPVC 10Gは、要求が安らか経由ですぐに送信されますと、そう10G、10Gのストレージスペース作成したイメージは、後で私たちのクラスタ内で使用するためのマウントとして、現在のPVCにPV電源として定義されていること。当社のストレージシステムは、このようなCEPH分散ストレージとして、以前は、このインターフェイスに安らかなサポート、およびサードパーティのインターフェース、そのような要求を使用する必要がglusterfsなければなりません。

configmapと秘密
コンテナ設定モードにはいくつかのアプリケーションがあります。

  1. ときに開始容器、コマンド引数を介してパラメータを渡します[]
  2. 定義された設定ファイルは、ドッキングウィンドウCPをコピーすることによって、容器内に書かれています
  3. 環境変数を介してコンフィギュレーション・データを送信する
    アプリケーションのクラウドネイティブ型は、一般的に環境変数として使用することができ、
    非クラウドネイティブエントリポイントアプリケーションのスクリプトを使用してアプリケーションのクラスコンフィギュレーション・ファイルを修正する前処理。
  4. ドッカー転写ロールプロファイル取り付け
    及びこのような成分の存在は、システムKubernetesにおけるストレージボリュームの特別なタイプです。それはポッド収納スペースを提供していませんが、アプリケーションのクラスタへの外部からの設定メッセージを提供するために、管理者やユーザーは、内部ポッドを注入しました。特殊なストレージ・ボリュームのこれらの2つのタイプがあります。configMapと秘密。彼らは、キーと値のペアです。

ConfigMap:主としてポッドに非機密データを注入するために使用される、ユーザデータがオブジェクト間で直接ConfigMapに格納され、ボリュームの使用を参照次いでポッドConfigMapを使用して、コンテナが中央定義プロファイルを実装し、管理されています。ConfigMapは、全体のコンフィギュレーションファイルまたはJSONブロブを保存するために使用することができる単一の属性を保持するために使用することができます。

初出:

  1. --fromリテラルによって:--fromリテラルそれぞれが1つの情報エントリに対応します。
[root@k8s-master volumes]# kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=myapp.magedu.com
configmap/nginx-config created
[root@k8s-master volumes]# kubectl get cm
NAME           DATA      AGE
nginx-config   2         6s
[root@k8s-master volumes]# kubectl describe cm nginx-config
Name:         nginx-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
server_name:
----
myapp.magedu.com
nginx_port:
----
80
Events:  <none>
  1. 一つの情報のエントリに各ファイル対応の内容:--from-ファイルで。
[root@k8s-master configmap]# vim www.conf
server {
    server_name myapp.magedu.com;
    listen 80;
    root /data/web/html;
}
[root@k8s-master configmap]# kubectl create configmap nginx-www --from-file=./www.conf 
configmap/nginx-www created
[root@k8s-master configmap]# kubectl get cm
NAME           DATA      AGE
nginx-config   2         3m
nginx-www      1         4s
[root@k8s-master configmap]# kubectl get cm nginx-www -o yaml
apiVersion: v1
data:
  www.conf: "server {\n\tserver_name myapp.magedu.com;\n\tlisten 80;\n\troot /data/web/html;\n}\n"
kind: ConfigMap
metadata:
  creationTimestamp: 2018-10-10T08:50:06Z
  name: nginx-www
  namespace: default
  resourceVersion: "389929"
  selfLink: /api/v1/namespaces/default/configmaps/nginx-www
  uid: 7c3dfc35-cc69-11e8-801a-000c2972dc1f

ConfigMapはでポッドに注入
モード1:環境変数の送信(コンテナconfigmapを始める時にのみ成功すること)

[root@k8s-master volumes]# vim configmap-1.yaml 
apiVersion: v1
kind: Pod
metadata:
   name: pod-cm-1
   namespace: default
   labels:
     app: ngx
spec:
   containers:
   - name: ngxapp
     image: 192.168.80.146:5000/my_ngx:v1
     imagePullPolicy: IfNotPresent
     env:   ##定义容器中的环境变量
     - name: NGINX_SERVER_PORT   ##环境变量的名字
       valueFrom:   ##环境变量值的来源
          configMapKeyRef:   ##环境变量值的来源为configmap资源
             name: nginx-config  ##提供环境变量值的configmap名为
             key: nginx_port  ##从名为nginx-config的configmap中获取key为nginx_port的值作为环境变量NGINX_SERVER_PORT的值
     - name: NGINX_SERVER_NAME
▽      valueFrom:
          configMapKeyRef:
             name: nginx-config
             key: server_name
##验证
[root@k8s-master volumes]# kubectl apply -f configmap-1.yaml 
pod/pod-cm-1 created
[root@k8s-master volumes]# kubectl get pods
NAME       READY     STATUS    RESTARTS   AGE
pod-cm-1   1/1       Running   0          1m
pod-pvs    1/1       Running   0          52m
[root@k8s-master volumes]# kubectl exec -it pod-cm-1 /bin/sh
# echo $NGINX_SERVER_PORT
80
# echo $NGINX_SERVER_NAME
myapp.magedu.com

オプション2:コンテナのストレージ・ボリュームをマウントし、あなたがconfigmapリアルタイムに取得することができます。
ファイル内のファイルconfigmapのMOUNTPATHポッドの新しい名前でキーの名前では、ファイルの内容の値にキーをconfigmapします

[root@k8s-master volumes]# vim configmap-2.yaml 
apiVersion: v1
kind: Pod
metadata:
   name: pod-configmap2
   namespace: default
   labels:
     app: ngx

spec:
   containers:
   - name: ngxapp
     image: 192.168.80.146:5000/my_ngx:v1
     imagePullPolicy: IfNotPresent
     volumeMounts:
     - name: html
       mountPath: /usr/share/nginx/html/

   volumes:
   - name: html
     configMap:
        name: nginx-config
[root@k8s-master volumes]# kubectl get pod
NAME             READY     STATUS    RESTARTS   AGE
pod-cm-1         1/1       Running   0          19m
pod-configmap2   1/1       Running   0          46s
pod-pvs          1/1       Running   0          1h
[root@k8s-master volumes]# kubectl exec -it pod-configmap2  /bin/sh
# cat //usr/share/nginx/html/server_name
myapp.magedu.com# 
# cat /usr/share/nginx/html/nginx_port
80# 

[root@k8s-master volumes]# vim configmap-3.yaml 
apiVersion: v1
kind: Pod
metadata:
   name: pod-configmap3
   namespace: default
   labels:
     app: ngx

spec:
   containers:
   - name: ngxapp
     image: 192.168.80.146:5000/my_ngx:v1
     imagePullPolicy: IfNotPresent
     volumeMounts:
     - name: html
       mountPath: /usr/share/nginx/html/

   volumes:
   - name: html
     configMap:
        name: nginx-www
[root@k8s-master volumes]# kubectl get pod
NAME             READY     STATUS    RESTARTS   AGE
pod-cm-1         1/1       Running   0          19m
pod-configmap3   1/1       Running   0          46s
pod-pvs          1/1       Running   0          1h
[root@k8s-master volumes]# kubectl exec -it pod-configmap3  /bin/sh
# cd  /usr/share/nginx/html/
# cat www.conf
server {
    server_name myapp.magedu.com;
    listen 80;
    root /data/web/html;
}

シークレット:パスワード、秘密鍵、証明書およびその他の文書などポッド機密情報への転送のために、この情報はおそらくコンテナ内に定義されている場合は明らかにすることで、秘密のリソースは、ユーザーがポッドでマウントその後、不安な人にこの情報を保存することができます機密データやデカップリングの効果を実現。

Configmapの使用量と種類

公開された40元の記事 ウォンの賞賛2 ビュー2095

おすすめ

転載: blog.csdn.net/weixin_42155272/article/details/90380084