一、ConfigMap

1、概念

     ConfigMap的功能在k8s1.2版本中引入的,许多应用程序会从配置文件,命令行参数或环境变量中读取配置信息。ConfigMap API会给我们提供了向容器中注入配置信息的机制,ConigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制的对象

2、ConfigMap的创建

     1)使用文件夹创建(--from-file:键的名字是文件的名字,值是文件的内容)[root@k8s-master1 configmap]# cat web01enemies=aliceslives=3enemies.cheat.level=nogoodrotten[root@k8s-master1 configmap]# cat web02color.good=purplecolor.bad=yellowallow.textmode=true[root@k8s-master1 configmap]# lsweb01  web02[root@k8s-master1 ~]# kubectl create configmap web-config --from-file=/root/configmap/[root@k8s-master1 ~]# kubectl get cmNAME         DATA   AGEweb-config   2      92s[root@k8s-master1 ~]# kubectl describe cm web-configName:         web-configNamespace:    defaultLabels:       <none>Annotations:  <none>Data====web01:----enemies=aliceslives=3enemies.cheat.level=nogoodrottenweb02:----color.good=purplecolor.bad=yellowallow.textmode=trueEvents:  <none>[root@k8s-master1 ~]# kubectl get cm web-config -o yamlapiVersion: v1data:web01: |enemies=aliceslives=3enemies.cheat.level=nogoodrottenweb02: |color.good=purplecolor.bad=yellowallow.textmode=truekind: ConfigMapmetadata:creationTimestamp: "2020-05-06T17:51:56Z"name: web-confignamespace: defaultresourceVersion: "76065"selfLink: /api/v1/namespaces/default/configmaps/web-configuid: 8c047a9f-f31a-4ef6-bed9-45807872902e2)使用文件创建 [root@k8s-master1 ~]# kubectl create configmap web01-config --from-file=/root/configmap/web01[root@k8s-master1 ~]# kubectl describe cm web01-config Name:         web01-configNamespace:    defaultLabels:       <none>Annotations:  <none>Data====web01:----enemies=aliceslives=3enemies.cheat.level=nogoodrottenEvents:  <none>[root@k8s-master1 ~]# kubectl get cm web01-config -o yamlapiVersion: v1data:web01: |enemies=aliceslives=3enemies.cheat.level=nogoodrottenkind: ConfigMapmetadata:creationTimestamp: "2020-05-06T17:55:44Z"name: web01-confignamespace: defaultresourceVersion: "76400"selfLink: /api/v1/namespaces/default/configmaps/web01-configuid: ad405e87-f153-4209-bd11-7eafec4c8ec43)使用字面值创建[root@k8s-master1 ~]# kubectl create configmap mysql-config --from-literal=mysql.how=chaoyue --from-literal=mysql.type=mysql-mmm[root@k8s-master1 ~]# kubectl describe cm mysql-configName:         mysql-configNamespace:    defaultLabels:       <none>Annotations:  <none>Data====mysql.how:----chaoyuemysql.type:----mysql-mmmEvents:  <none>[root@k8s-master1 ~]# kubectl get cm mysql-config -o yamlapiVersion: v1data:mysql.how: chaoyuemysql.type: mysql-mmmkind: ConfigMapmetadata:creationTimestamp: "2020-05-06T18:01:58Z"name: mysql-confignamespace: defaultresourceVersion: "76949"selfLink: /api/v1/namespaces/default/configmaps/mysql-configuid: 3c85f0b3-0500-4192-a3fa-3f199e674b56

