ストレージボリュームは、ポッド属し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と秘密
コンテナ設定モードにはいくつかのアプリケーションがあります。
- ときに開始容器、コマンド引数を介してパラメータを渡します[]
- 定義された設定ファイルは、ドッキングウィンドウCPをコピーすることによって、容器内に書かれています
- 環境変数を介してコンフィギュレーション・データを送信する
アプリケーションのクラウドネイティブ型は、一般的に環境変数として使用することができ、
非クラウドネイティブエントリポイントアプリケーションのスクリプトを使用してアプリケーションのクラスコンフィギュレーション・ファイルを修正する前処理。 - ドッカー転写ロールプロファイル取り付け
及びこのような成分の存在は、システムKubernetesにおけるストレージボリュームの特別なタイプです。それはポッド収納スペースを提供していませんが、アプリケーションのクラスタへの外部からの設定メッセージを提供するために、管理者やユーザーは、内部ポッドを注入しました。特殊なストレージ・ボリュームのこれらの2つのタイプがあります。configMapと秘密。彼らは、キーと値のペアです。
ConfigMap:主としてポッドに非機密データを注入するために使用される、ユーザデータがオブジェクト間で直接ConfigMapに格納され、ボリュームの使用を参照次いでポッドConfigMapを使用して、コンテナが中央定義プロファイルを実装し、管理されています。ConfigMapは、全体のコンフィギュレーションファイルまたはJSONブロブを保存するために使用することができる単一の属性を保持するために使用することができます。
初出:
- --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>
- 一つの情報のエントリに各ファイル対応の内容:--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の使用量と種類