k8s存储卷

1.emptyDir存储卷

apiVersion: v1
kind: Pod
metadata:
  name: cunchujuan
spec:
  containers:
  - name: myapp
  #定义第一容器用于显示index.html文件内容
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    volumeMounts:
    #调用存储卷
    - name: html
     #使用存储卷的名称要和下面定义的一样
      mountPath: /usr/share/nginx/html/
     #在容器内部挂载的路径
  - name: busybox
  #定义第二个容器用于产生index.html内容
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: html
      mountPath: /data/
    command: [‘/bin/sh‘,‘-c‘,‘while true;do echo $(date) >> /data/index.html;sleep 2;done‘]
    #该命令会不停向,存储卷的index.html文件追加时间
  volumes:
  #定义存储卷
  - name: html
  #定义存储卷名称
    emptyDir: {}
    #定义存储卷类型


在上面,我们定义了2个容器,其中第二个容器是输入日期到存储卷的index.html当中,因为两个容器都是挂载的同一个存储卷,所以第一个容器的index.html是和第二个共享的,不停curl 能看见index.html在不停的增长

2.hostPath存储卷

apiVersion: v1
kind: Pod
metadata:
  name: cs-hostpath
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: html
    hostPath:
        #存储卷类型为 hostPath
      path: /data/hostpath
            #实际node节点上的路径
      type: DirectoryOrCreate


先看下调度到那个node的节点上,这边调度到cs27节点上了
mkdir /data/hostpath/ -pv #在cs27节点上创建 hostpath的存储卷文件夹
echo "hostpath存储卷测试" >/data/hostpath/index.html #在存储卷里生成一个主页文件

curl 访问一下,能看到文件内容就是上面我们生成的
注意这边容器在里面修改了数据,是会同步到hostpath 的存储卷的就和挂载一样

3.nfs共享存储卷

再找一台主机充当nfs server
mkdir data #创建nfs文件夹
echo "nfs测试">index.html #创建测试html文件
yum install -y nfs-utils #安装nfs 软件
vim /etc/exports #修改nfs配置文件
/data/ 192.168.0.0/24(rw,no_root_squash)
#配置文件 路径加共享对方的网段

每个node节点也要安装 yum install -y nfs-utils ,否则无法没挂载驱动

#在node的节点运行showmount -e 50.1.1.111 看看有没有挂载权限
kubectl apply -f nfs.yaml #载入容器资源

查看下ip ,curl 访问一下看是不是之前在nfs server上创建的html的测试文件

4.NFS使用PV和PVC

4.1 pv定义方式介绍

[[email protected] ~]# kubectl explain pv    #查看pv的定义方式
FIELDS:
    apiVersion
    kind
    metadata
    spec
[[email protected] ~]# kubectl explain pv.spec    #查看pv定义的规格
spec:
  nfs(定义存储类型)
    path(定义挂载卷路径)
    server(定义服务器名称)
  accessModes(定义访问模型,有以下三种访问模型,以列表的方式存在,也就是说可以定义多个访问模式)
    ReadWriteOnce(RWO)  单节点读写
    ReadOnlyMany(ROX)  多节点只读
    ReadWriteMany(RWX)  多节点读写
  capacity(定义PV空间的大小)
    storage(指定大小)

[[email protected] volumes]# kubectl explain pvc   #查看PVC的定义方式
KIND:     PersistentVolumeClaim
VERSION:  v1
FIELDS:
   apiVersion   <string>
   kind <string>
   metadata <Object>
   spec <Object>
[[email protected] volumes]# kubectl explain pvc.spec
spec:
  accessModes(定义访问模式,必须是PV的访问模式的子集)
  resources(定义申请资源的大小)
    requests:
      storage: 

4.2配置nfs 存储

mkdir v{1,2,3,}
vim /etc/exports
/data/v1 192.168.0.0/24(rw,no_root_squash)
/data/v2 192.168.0.0/24(rw,no_root_squash)
/data/v3 192.168.0.0/24(rw,no_root_squash)

4.3定义3个pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
  labels:
    name: pv001
spec:
  nfs:
    path: /data/v1
    server: 50.1.1.111
  accessModes: ["ReadWriteMany","ReadWriteOnce",]
  capacity:
    storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
  labels:
    name: pv002
spec:
  nfs:
    path: /data/v2
    server: 50.1.1.111
  accessModes: ["ReadWriteMany","ReadWriteOnce",]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
  labels:
    name: pv003
spec:
  nfs:
    path: /data/v3
    server: 50.1.1.111
  accessModes: ["ReadWriteMany","ReadWriteOnce",]
  capacity:
    storage: 5Gi

4.4 创建pvc

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
  #name ,给下面调用的
spec:
  accessModes: ["ReadWriteMany"]
  #声明访问类型,只能匹配到,pv包含的
  resources:
    requests:
      storage: 3Gi
      #声明需要3GB的空间,只能匹配3GB及意思的PV
