k8s笔记4

k8s的存储有很多种方式

**

configmap存储实践

**
1.使用指令在目录创建
指定在目录下的所有文件都会被用在ConfigMap里面创建一个键值对,键的名字就是文件名,值就是文件的内容
kubectl create configmap lqhcm1 --from-file=…/configmap/ -n space01
k8s笔记4_第1张图片
2.使用文件创建
kubectl create configmap lqhcm2 --from-file=…/configmap/file3.txt -n space01

k8s笔记4_第2张图片
3.使用字面新建
kubectl create configmap lqhcm3 --from-literal=key1=value1 --from-literal=key2=value2 -n space01
k8s笔记4_第3张图片
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

看效果
k8s笔记4_第4张图片

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 不会同步更新
k8s笔记4_第5张图片

Secret存储

和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存储(volume在k8s中不是一中资源,get不出来)

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

看效果:
k8s笔记4_第6张图片
**注意:**把这个deployment的pod删除了,node目录下的内容还在,deployment新建的pod也会同步到这个目录,删除这个deployment这个node的目录还在

PersistentVolumeClaim (PVC)存储

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)
k8s笔记4_第7张图片

进入k8所有节点node安装nfs的客户端,指令是:
yum install -y nfs-utils rpcbind

nfs指令showmount查看服务器目录
k8s笔记4_第8张图片
实践挂载指令:
mount -t nfs
k8s笔记4_第9张图片

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下

你可能感兴趣的:(linux,kubernetes,运维)