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-utilsyum 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挂载方式一样