3、Pod中使用创建的ConfigMap

     1)使用ConfigMap代替环境变量[root@k8s-master1 configmap]# vim ./env-nginx.yaml (导入配置的两种方法,- name: MYSQL_HOW:必须使用下划线)apiVersion: v1kind: Podmetadata:name: nginxspec:containers:- name: nginximage: nginx:v1imagePullPolicy: IfNotPresentcommand: [ "bin/sh","-c","env"]env:- name: MYSQL_HOWvalueFrom:configMapKeyRef:name: mysql-configkey: mysql.how- name: MYSQL_TYPEvalueFrom:configMapKeyRef:name: mysql-configkey: mysql.typeenvFrom:- configMapRef:name: web-configrestartPolicy: Never[root@k8s-master1 ~]# kubectl log nginxlog is DEPRECATED and will be removed in a future version. Use logs instead.web01=enemies=aliceslives=3enemies.cheat.level=nogoodrottenweb02=color.good=purplecolor.bad=yellowallow.textmode=trueMYSQL_HOW=chaoyueMYSQL_TYPE=mysql-mmm2)用ConfigMap设置命令行参数[root@k8s-master1 ~]# vim configmap/env-nginx.yaml apiVersion: v1kind: Podmetadata:name: nginxspec:containers:- name: nginximage: nginx:v1imagePullPolicy: IfNotPresentcommand: [ "bin/sh","-c","echo $(MYSQL_HOW) $(MYSQL_TYPE)"]env:- name: MYSQL_HOWvalueFrom:configMapKeyRef:name: mysql-configkey: mysql.how- name: MYSQL_TYPEvalueFrom:configMapKeyRef:name: mysql-configkey: mysql.typerestartPolicy: Never[root@k8s-master1 ~]# kubectl log nginxlog is DEPRECATED and will be removed in a future version. Use logs instead.chaoyue mysql-mmm3)使用数据卷插件使用ConfigMap[root@k8s-master1 ~]# vim configmap/env-nginx.yaml apiVersion: v1kind: Podmetadata:name: nginxspec:containers:- name: nginximage: nginx:v1imagePullPolicy: IfNotPresentcommand: [ "bin/sh","-c","ls /etc/config/"]volumeMounts:- name: web-volumemountPath: /etc/configvolumes:- name: web-volumeconfigMap:name: web-configrestartPolicy: Never[root@k8s-master1 ~]# kubectl create -f configmap/env-nginx.yaml pod/nginx created[root@k8s-master1 ~]# kubectl log nginxlog is DEPRECATED and will be removed in a future version. Use logs instead.web01web02

4、ConfigMap的热更新

     [root@k8s-master1 ~]# vim configmap/env-nginx.yaml apiVersion: v1kind: Podmetadata:name: nginxspec:containers:- name: nginximage: nginx:v1imagePullPolicy: IfNotPresentvolumeMounts:- name: web-volumemountPath: /etc/configvolumes:- name: web-volumeconfigMap:name: web-config[root@k8s-master1 ~]# kubectl edit configmap web-config(aa=aa,bb=bb这两个实现添加的)# Please edit the object below. Lines beginning with a '#' will be ignored,# and an empty file will abort the edit. If an error occurs while saving this file will be# reopened with the relevant failures.#apiVersion: v1data:web01: |enemies=aliceslives=3enemies.cheat.level=nogoodrottenaa=aabb=bbweb02: |color.good=purplecolor.bad=yellowallow.textmode=truekind: ConfigMapmetadata:creationTimestamp: "2020-05-06T17:51:56Z"name: web-confignamespace: defaultresourceVersion: "88310"selfLink: /api/v1/namespaces/default/configmaps/web-configuid: 8c047a9f-f31a-4ef6-bed9-45807872902e[root@k8s-master1 ~]# kubectl exec nginx  -- cat /etc/config/web01enemies=aliceslives=3enemies.cheat.level=nogoodrottenaa=aabb=bb

二、Secret

1、secret存在的意义

     Secret存在意义Secret解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中.Secret可以以Volume或者环境变量的方式使用Secret有三种类型:1/)Service Account:用来访问Kubernetes API, 由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中2)Opaque:base64编码格式的Secret,用来存储密码、密钥等3)kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息

2、Service Account

     [root@k8s-master1 ~]# kubectl run nginx --image nginx[root@k8s-master1 ~]# kubectl get podNAME                    READY   STATUS    RESTARTS   AGEnginx-55fc968d9-d7bp9   1/1     Running   0          4s[root@k8s-master1 ~]# kubectl exec nginx-55fc968d9-d7bp9 -- ls /run/secrets/kubernetes.io/serviceaccountca.crtnamespacetoken