---
apiVersion: v1
kind: Pod
metadata:
  name: cs-hostpath
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: html
    persistentVolumeClaim:
    #挂载存储卷类型为 pvc
      claimName: mypvc
      #指定PVC的name为 "mypvc"

配置容器应用:Secret和configMap

Secret:用于向Pod传递敏感信息,比如密码,私钥,证书文件等,这些信息如果在容器中定义容易泄露,Secret资源可以让用户将这些信息存储在急群众,然后通过Pod进行挂载,实现敏感数据和系统解耦的效果。
ConfigMap:主要用于向Pod注入非敏感数据,使用时,用户将数据直接存储在ConfigMap对象当中,然后Pod通过使用ConfigMap卷进行引用,实现容器的配置文件集中定义和管理。

通过 --from-literal 创建

kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123456
#创建一个Secret namae为 mysecret 

通过 --from-file创建
每个文件内容对应一个信息条目。

[[email protected] ~]# echo "admin" >username
[[email protected] ~]# echo "123456" >password
kubectl create secret generic mysecret2 --from-file=username --from-file=password

通过 --from-env-file创建
文件 env.txt 中每行 Key=Value 对应一个信息条目。

[[email protected] ~]# cat << EOF > env.txt
> username=admin
> password=12345
> EOF
kubectl create secret generic mysecret3 --from-env-file=env.txt

通过 YAML 配置文件:

先用base64 命令对密码等保密的数据完成转码

vim secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysecretyaml
data:
  username: YWRtaW4K
  password: MTIzNDU2Cg==
    #键值

查看



#反解码

使用secret

apiVersion: v1
kind: Pod
metadata:
  name: pod-secret
spec:
  containers:
  - name: pod-secret
    image: nginx
    volumeMounts:
    - name: foo
      #挂载那个存储卷
      mountPath: "/etc/foo"
      #pod 挂载的路径
  volumes:
  - name: foo
    #创建存储卷,name,用于被pod 调用
    secret:
    #存储卷类型
      secretName: mysecret
      #用那个文件


exec 进入容器 cd 到/etc/foo 能看到我们创建mysecret的key 及value

重定向数据

apiVersion: v1
kind: Pod
metadata:
  name: pod-secret
spec:
  containers:
  - name: pod-secret
    image: nginx
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
  volumes:
  - name: foo
    secret:
      secretName: mysecret
      items:
      #自定义存放路径及文件名
      - key: username
        path: 233/name
        #重定向路径及文件名(key),注意路径要写相对路径
      - key: password
        path: 233/pass


这时候数据都被重定向到"/etc/foo/233" 文件夹里了

使用这种方式 Secret 还支持动态更新:Secret 更新后,容器中的数据也会更新。
vim secret.yaml


kubectl apply -f secret.yaml

登录进去查看,name 的 value已经发生了变化

环境变量传递 key

apiVersion: v1
kind: Pod
metadata:
  name: pod-secret
spec:
  containers:
  - name: pod-secret
    image: nginx
    env:
      - name: username
        #传递到容器内部的环境变量
        valueFrom:
          secretKeyRef:
            name: mysecret
            #使用那个secret
            key: username
            #使用那个key
      - name: password
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password


exec 登录进去 echo 环境变量

通过环境变量 SECRET_USERNAME 和 SECRET_PASSWORD 成功读取到 Secret 的数据。
需要注意的是,环境变量读取 Secret 很方便,但无法支撑 Secret 动态更新。
Secret 可以为 Pod 提供密码、Token、私钥等敏感数据;对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap。

configmap 以上添加都支持就不一一举例了
configmap 来个实例
vim www.conf #创建nging 配置文件

server {
    server_name www.233.com;
    listen 8860;
    root /data/web/html;
}

kubectl create configmap configmap-cs --from-file=www.conf
#创建一个name为"configmap-cs" configmap资源,内容就是之前创建的www.conf
vim nginx-configmap #创建pod

 apiVersion: v1
kind: Pod
metadata:
  name: pod-secret
spec:
  containers:
  - name: pod-secret
    image: nginx
    volumeMounts:
    - name: nginxconf
      #调用名为"nginxconf"的存储卷
      mountPath: /etc/nginx/conf.d/
  volumes:
  - name: nginxconf
    #创建存储卷
    configMap:
    #存储卷类型为configMap
      name: configmap-cs
      #使用configmap里面的"configmap-cs"这个资源

kubectl apply -f nginx-configmap.yaml #载入启动

查看IP 访问我刚才定义的资端口,能正常访问说明配置文件生效了。

登录进去查看文件

kubectl edit configmaps configmap-cs
#命令修改资源,使用方法和vim 一样使用
POD挂载过程

 POD先挂载名为"nginxconf"的存储卷
 "nginxconf"的存储卷的内容是调用configMap资源里 "configmap-cs"这个资源生成的
 "configmap-cs" 这个资源是读取www.conf 文件生成的

原文地址:https://blog.51cto.com/13620944/2462121

时间: 2024-10-08 02:39:47

