k8s的存储有很多种方式
**
**
1.使用指令在目录创建
指定在目录下的所有文件都会被用在ConfigMap里面创建一个键值对,键的名字就是文件名,值就是文件的内容
kubectl create configmap lqhcm1 --from-file=…/configmap/ -n space01
2.使用文件创建
kubectl create configmap lqhcm2 --from-file=…/configmap/file3.txt -n space01
3.使用字面新建
kubectl create configmap lqhcm3 --from-literal=key1=value1 --from-literal=key2=value2 -n space01
4.configmap存的数据作为环境变量
课外知识点
第一种是利用 “sh -c” 命令,它可以让 bash 将一个字串作为完整的命令来执行,这样就可以将 sudo 的影响范围扩展到整条命令。具体用法如下:
$ sudo /bin/sh -c ‘echo “hello” >> a.txt’
新建一个pod(configmap-env-test)打印一下上面configMap的数据
apiVersion: v1
kind: Pod
metadata:
name: configmap-env-test #这个pod的名字
labels:
namespace: space01 #声明一个新的命名空间
spec:
containers:
- name: redis01 #容器名
image: redis #镜像名字
command: [ "/bin/sh", "-c", "env" ]
imagePullPolicy: IfNotPresent # 指定拉取镜像的策略,默认是Always,每次尝试拉去新的, IfNotPresent表示每本的的再去拉
env:
- name: env1
valueFrom:
configMapKeyRef:
name: lqhcm1
key: file1.txt
- name: env2
valueFrom:
configMapKeyRef:
name: lqhcm1
key: file2.txt
- name: nginx01 #容器名
image: nginx #镜像名字
command: [ "/bin/sh", "-c", "env" ]
imagePullPolicy: IfNotPresent
envFrom: #导入lqhcm3这个configmap所有的key-value
- configMapRef:
name: lqhcm3
restartPolicy: Never
5.configmap和容器挂载的结合
docker容器学习数据卷技术时是容器内部的目录和本机目录挂载,k8s里面不可能用node节点的目录和pod里面容器目录挂载,但是可以使用configmap和容器内部的目录挂载,一个目录对应一个configmap,这个configmap的key是该目录下文件名,value是文件内容,以后更改了config的内容相当于更改了容器内部的挂载文件内容,这就是配置上线
新建一个挂载了configmap的deployment
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: configmap-deployment-test #这个pod的名字
labels:
namespace: space01 #声明一个新的命名空间
spec:
replicas: 1
selector:
matchLabels:
cdtestk: cdtestv
template:
metadata:
labels:
cdtestk: cdtestv
spec:
volumes: #和containerst同级
- name: config-volume1
configMap:
name: lqhcm3 #configMap的名字
- name: config-volume2
configMap:
name: lqhcm2 #configMap的名字
containers:
- name: redis01 #容器名
image: redis #镜像名字
volumeMounts:
- name: config-volume1
mountPath: /etc/config #容器内挂载的目录
imagePullPolicy: IfNotPresent
- name: nginx01 #容器名
image: nginx #镜像名字
volumeMounts:
- name: config-volume2
mountPath: /etc/config #容器内挂载的目录
imagePullPolicy: IfNotPresent
看看更新config也会容器内部跟着改,稍微等一会,这就是热更新,但是k8s默认不会重启pod更新镜像
注意:使用该 ConfigMap 挂载的 Env 不会同步更新
和configMap没什么区别,也是key-value,只是这种类型存储的内容value是加密的,在读的时候会自动给你解密。这里就不实验了。secrete有三种类型
Service Account:用来访问Kubernetes API,由Kubernetes自动创建,且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中
Opaque:base64编码格式的Secret,用来存储密码、密钥kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息
volume技术是为了实现kubernetes Pod中多个容器访问的共享目录。volume被定义在pod上,他和pod的生命周期一样,只要pod还在他就在,但是pod里面的容器停止和重启时一般不会影响volume中的数据。
根据需不需要指定目录主要有emptyDir,hostPath两种
1.emptyDir类型
emptyDir类型的volume在pod分配到node上时被创建,不用指定目录,但是实际还是有的,由自动分配的
新建一个两个容器共享一个数据卷的deployment
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: emptydir-deployment-test #这个pod的名字
labels:
namespace: space01 #声明一个新的命名空间
spec:
replicas: 1
selector:
matchLabels:
edtestk: edtestv
template:
metadata:
labels:
edtestk: edtestv
spec:
volumes: #和containerst同级
- name: emptydir-volume
emptyDir: {}
containers:
- name: redis01 #容器名
image: redis #镜像名字
volumeMounts:
- name: emptydir-volume
mountPath: /lqh-empty-dir #容器内挂载的目录
imagePullPolicy: IfNotPresent
- name: nginx01 #容器名
image: nginx #镜像名字
volumeMounts:
- name: emptydir-volume
mountPath: /lqh-empty-dir #容器内挂载的目录
imagePullPolicy: IfNotPresent
看效果:
2.hostpath类型
需要制定本地node的目录,master节点新建Pod时如果本地没有这个目录会报错。这也是他的缺点,无法知道新建pod会被指派到哪个node,要所有node都要新建这个目录。
新建一个两个容器共享/nodepath这个目录的deployment,
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hostpath-deployment-test #这个pod的名字
labels:
namespace: space01 #声明一个新的命名空间
spec:
replicas: 1
selector:
matchLabels:
edtestk: edtestv
template:
metadata:
labels:
edtestk: edtestv
spec:
volumes: #和containerst同级
- name: hostpath-volume
hostPath:
path: /nodepath #确保node节点有这个目录,不然新建pod报错
type: Directory
containers:
- name: redis01 #容器名
image: redis #镜像名字
volumeMounts:
- name: hostpath-volume
mountPath: /lqh-hostpath #容器内挂载的目录
imagePullPolicy: IfNotPresent
- name: nginx01 #容器名
image: nginx #镜像名字
volumeMounts:
- name: hostpath-volume
mountPath: /lqh-hostpath #容器内挂载的目录
imagePullPolicy: IfNotPresent
看效果:
**注意:**把这个deployment的pod删除了,node目录下的内容还在,deployment新建的pod也会同步到这个目录,删除这个deployment这个node的目录还在
PVC实际就是实现可以把pod容器里面的目录挂载到其他集群以外的机器上
PV 是Volume 之类的卷插件,但具有独立于使用 PV 的 Pod 的生命周期。此 API 对象包含存储实现的细节,即 NFS、iSCSI 或特定于云供应商的存储系统。PersistentVolume 类型以插件形式实现。Kubernetes 目前支持很多插件类型,以nfs为例。
1.nfs挂载服务安装
在不是k8s节点的机器10.211.55.3上安装nfs服务器,指令如下:
yum install -y nfs-common nfs-utils rpcbind # nfs-common 是服务器,nfs-utils是客户端,
vim /etc/exports内容把挂载目录写进去:
cat /etc/exports
/root/nfs *(rw,no_root_squash,no_all_squash,sync)
进入k8所有节点node安装nfs的客户端,指令是:
yum install -y nfs-utils rpcbind
nfs指令showmount查看服务器目录
实践挂载指令:
mount -t nfs
2.使用PVC实践Pod容器里面挂载其他机器的目录实验:
把pod删除了信息还是存在nfs服务器,新起来的pod一样挂载在这个目录
方式一:nfs挂载信息直接写在deployment模板:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nfspvs1-deployment-test #这个pod的名字
labels:
namespace: space01 #声明一个新的命名空间
spec:
replicas: 1
selector:
matchLabels:
nfspvs1k: nfspvs1v
template:
metadata:
labels:
nfspvs1k: nfspvs1v
spec:
volumes: #和containerst同级
- name: nfs-pvc1
nfs:
server: 10.211.55.3 #nfs服务器
path: /root/nfs
containers:
- name: redis01 #容器名
image: redis #镜像名字
volumeMounts:
- name: nfs-pvc1
mountPath: /lqh-nfspvs1 #容器内挂载的目录
imagePullPolicy: IfNotPresent
- name: nginx01 #容器名
image: nginx #镜像名字
volumeMounts:
- name: nfs-pvc1
mountPath: /lqh-nfspvs1 #容器内挂载的目录
imagePullPolicy: IfNotPresent
看效果:
方式二:新建多个pv,pvc,pod资源清单指定pvc,由pvc给pod匹配合适的pv挂载到pod的容器中,这种很解耦;
pvc在匹配的规则有:accessModes和storageClassName;pv的这两个属性和pod资源清单相同就可以被匹配挂载.
pv状态:
卷可以处于以下的某种状态:
Available(可用)——一块空闲资源还没有被任何声明绑定
Bound(已绑定)——卷已经被声明绑定
Released(已释放)——声明被删除,但是资源还未被集群重新声明
Failed(失败)——该卷的自动回收失败
新建三个pv的资源清单:
注意:pvc和pv的accessModes和storageClassName一定要保持一致,这两个还是必填,不一致pvc新建会报找不到pv
apiVersion: v1
kind: PersistentVolume #k8s资源类型,PersistentVolume资源
metadata: #资源的元数据语句块,是针对kind对应资源的全局属性
name: pv001 #自定义名称pv001
namespace: space01
spec: #规格语句块
capacity: #PV的存储空间语句块
storage: 10M #PV的具体存储空间大小,Mi表示1024进制
volumeMode: Filesystem #卷模式,有两种,Filesystem(文件系统),Block(块)
accessModes: ["ReadWriteOnce"] #访问模式,有三种,ReadWriteOnce(该卷可以被单个节点以读/写模式挂载),ReadOnlyMany,ReadWriteMany
persistentVolumeReclaimPolicy: Retain #回收策略,有三种,Retain,Recycle,Delete
storageClassName: "lqhnfs"
nfs: #NFS文件系统配置语句块
path: /root/nfs #在NFS文件系统上创建的共享文件目录
server: 10.211.55.3
---
apiVersion: v1
kind: PersistentVolume #k8s资源类型,PersistentVolume资源
metadata: #资源的元数据语句块,是针对kind对应资源的全局属性
name: pv002 #自定义名称pv001
namespace: space01
spec: #规格语句块
capacity: #PV的存储空间语句块
storage: 10M #PV的具体存储空间大小,Mi表示1024进制
volumeMode: Filesystem #卷模式,有两种,Filesystem(文件系统),Block(块)
accessModes: ["ReadWriteOnce"] #访问模式,有三种,ReadWriteOnce(该卷可以被单个节点以读/写模式挂载),ReadOnlyMany,ReadWriteMany
persistentVolumeReclaimPolicy: Retain #回收策略,有三种,Retain,Recycle,Delete
storageClassName: "lqhnfs"
nfs: #NFS文件系统配置语句块
path: /root/nfs #在NFS文件系统上创建的共享文件目录
server: 10.211.55.3
---
apiVersion: v1
kind: PersistentVolume #k8s资源类型,PersistentVolume资源
metadata: #资源的元数据语句块,是针对kind对应资源的全局属性
name: pv003 #自定义名称pv001
namespace: space01
spec: #规格语句块
capacity: #PV的存储空间语句块
storage: 10M #PV的具体存储空间大小,Mi表示1024进制
volumeMode: Filesystem #卷模式,有两种,Filesystem(文件系统),Block(块)
accessModes: ["ReadWriteOnce"] #访问模式,有三种,ReadWriteOnce(该卷可以被单个节点以读/写模式挂载),ReadOnlyMany,ReadWriteMany
persistentVolumeReclaimPolicy: Retain #回收策略,有三种,Retain,Recycle,Delete
storageClassName: "lqhnfs"
nfs: #NFS文件系统配置语句块
path: /root/nfs/v3 #在NFS文件系统上创建的共享文件目录
server: 10.211.55.3
新建pvc的资源清单
apiVersion: v1 #指定的api版本,要符合kubectl apiVersion规定,v1是稳定版本
kind: PersistentVolumeClaim #k8s资源类型,PersistentVolumeClaim资源,
metadata: #资源的元数据语句块,是针对kind对应资源的全局属性元数据块
name: lqh-pvc1 #PVC名称,自定义
namespace: space01
spec: #规格语句块
accessModes: ["ReadWriteOnce"] #访问模式
resources: #访问模式下的资源语句块
requests: #请求语句块
storage: 25Mi #请求存储空间
storageClassName: "lqhnfs"
新建挂载pvc的pod资源清单
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: pvc-deployment-test #这个pod的名字
labels:
namespace: space01 #声明一个新的命名空间
spec:
replicas: 1
selector:
matchLabels:
pvc1k: pvc1v
template:
metadata:
labels:
pvc1k: pvc1v
spec:
volumes: #和containerst同级
- name: pvc1 #这个pod的数据卷名字
persistentVolumeClaim: #指定pvc
claimName: lqh-pvc1 #pvc名字
containers:
- name: redis01 #容器名
image: redis #镜像名字
volumeMounts:
- name: pvc1
mountPath: /lqh-nfspvs1 #容器内挂载的目录
imagePullPolicy: IfNotPresent
- name: nginx01 #容器名
image: nginx #镜像名字
volumeMounts:
- name: pvc1
mountPath: /usr/share/nginx/html/ #容器内挂载的目录
imagePullPolicy: IfNotPresent
对这个deployment进行扩容后的pod还是按照资源清单绑定到这个lqh-pvc1这个pvc,这个pvc只绑定这个pv001这个pv,不会变,所有就多个pod绑在一个pv下