3、Opaque Secret

     1)加密[root@k8s-master1 ~]# echo -n "admin" | base64YWRtaW4=[root@k8s-master1 ~]# echo -n "pwd@123" | base64cHdkQDEyMw==2)解密[root@k8s-master1 ~]# echo -n "cHdkQDEyMw==" | base64 -dpwd@1233)创建secrets[root@k8s-master1 ~]# vim secrets.yamlapiVersion: v1kind: Secretmetadata:name: mysecrettype: Opaquedata:password: cHdkQDEyMw==username: YWRtaW4=[root@k8s-master1 ~]# kubectl create -f secrets.yaml [root@k8s-master1 ~]# kubectl get secretsNAME                  TYPE                                  DATA   AGEdefault-token-44kbr   kubernetes.io/service-account-token   3      18dmysecret              Opaque                                2      14s4)使用方法#将secret挂载到volume中[root@k8s-master1 ~]# vim nginx.yaml apiVersion: v1kind: Podmetadata:labels:app: nginxname: nginxspec:volumes:- name: secretssecret:secretName: mysecretcontainers:- image: nginximagePullPolicy: IfNotPresentname: nginx01volumeMounts:- name: secretsmountPath: '/test'readOnly: true[root@k8s-master1 ~]# kubectl create -f nginx.yaml [root@k8s-master1 ~]# kubectl exec nginx -- cat /test/passwordpwd@123[root@k8s-master1 ~]# kubectl exec nginx -- cat /test/usernameadmin#将Secret导出到环境变量中[root@k8s-master1 ~]# vim nginx.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentspec:replicas: 2selector:matchLabels:app: nginxstemplate:metadata:labels:app: nginxsspec:containers:- name: nginx-1image: nginximagePullPolicy: IfNotPresentports:- containerPort: 80env:- name: NGINX_USERvalueFrom:secretKeyRef:name: mysecretkey: username- name: NGINX_PASSWORDvalueFrom:secretKeyRef:name: mysecretkey: password[root@k8s-master1 ~]# kubectl apply -f nginx.yaml[root@k8s-master1 ~]# kubectl get secretNAME                  TYPE                                  DATA   AGEdefault-token-44kbr   kubernetes.io/service-account-token   3      19dmysecret              Opaque                                2      6m7s[root@k8s-master1 ~]# kubectl get podNAME                                READY   STATUS    RESTARTS   AGEnginx-deployment-649bd7d545-hr6hb   1/1     Running   0          5m52snginx-deployment-649bd7d545-wbsll   1/1     Running   0          5m52s[root@k8s-master1 ~]# kubectl exec -it nginx-deployment-649bd7d545-hr6hb /bin/bash(只能进入容器中查看)root@nginx-deployment-649bd7d545-hr6hb:/# echo $NGINX_USER    adminroot@nginx-deployment-649bd7d545-hr6hb:/# echo $NGINX_PASSWORDpwd@123

4、kubernetes.io/dockerconfigjson

     [root@k8s-master1 ~]# kubectl create secret docker-registry harbor --docker-server=hub.benet.com --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@example.com[root@k8s-master1 ~]# kubectl get secretNAME                  TYPE                                  DATA   AGEdefault-token-44kbr   kubernetes.io/service-account-token   3      19dharbor                kubernetes.io/dockerconfigjson        1      65s[root@k8s-master1 ~]# vim secrets.yaml apiVersion: v1kind: Podmetadata:name: tomcatspec:containers:- name: tomcatimage: hub.benet.com/xitong/tomcat:7.1imagePullSecrets:- name: harbor[root@k8s-master1 ~]# kubectl create -f secrets.yaml[root@k8s-master1 ~]# kubectl get podNAME     READY   STATUS              RESTARTS   AGEtomcat   0/1     ContainerCreating   0          23s[root@k8s-master1 ~]# kubectl get podNAME     READY   STATUS    RESTARTS   AGEtomcat   1/1     Running   0          31s

