k8s存储

  • 只在节点本地使用 一旦pod删除 同时删除存储卷 emptyDir
  • hostPath 挂载宿主机路径
  • 网络存储 本地存储SAN ISCSI
       - NAS所支持的NFS
       - 分布式存储 glusterfs rbd cephfs等
       - 云存储
kubectl explain pods.spec.volumes 查看支持的所有卷

本地卷emptyDir使用

创建一个空卷,挂载到Pod中的容器。Pod删除该卷也会被删除。应用场景:Pod中容器之间数据共享

以下是pod容器中的定义

spec:
  containers:
     volumeMounts: 
     - name: data
        mountPath: /data   
  volumes:
    name: data
    empytDir: { }

本地卷hostPath

挂载Node文件系统上文件或者目录到Pod中的容器。应用场景:Pod中容器需要访问宿主机文件

以下是pod容器中的定义

spec:
  containers:
    volumemounts:
    - name: data
      mountPath: /data #容器挂载目录
  volumes:
  - name: data
    hostPath:
      path: /data/ #宿主机目录 
      type:DirectoryOrCreate #不存在自动创建 

网络卷nfs

安装nfs

每个节点都要安装nfs-utils
yum install -y nfs-utils

以下在nfs主机上执行

mkdir -pv /data/volumes
[root@node1 volumes]# cat /etc/exports
/data/volumes 192.168.57.0/24(rw,no_root_squash)
systemctl start nfs
netstat -utnalp  grep 2049

下面是pod容器中的定义

spec:
  containers:
    volumemounts:
    - name: data
      mountPath: /data
  volumes: 
  - name: data
    nfs: 
      path: /data/volumes 指定nfs挂载路径
      server: node1 指定nfs服务器地址 

PersistentVolume

   PersistentVolume(持久卷,简称PV)是集群内,由管理员提供的网络存储的一部分。就像集群中的节点一样,PV也是集群中的一种资源。它也像Volume一样,是一种volume插件,但是它的生命周期却是和使用它的Pod相互独立的。PV这个API对象,捕获了诸如NFS、ISCSI、或其他云存储系统的实现细节。

   PersistentVolumeClaim(持久卷声明,简称PVC)是用户的一种存储请求。它和Pod类似,Pod消耗Node资源,而PVC消耗PV资源。Pod能够请求特定的资源(如CPU和内存)。PVC能够请求指定的大小和访问的模式(可以被映射为一次读写或者多次只读)。PVC允许用户消耗抽象的存储资源,用户也经常需要各种属性(如性能)的PV。集群管理员需要提供各种各样、不同大小、不同访问模式的PV,而不用向用户暴露这些volume如何实现的细节。因为这种需求,就催生出一种StorageClass资源。

   StorageClass提供了一种方式,使得管理员能够描述他提供的存储的等级。集群管理员可以将不同的等级映射到不同的服务等级、不同的后端策略。

重新设置以下nfs

[root@node1 volumes]# vim /etc/exports
[root@node1 volumes]# exportfs -arv
exporting 192.168.57.0/24:/data/volumes/v5
exporting 192.168.57.0/24:/data/volumes/v4
exporting 192.168.57.0/24:/data/volumes/v3
exporting 192.168.57.0/24:/data/volumes/v2
exporting 192.168.57.0/24:/data/volumes/v1
[root@node1 volumes]# showmount -e
Export list for node1:
/data/volumes/v5 192.168.57.0/24
/data/volumes/v4 192.168.57.0/24
/data/volumes/v3 192.168.57.0/24
/data/volumes/v2 192.168.57.0/24
/data/volumes/v1 192.168.57.0/24

创建一个pv

[root@node1 volumes]# cat pv-demo.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
  labels:
    name: pv001
spec:
  #指定后端使用的是nfs,可以用其他存储
  nfs:
    path: /data/volumes/v1
    server: node1
#读写方式
  accessModes:
  - ReadWriteMany
  - ReadWriteOnce
  capacity:
    storage: 5Gi

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
  labels:
    name: pv002
spec:
   nfs:
     path: /data/volumes/v2
     server: node1
  accessModes:
  - ReadWriteMany
  - ReadWriteOnce
  capacity:
    storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
  labels:
    name: pv003
spec:
  nfs:
    path: /data/volumes/v3
    server: node1
  accessModes:
  - ReadWriteMany
  - ReadWriteOnce
  capacity:
    storage: 5Gi

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv004
  labels:
    name: pv004