k8s存储卷的相关文章

k8s存储卷mysql故障转移

yum install -y rpcbind nfs-utils创建共享目录mkdir /home/sharedir修改目录权限chmod 0755 -R sharedir修改NFS配置文件vi /etc/exports/home/sharedir 192.168.2.0(rw,no_root_squash,no_all_squash,sync) ----------------------------yum install -y nfs-utilsshowmount -e 192.168.2.

k8s之存储卷及pvc

1.存储卷概述 因为pod是有生命周期的,pod一重启,里面的数据就没了,所以我们需要数据持久化存储,在k8s中,存储卷不属于容器,而是属于pod,也就是说同一个pod中的容器可以共享一个存储卷,存储卷可以是宿主机上的目录,也可以是挂载在宿主机上的外部设备. 存储卷类型: emptyDIR存储卷:pod一重启,存储卷也删除,这叫emptyDir存储卷,一般用于当做临时空间或缓存关系; hostPath存储卷:宿主机上目录作为存储卷,这种也不是真正意义实现了数据持久性; SAN(iscsi)或NA

k8s实践(七):存储卷和数据持久化(Volumes and Persistent Storage)

环境说明: 主机名 操作系统版本 ip docker version kubelet version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 2C2G master主机 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 2C2G node节点 node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.

(转)原理到实现 | K8S 存储之 NFS

转:https://mp.weixin.qq.com/s/Mrr1Rnl_594Gyyn9fHekjw 1NFS介绍 NFS是Network File System的简写,即网络文件系统,NFS是FreeBSD支持的文件系统中的一种.NFS基于RPC(Remote Procedure Call)远程过程调用实现,其允许一个系统在网络上与它人共享目录和文件.通过使用NFS,用户和程序就可以像访问本地文件一样访问远端系统上的文件.NFS是一个非常稳定的,可移植的网络文件系统.具备可扩展和高性能等特性

Kubernetes学习之路(十六)之存储卷

一.存储卷的概念和类型 为了保证数据的持久性,必须保证数据在外部存储在docker容器中,为了实现数据的持久性存储,在宿主机和容器内做映射,可以保证在容器的生命周期结束,数据依旧可以实现持久性存储.但是在k8s中,由于pod分布在各个不同的节点之上,并不能实现不同节点之间持久性数据的共享,并且,在节点故障时,可能会导致数据的永久性丢失.为此,k8s就引入了外部存储卷的功能. k8s的存储卷类型: [[email protected] ~]# kubectl explain pod.spec.vo

Kubernetes之(十二)存储卷

目录 Kubernetes之(十二)存储卷 简介 emptyDir存储卷 hostPath存储卷 nfs共享存储卷 PV和PVC NFS使用PV和PVC 配置NFS存储 定义PV 定义PVC 查看验证 测试访问 StorageClass Kubernetes之(十二)存储卷 简介 为了保证数据的持久性,必须保证数据在外部存储在docker容器中,为了实现数据的持久性存储,在宿主机和容器内做映射,可以保证在容器的生命周期结束,数据依旧可以实现持久性存储.但是在k8s中,由于pod分布在各个不同的节

Kubernetes 学习12 kubernetes 存储卷

一.概述 1.我们此前讲过根据应用本身是否需要持久存储数据以及某一次请求和之前的请求是否有联系,可以分为四类应用 a.有状态,要存储 b.有状态,无持久存储 c.无状态,要存储 d.无状态,无持久存储 其中,大多数和数据存储服务相关的应用和有状态应用几乎都是需要持久存储数据的.在docker中说过,容器有生命周期,为了使容器将来终结以后可以把其删除,甚至是编排到其它节点上去运行,意味着我们数据不能放在容器本地,不能放在容器自己的名称空间中.注意这是两套逻辑,以k8s为例,pod运行时应该是运行在

12.存储卷

重点: pv pvc configMap secret 1.emptyDir 只在节点本地使用,pod一删除,存储卷也就删除,临时目录,可以当缓存空间使用,无持久性,生命周期与pod一样 存储卷是可以在一个pod中的各个容器中共享. 2.gitRepo 本质上也是一个emptyDir 不会去实时同步git仓库更新,但是也可以通过一个辅助的容器去定时同步 3.hostPath 存储在宿主机上,对于集群来讲它也无持久性,如果pod被删除,新建的pod如果是在其他的node上创建,那么会访问不到之前的

存储卷

前言 默认情况下容器的数据都是非持久化的, 在容器消亡以后数据也跟着丢失, 所以 Docker 提供了 Volume 机制以便将数据持久化存储. 类似的, Kubernetes 提供了更强大的 Volume 机制和丰富的插件, 解决了容器数据持久化和容器间共享数据的问题. 与 Docker 不同, Kubernetes Volume 的生命周期与 Pod 绑定容器挂掉后 Kubelet 再次重启容器时, Volume 的数据依然还在而 Pod 删除时, Volume 才会清理. 数据是否丢失取决