三、Volume

1、介绍

     容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题,首先,当容器崩渍时,kubelet会重启它,但是容器中的文件将丢失――容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes中的volume抽象就很好的解决了这些问题

2、背景

     Kubernetes中的卷有明确的寿命――与封装它的Pod相同,所以,卷的生命比Pod中的所有容器都长,当这个容器重启时数据仍然得以保存。当然,当Pod不再存在时,卷也将不复存在。也许更重要的是,Kubernetes支持多种类型的卷,Pod可以同时使用任意数量的卷

3、emptyDir

     当Pod被分配给节点时, 首先创建emptyDir卷,并且只要该Pod在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除Pod时,emptyDir中的数据将被永久删除emptyDir的使用方式:暂存空间,例如用于基于磁盘的合并排序用作长时间计算崩溃恢复时的检查点Web服务器容器提供数据时, 保存内容管理器容器提取的文件1)配置方式[root@k8s-master1 ~]# vim emrydir.yaml apiVersion: v1kind: Podmetadata:name: test-podspec:containers:- image: nginximagePullPolicy: IfNotPresentname: nginxvolumeMounts:- mountPath: /cachename: cache-volume- image: hub.benet.com/xitong/tomcat:7.1imagePullPolicy: IfNotPresentname: tomcatvolumeMounts:- mountPath: /cachename: cache-volumevolumes:- name: cache-volumeemptyDir: {}[root@k8s-master1 ~]# kubectl create -f emrydir.yaml [root@k8s-master1 ~]# kubectl get podNAME       READY   STATUS    RESTARTS   AGEtest-pod   2/2     Running   0          3s[root@k8s-master1 ~]# kubectl exec -it test-pod -c nginx /bin/bash(进入nginx容器)root@test-pod:/cache# date > test.txt(在nginx容器写入数据)[root@k8s-master1 ~]# kubectl exec -it test-pod -c tomcat /bin/bash(进入tomcat容器)[root@test-pod cache]# cat test.txt (在tomcat容器中查看写入的数据)Fri May  8 19:42:23 UTC 2020[root@test-pod cache]# date >> test.txt (在toncat中追加数据)root@test-pod:/cache# cat test.txt (在nginx中查看数据)Fri May  8 19:42:23 UTC 2020Sat May  9 03:43:23 CST 2020

4、hostPath

     1)hostPath:卷将主机节点的文件系统中的文件或目录挂载到集群中2)host Path的用途如下:*运行需要访问Docker内部的容器; 使用/var/lib/docker的hostPath*在容器中运行cAdvisor; 使用/dev/cgroups的host Path*允许pod指定给定的host Path是否应该在pod运行之前存在, 是否应该创建, 以及它应该以什么形式存在除了所需的path属性之外, 用户还可以为host Path卷指定type值                        行为空字符串(默认) 用于向后兼容, 这意味着在挂载hostPath卷之前不会执行任何检查。DirectoryOrCreate      如果在给定的路径上没有任何东西存在,那么将根据需要在那里创建一个空目录,权限设置为0755, 与Kube let具有相同的组和所有权。Directory               给定的路径下必须存在目录FileOrCreate            如果在给定的路径上没有任何东西存在,那么会根据需要创建一个空文件,权限设FileOrCreate置为0644, 与Kube let具有相同的组和所有权。File                   给定的路径下必须存在文件Socket                  给定的路径下必须存在UNIX套接字CharDevice                 给定的路径下必须存在字符设备BlockDevice           给定的路径下必须存在块设备使用这种卷类型是请注意,因为*由于每个节点上的文件都不同, 具有相同配置(例如从podTemplate创建的) 的pod在不同节点上的行为可能会有所不同*当Kubernetes按照计划添加资源感知调度时, 将无法考虑hostPath使用的资源*在底层主机上创建的文件或者目录只能由root写入,您需要在特权容器以root身份运行进程,或者修改主机上的文件权限以便写入hostpath卷3)用法(最好是指定pod在哪台node节点节点中运行)[root@k8s-node1 /]# mkdir data[root@k8s-master1 ~]# vim hostpath.yaml apiVersion: v1kind: Podmetadata:name: test-podspec:containers:- image: nginximagePullPolicy: IfNotPresentname: nginxvolumeMounts:- mountPath: /cachename: cache-volumevolumes:- name: cache-volumehostPath:path: /datatype: Directory[root@k8s-master1 ~]# kubectl create -f hostpath.yaml [root@k8s-master1 ~]# kubectl  get podNAME       READY   STATUS    RESTARTS   AGEtest-pod   1/1     Running   0          4s[root@k8s-node1 /]# echo "test" > data/1.txt[root@k8s-master1 ~]# kubectl exec -it test-pod -- cat /cache/1.txttest