spec:
  nfs:
    path: /data/volumes/v4
    server: node1
  accessModes:
  - ReadWriteMany
  - ReadWriteOnce
  capacity:
    storage: 10Gi

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv005
  labels:
    name: pv005
spec:
  nfs:
    path: /data/volumes/v5
    server: node1
  accessModes:
  - ReadWriteMany
  - ReadWriteOnce
  capacity:
    storage: 10Gi

创建pvc

[root@node1 pv]# cat pvc-demo.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
  namespace: defult
spec:
  accessMode:
  - ReadWriteMany
  #绑定pv的条件 该pv空间需大于等于8Gi 如果有多个随机绑定一个
  resources:
    requests:
       storage: 8Gi

pod中要定义的地方

spec:
  containers:
    volumeMounts:
    - mountPath: /data
      name: data
  volumes:
  - name: data
    persistentVolumeClaim:
       claimName: mypvc   #使用上面创建的pvc

查看结果演示

[root@node1 volumes]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 5Gi RWO,RWX Retain Available 7m26s
pv002 5Gi RWO,RWX Retain Available 7m26s
pv003 5Gi RWO,RWX Retain Available 7m26s
pv004 10Gi RWO,RWX Retain Bound default/mypvc 7m26s
pv005 10Gi RWO,RWX Retain Available 7m26s
[root@node1 volumes]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mypvc Bound pv004 10Gi RWO,RWX 14s

configMap 配置

配置容器化应用的方式
1.自定义命令行参数
args: []
2.把配置文件hi街配进镜像
3.环境变量 entrypoint
4.存储卷

kubectl get cm 查看

创建一个configmap

[root@node1 pv]# cat nginx-config.yaml 
apiVersion: v1
kind: ConfigMap
metadata: 
  name: nginx-config
data:
  nginx_port: 80   这里是多个key:value键值对
  server_name: myapp.jcwit.com

以下是pod中定义

方式1 变量只会在容器启动生效 如修改configmap pod中变量不会改变,不推荐

spec:
 containers:
   env:
   - name: NGINX_SERVER_PORT 自定义变量名key value为configmap引用的key值的value
     valueFrom:
       configMapKeyRef:
          name: nginx-config 引用那个configmap
          key: nginx_port configmap的key

方式2 修改configmap后pod中变量会改变

spec:
  containers:
    volumeMounts:
    - name: nginxconf
      mountPath: /data
      readOnly: true
  volumes:
  - name: nginxconf
    configMap:
       name: nginx-config 引用那个configmap

进入容器 查看/data 可以发现变量文件

 挂载nginx配置文件

[root@node1 volumes]# cat www.conf 
server {
 server_name myapp.jcwit.com;
 listen 80;
 root /data/web/html;
}

创建cm

[root@node1 volumes]# kubectl create configmap nginx-www --from-file=www.conf 
configmap/nginx-www created

pod中定义

spec:
  containers:
  volumeMounts:
  - name: nginxconf 
    mountPath: /data 
    readOnly: true 
 volumes:
 - name: nginxconf 
   configMap:
     name: nginx-www 这里我们用nginx-www这个cm

进入容器查看

[root@node1 volumes]# kubectl exec -it pod-cm-3 -- /bin/bash
root@pod-cm-3:/# ls /data/
www.conf
root@pod-cm-3:/# cat /data/www.conf 
server {
 server_name myapp.jcwit.com;
 listen 80;
 root /data/web/html;
}
root@pod-cm-3:/# 

Secret配置

创建

[root@node1 volumes]# kubectl create secret generic mysql-root-password --from-literal=password=Myp@ss123
secret/mysql-root-password created

挂载使用变量挂载

[root@node1 volumes]# cat pod-secret-1.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-secret-1
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  env:
  - name: MYSQL_ROOT_PASSWORD
    valueFrom:
      secretKeyRef:    挂载方式  
        name: mysql-root-password      secret名称
        key: password                  secret中的变量

查看

[root@node1 volumes]# kubectl exec pod-secret-1 -- printenv grep "MYSQL_ROOT_PASSWORD"
MYSQL_ROOT_PASSWORD=Myp@ss123

第二种方式使用volumeMounts 挂载 和cm挂载方式一样


k8s存储
http://www.jcwit.com/article/111/
作者
Carlos
发布于
2019年5月8日
许可协议