kubernetes的存储卷

序言

kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

创新互联公司是一家专注于成都网站设计、成都网站制作与策划设计,江安网站建设哪家好?创新互联公司做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:江安等地区。江安做网站价格咨询:18980820575

k8s支持类似地存储卷功能,不过,其存储卷是与pod资源绑定而非容器。简单来说,存储卷是定义在pod资源之上、可被其内部的所有容器挂载的共享目录,它关联至某外部的存储设备之上的存储空间,从而独立于容器自身的文件系统,而数据是否具有持久能力则取决于存储卷自身是否支持持久机制。

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: {}
    #定义存储卷类型

kubernetes的存储卷
在上面,我们定义了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

kubernetes的存储卷
先看下调度到那个node的节点上,这边调度到cs27节点上了
mkdir /data/hostpath/ -pv    #在cs27节点上创建 hostpath的存储卷文件夹
echo "hostpath存储卷测试" >/data/hostpath/index.html #在存储卷里生成一个主页文件
kubernetes的存储卷
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 ,否则无法没挂载驱动
kubernetes的存储卷
#在node的节点运行showmount -e 50.1.1.111 看看有没有挂载权限
kubectl apply -f nfs.yaml #载入容器资源
kubernetes的存储卷
查看下ip ,curl 访问一下看是不是之前在nfs server上创建的html的测试文件

4.NFS使用PV和PVC

4.1 pv定义方式介绍

[root@k8s-master ~]# kubectl explain pv    #查看pv的定义方式
FIELDS:
    apiVersion
    kind
    metadata
    spec
[root@k8s-master ~]# kubectl explain pv.spec    #查看pv定义的规格
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   
   kind   
   metadata 
   spec 
[root@k8s-master 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创建
每个文件内容对应一个信息条目。

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

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

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

通过 YAML 配置文件:
kubernetes的存储卷
先用base64 命令对密码等保密的数据完成转码

vim secret.yaml

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

查看
kubernetes的存储卷
kubernetes的存储卷
kubernetes的存储卷

kubernetes的存储卷
#反解码

使用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
      #用那个文件

kubernetes的存储卷
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

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

使用这种方式 Secret 还支持动态更新:Secret 更新后,容器中的数据也会更新。
vim secret.yaml
kubernetes的存储卷
kubernetes的存储卷
kubectl apply -f secret.yaml
kubernetes的存储卷
登录进去查看,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

kubernetes的存储卷
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  #载入启动
kubernetes的存储卷
查看IP 访问我刚才定义的资端口,能正常访问说明配置文件生效了。
kubernetes的存储卷
登录进去查看文件

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

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

新闻标题:kubernetes的存储卷
文章网址:http://hbruida.cn/article/gjopci.html