四、pv卷(以NFS为例)

1、概念

     1)PersistenVolume(PV)是由管理员设置的存储,它是集群的一部分。就像节点是集群中的资源一样,Pv也是集群中的资源。PV是Volume之类的卷插件,但是具有独特于使用PV的pod的生命周期,此API对象包含存储实现的细节,即NFS、ISCSI或者是云提供商的存储系统2)PersistentVolumeClaim(PVC)使用户存储的请求。它与pod相似。pod消耗节点资源,PVC消耗PV资源。pod可以请求特定级别的资源(cpu和内存)。声明可以请求特定的大小和访问模式(例如:可以以读/写一次或只读多次模式挂载)3)静态PV集群管理员创建一些PV。它们带有可供群集用户使用的实际存储的细节。他们存在于K8S API中,可用于消费4)动态PV*当管理员创建的静态pv都不匹配用户的PVC时,集群可能会尝试动态的为PVC创建卷。此配置基于storageclasses:PVC必须请求【存储类】,并且管理员必须创建并配置该类才能进行动态创建。声明该类为"",可以有效的禁用其动态配置*要启用基于存储级别的动态存储配置,集群管理员需要启用API server上的DefaultStorageClass[准入控制器],例如,通过确保DefaultStorageClass位于API Server组件的--admission-control标志,使用逗号分隔的有序值列表中,可以完成此操作5)绑定master中的控制环路监听新的PVC,寻找匹配的pv(如果可能),并将它们绑定在一起,如果为新的PVC动态调度PV,则该环路始终将该PV绑定到PVC。否则,用户总会得到他们所请求的存储,但是容量可能超过要求的数量,一旦PV和PVC绑定后,PVC绑定时排他性的,不管他们时如何绑定的。PVC跟PV绑定时一对一的映射

2、持久化卷声明的保护

     PVC保护的目的是确保由pod正在使用的PVC不会从系统中移除,因为如果被移除的话可能会导致数据丢失当启动pvc保护alpha功能时,如果用户删除了一个pod正在使用的PVC,则该PVC不会被立即删除。PVC的删除将被推迟,直到PVC不在被任何pod使用

3、持久化卷的类型

     Persistent Volume类型以插件形式实现。Kubernetes目前支持以下插件类型:GCEPersistent Disk AWSEIasticBlockStore AzureFile AzureDisk FC(FibreChannel)Flex Volume Flocker NFS iSCSI RBD(Ceph Block Device) CephFSCinder(Open Stack block storage) Glusterfs VsphereVolume Quobyte VolumesHostPath  VMware Photon Portworx Volumes ScalelO Volumes StorageOS

4、PV访问模式

     Persistentvolume可以以资源提供者支持的任何方式挂载到主机上。如下表所示,供应商具有不同的功能,每个PV的访问模式都将被设置为该卷支持的特定模式。例如,NFS可以支持多个读/写客户端,但特定的NFS PV可能以只读方式导出到服务器上。每个PV都有一套自己的用来描述特定功能的访问模式ReadWriteOnce(RWO)——该卷可以被单个节点以读/写模式挂载ReadOnlyMany(ROX)——该卷可以被多个节点以只读模式挂载ReadWriteMany(RWX)——该卷可以被多个节点以读/写模式挂载在命令行中,

5、回收策略

     Retain(保留) ——手动回收Recycle(回收) ——基本擦除(rm -f/the valume/”)Delete(删除) ——关联的存储资产(例如AWSEBS、GCEPD、AzureDisk和OpenStack Cinder卷)将被删除当前, 只有NFS和HostPath支持回收策略。AWS EBS、GCE PD、Azure Disk和Cinder卷支持删除策略

6、状态

     卷可以处于以下的某种状态:Available(可用)——块空闲资源还没有被任何声明绑定Bound(已绑定) ——卷已经被声明定Released(已释放) ——声明被副除, 但是资源还未被集群重新声明Failed(失败) ——该卷的自动回收失败命令行会显示绑定到PV的PVC的名称

7、持久化演示

     1)安装NFS服务器(先启动rpcbind)[root@lb1 ~]# yum -y install nfs-utils rpcbind[root@lb1 /]# mkdir -p /data/nfs{1..4}[root@lb1 /]# vim /etc/exports/data/nfs1      *( rw,no_root_squash)/data/nfs2      *( rw,no_root_squash)/data/nfs3      *( rw,no_root_squash)/data/nfs4      *( rw,no_root_squash)[root@lb1 /]# systemctl start rpcbind nfs[root@lb1 /]# systemctl enable rpcbind nfs   2)编辑pv[root@k8s-master1 ~]# vim pv.yaml apiVersion: v1kind: PersistentVolumemetadata:name: nfs01spec:capacity:storage: 10GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: nfsnfs:path: /data/nfs1server: 192.168.100.50---apiVersion: v1kind: PersistentVolumemetadata:name: nfs02spec:capacity:storage: 5GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: nfsnfs:path: /data/nfs2server: 192.168.100.50---apiVersion: v1kind: PersistentVolumemetadata:name: nfs03spec:capacity:storage: 3GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: nfsnfs:path: /data/nfs3server: 192.168.100.50---apiVersion: v1kind: PersistentVolumemetadata:name: nfs04spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: nfsnfs:path: /data/nfs4server: 192.168.100.50[root@k8s-master1 ~]# kubectl create -f pv.yaml [root@k8s-master1 ~]# kubectl get pvNAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGEnfs01   10Gi       RWO            Retain           Available           nfs                     9snfs02   10Gi       RWO            Retain           Available           nfs                     9snfs03   3Gi        RWO            Retain           Available           nfs                     9snfs04   1Gi        RWO            Retain           Available           nfs                     9s3)编辑pvc[root@k8s-master1 ~]# vim pvc.yaml apiVersion: v1kind: Servicemetadata:name: nginxlabels:app: nginxspec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx---apiVersion: apps/v1kind: StatefulSetmetadata:name: webspec:selector:matchLabels:app: nginxserviceName: "nginx"replicas: 2template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresent ports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:accessModes: ["ReadWriteOnce"]storageClassName: "nfs"resources:requests:storage: 1.5Gi   [root@k8s-master1 ~]# kubectl create -f pvc.yaml [root@k8s-master1 ~]# kubectl get pvNAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM               STORAGECLASS   REASON   AGEnfs01   10Gi       RWO            Retain           Available                       nfs                     25snfs02   5Gi        RWO            Retain           Bound       default/www-web-1   nfs                     25snfs03   3Gi        RWO            Retain           Bound       default/www-web-0   nfs                     25snfs04   1Gi        RWO            Retain           Available                       nfs                     25s[root@k8s-master1 ~]# kubectl get pvcNAME        STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGEwww-web-0   Bound    nfs03    3Gi        RWO            nfs            51mwww-web-1   Bound    nfs02    5Gi        RWO            nfs            49m[root@k8s-master1 ~]# kubectl get podNAME       READY   STATUS              RESTARTS   AGEweb-0      1/1     Running             0          2m7sweb-1      1/1     Running             0          8s[root@k8s-master1 ~]# kubectl exec -it web-0 /bin/bashroot@web-0:/# df -ThFilesystem                Type     Size  Used Avail Use% Mounted on192.168.100.50:/data/nfs3 nfs4      78G  1.5G   77G   2% /usr/share/nginx/html

8、pv的手动回收

     [root@k8s-master1 /]# kubectl  get pvNAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM               STORAGECLASS   REASON   AGEnfs01   10Gi       RWO            Retain           Bound         default/www-web-2   nfs                     10dnfs02   5Gi        RWO            Retain           Terminating   default/www-web-1   nfs                     10dnfs03   3Gi        RWO            Retain           Terminating   default/www-web-0   nfs                     10dnfs04   1Gi        RWO            Retain           Available                         nfs                     10d[root@k8s-master1 /]# kubectl  get pvcNAME        STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGEwww-web-0   Bound    nfs03    3Gi        RWO            nfs            10dwww-web-1   Bound    nfs02    5Gi        RWO            nfs            10dwww-web-2   Bound    nfs01    10Gi       RWO            nfs            9d#接触绑定[root@k8s-master1 /]# kubectl  delete pvc www-web-0 persistentvolumeclaim "www-web-0" deleted[root@k8s-master1 /]# kubectl  get pvNAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM               STORAGECLASS   REASON   AGEnfs01   10Gi       RWO            Retain           Released    default/www-web-2   nfs                     10dnfs04   1Gi        RWO            Retain           Available                        nfs                     10d#手动回收[root@k8s-master1 /]# kubectl  edit pv nfs01            claimRef:apiVersion: v1kind: PersistentVolumeClaimname: www-web-2namespace: defaultresourceVersion: "76291"uid: 2bd939eb-91fa-4456-98c3-1375753d69f7[root@k8s-master1 /]# kubectl  get pvNAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGEnfs01   10Gi       RWO            Retain           Available           nfs                     10dnfs04   1Gi        RWO            Retain           Available           nfs                     10d

五、关于statefulset

 1、匹配pod-name(网络标识)的模式为:$(statefulset名称)-$(序号),比如上面的示例web-0,web-12、statefulset:为每个pod副本创建一个dns域名,这个域名的格式为:$(podname).(headless servername),也意味着服务之间通过pod域名来通信而非pod ip,因为当pod所在Node发生故障时,pod会被漂移到其他的Node上,pod ip会发生改变,但pod域名不会有改变3、statefulset使用headless服务来控制pod的域名,这个域名的FQDN为:$(service name).$(namespace).svc.cluster.local,其中,‘cluster.local’指的是集群的域名4、根据volumeClainTemplates,为每个pod创建一个PVC,PvC的命名规则匹配模式:(columeClaimTemplates.name)-(pod_name),比如上面的volumeMounts.name=www,podname=web-[0-1],因为创建出来的PVC是www-web-0,www-web-15、删除pod不会删除其PVC,手动删除PVC将自动释放PV6、statefulset的启停规则1)有序部署:部署statefulset时,如果有对个pod副本,它们会被顺序的创建(从0到N-1),并且在下一个pod运行之前,所有的pod必须都是Running和Read状态。2)有序删除:当pod被删除时,它们被终止的顺序是从N-1到03)有序扩展:当pod执行扩展操作时,与部署一样,它前面的pod必须处于Running和Read状态7、statefulset1)稳定的持久化存储,即pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现2)稳定的网络标识,即pod重新调度后其podname和hostname不变3)有序部署,有序扩展,基于init containers来实现4)有序收缩

部署k8s(15):持久化存储方案相关推荐

  1. K8s 或 K3s 集群中持久化存储方案选型

    存储架构 1 三个概念: pv , pvc ,storageclass pv - 持久化卷, 支持本地存储和网络存储, 例如hostpath,ceph rbd, nfs等,只支持两个属性, capac ...

  2. 干货 | 如何评估Kubernetes持久化存储方案

    在2018年的Garnter技术成熟度曲线中,容器存储出现在了技术触发期,已经开始进入大众的视野.我相信,在未来的两年内,容器存储会随着Kubernetes的进一步成熟和商业化,其地位会越来越重要.如 ...

  3. 如何评估Kubernetes持久化存储方案

    在2018年的Garnter技术成熟度曲线中,容器存储出现在了技术触发期,已经开始进入大众的视野.我相信,在未来的两年内,容器存储会随着Kubernetes的进一步成熟和商业化,其地位会越来越重要.如 ...

  4. 杉岩:云原生时代,容器持久化存储方案选对了吗?

    75%的企业部署容器应用,云原生正加速业务创新 互联网的发展.云计算的出现,对传统IT带来冲击和挑战.面对数据爆炸式增长.业务种类增加.应用复杂性提高.软件迭代速度加快等一系列挑战,容器技术带来了突破 ...

  5. 四大开源分布式存储_Kubernetes持久化存储方案测试

    在2018年的Garnter技术成熟度曲线中,容器存储出现在了技术触发期,已经开始进入大众的视野.我相信,在未来的两年内,容器存储会随着Kubernetes的进一步成熟和商业化,其地位会越来越重要.如 ...

  6. k8s之持久化存储PV、PVC

    目录 前言 一.k8s 容器磁盘 1.1 Volume(存储卷) 1.2 emptyDir 存储卷 1.3  hostPath存储卷 二.PV和PVC 1.PV 概念 2.PVC概念 3.PV 与 P ...

  7. 【k8s的持久化存储】PV、PVC、StorageClass讲解

    一.PV和PVC的引入 Volume 提供了非常好的数据持久化方案,不过在可管理性上还有不足. Pod 通常是由应用的开发人员维护,而 Volume 则通常是由存储系统的管理员维护.开发人员要获得上面 ...

  8. k8s核心技术-持久化存储(nfs网络存储)---K8S_Google工作笔记0050

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们再来看k8s中的,持久化存储 之前我们说过数据卷,但是利用数据卷存东西,pod如果重启的话 ...

  9. 【云原生】阿里云ACK部署MySQL 数据持久化存储

    思路图 一.概述 ACK介绍 阿里云容器服务Kubernetes版(Alibaba Cloud Container Service for Kubernetes,简称容器服务ACK)是全球首批通过Ku ...

最新文章

  1. 【大牛系列教学】java商城推荐算法
  2. Building Android App Without an IDE
  3. 单调谐回路谐振放大器等效电路分析_手把手教你如何分析三极管电路
  4. 【渝粤题库】国家开放大学2021春2402外国文学题目
  5. 高级IO(文件的读写)——阻塞式IO的困境、非阻塞式IO
  6. Linux的实际操作:文件目录类实用指令(压缩gzip tar -zcvf和解压缩gunzip tar -zxvf)
  7. vue小demo易错点总结
  8. beats耳机用安卓手机影响音效么_500元以下的头戴式耳机超高性价比推荐
  9. maven(6)------maven坐标分析
  10. [转]余弦cos计算相似度
  11. 易语言-万挂作坊4.X下载,有图有真相
  12. 推荐一些学习SEO的优秀书籍附pdf电子书下载地址
  13. android利用itext5制作pdf,Itext5生成PDF
  14. html语言的特殊符号,特殊符号
  15. java实现即时通讯软件
  16. 51CTO学院优惠版
  17. 一本通 1273:货币系统
  18. JSP之JSTL标签
  19. 制作arch linux安装u盘,制作 Arch Linux 内存系统启动盘
  20. LinuxZIP压缩和解压缩

热门文章

  1. asp.net IIS7 503错误
  2. SQLPLUS 命令
  3. Web全栈~28.网络编程
  4. NOSQL,Redis的常用数据类型
  5. 单片机c语言基础知识,c语言必背100代码有哪些?
  6. 裴波那契数列的递归实现与非递归实现
  7. 例5.8求Fibonacci(斐波那契)数列的前40个数。
  8. 5.4 文本分析与加密(project)
  9. python查文献_自从用了Python,轻松查文献,释放80%的重复劳动时间
  10. mysql 为表添加索引