k8s-静态PV和动态PV
1、pv 简单介绍
PersistenVolume(PV):对存储资源创建和使用的抽象,使得存储作为集群中的资源管理 PV分为静态和动态,动态能够自动创建PV • PersistentVolumeClaim(PVC):让用户不需要关心具体的Volume实现细节 容器与PV、PVC之间的关系,可以如下图所示: 总的来说,PV是提供者,PVC是消费者,消费的过程就是绑定。 参考网址:1、https://www.cnblogs.com/weifeng1463/p/10037803.html 2、https://blog.csdn.net/qq_25611295/article/details/86065053
2、nfs 搭建:
- yum install nfs-utils
- vim /etc/exports
- /data/k8s/ 172.16.1.0/24(sync,rw,no_root_squash)
- systemctl start nfs; systemctl start rpcbind
- systemctl enable nfs
- 测试:
- yum install nfs-utils
- showmount -e 172.16.1.131
3、PersistentVolume 静态绑定 (手工创建PV、PVC)
- [root@VM_0_48_centos prometheus]# cat mypv.yaml
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: pv001
- spec:
- capacity:
- storage: 10Gi
- accessModes:
- - ReadWriteMany
- nfs:
- path: /data/k8s
- server: 172.19.0.14
- [root@VM_0_48_centos prometheus]# cat mypvc.yaml ###会根据大小和类型自动匹配到上面的PV
- kind: PersistentVolumeClaim
- apiVersion: v1
- metadata:
- namespace: kube-system
- name: prometheus-claim
- spec:
- accessModes:
- - ReadWriteMany
- resources:
- requests:
- storage: 10Gi
- [root@VM_0_48_centos prometheus]# kubectl get pv,pvc -n kube-system
- NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
- persistentvolume/pv001 10Gi RWX Retain Bound kube-system/prometheus-claim 17m
- NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
- persistentvolumeclaim/prometheus-claim Bound pv001 10Gi RWX
4、PersistentVolume 静态PVC使用案例
- apiVersion: apps/v1
- kind: StatefulSet
- metadata:
- name: prometheus
- namespace: kube-system
- labels:
- k8s-app: prometheus
- kubernetes.io/cluster-service: "true"
- addonmanager.kubernetes.io/mode: Reconcile
- version: v2.2.1
- spec:
- serviceName: "prometheus"
- replicas: 1
- podManagementPolicy: "Parallel"
- updateStrategy:
- type: "RollingUpdate"
- selector:
- matchLabels:
- k8s-app: prometheus
- template:
- metadata:
- labels:
- k8s-app: prometheus
- annotations:
- scheduler.alpha.kubernetes.io/critical-pod: ''
- spec:
- priorityClassName: system-cluster-critical
- serviceAccountName: prometheus
- initContainers:
- - name: "init-chown-data"
- image: "busybox:latest"
- imagePullPolicy: "IfNotPresent"
- command: ["chown", "-R", "65534:65534", "/data"]
- volumeMounts:
- - name: prometheus-data
- mountPath: /data
- subPath: ""
- containers:
- - name: prometheus-server-configmap-reload
- image: "jimmidyson/configmap-reload:v0.1"
- imagePullPolicy: "IfNotPresent"
- args:
- - --volume-dir=/etc/config
- - --webhook-url=http://localhost:9090/-/reload
- volumeMounts:
- - name: config-volume
- mountPath: /etc/config
- readOnly: true
- resources:
- limits:
- cpu: 10m
- memory: 10Mi
- requests:
- cpu: 10m
- memory: 10Mi
- - name: prometheus-server
- image: "prom/prometheus:v2.2.1"
- imagePullPolicy: "IfNotPresent"
- args:
- - --config.file=/etc/config/prometheus.yml
- - --storage.tsdb.path=/data
- - --web.console.libraries=/etc/prometheus/console_libraries
- - --web.console.templates=/etc/prometheus/consoles
- - --web.enable-lifecycle
- ports:
- - containerPort: 9090
- readinessProbe:
- httpGet:
- path: /-/ready
- port: 9090
- initialDelaySeconds: 30
- timeoutSeconds: 30
- livenessProbe:
- httpGet:
- path: /-/healthy
- port: 9090
- initialDelaySeconds: 30
- timeoutSeconds: 30
- # based on 10 running nodes with 30 pods each
- resources:
- limits:
- cpu: 200m
- memory: 1000Mi
- requests:
- cpu: 200m
- memory: 1000Mi
- volumeMounts:
- - name: config-volume
- mountPath: /etc/config
- - name: prometheus-data
- mountPath: /data
- subPath: ""
- terminationGracePeriodSeconds: 300
- volumes:
- - name: config-volume
- configMap:
- name: prometheus-config
- - name: prometheus-data
- persistentVolumeClaim: #申明使用静态PVC永久化存储
- claimName: prometheus-claim
5、动态PV,K8S调用资源对象自动创建PV。生产环境常用
当我们k8s业务上来的时候,大量的pvc,此时我们人工创建匹配的话,工作量就会非常大了,需要动态的自动挂载相应的存储。
我们需要使用到StorageClass,来对接存储,靠他来自动关联pvc,并创建pv。 Kubernetes支持动态供给的存储插件: https://kubernetes.io/docs/concepts/storage/storage-classes/ 因为NFS不支持动态存储,所以我们需要借用这个存储插件。 nfs动态相关部署可以参考: https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy
6、存储对象申明和授权。
- 定义一个storage
- [root@VM_0_48_centos prometheus]# cat storageclass-nfs.yaml
- apiVersion: storage.k8s.io/v1beta1
- kind: StorageClass
- metadata:
- name: managed-nfs-storage
- provisioner: fuseim.pri/ifs
- 因为storage自动创建pv需要经过kube-apiserver,所以要进行授权
- [root@VM_0_48_centos prometheus]# cat storageclass-rbac.yaml
- apiVersion: v1
- kind: ServiceAccount
- metadata:
- name: nfs-client-provisioner
- ---
- kind: ClusterRole
- apiVersion: rbac.authorization.k8s.io/v1beta1
- metadata:
- name: nfs-client-provisioner-runner
- rules:
- - apiGroups: [""]
- resources: ["persistentvolumes"]
- verbs: ["get", "list", "watch", "create", "delete"]
- - apiGroups: [""]
- resources: ["persistentvolumeclaims"]
- verbs: ["get", "list", "watch", "update"]
- - apiGroups: ["storage.k8s.io"]
- resources: ["storageclasses"]
- verbs: ["get", "list", "watch"]
- - apiGroups: [""]
- resources: ["events"]
- verbs: ["list", "watch", "create", "update", "patch"]
- ---
- kind: ClusterRoleBinding
- apiVersion: rbac.authorization.k8s.io/v1beta1
- metadata:
- name: run-nfs-client-provisioner
- subjects:
- - kind: ServiceAccount
- name: nfs-client-provisioner
- namespace: default
- roleRef:
- kind: ClusterRole
- name: nfs-client-provisioner-runner
- apiGroup: rbac.authorization.k8s.io
- 部署一个自动创建pv的服务
- [root@VM_0_48_centos prometheus]# cat prometheus-statefulset.yaml
- apiVersion: apps/v1
- kind: StatefulSet
- metadata:
- name: prometheus
- namespace: kube-system
- labels:
- k8s-app: prometheus
- kubernetes.io/cluster-service: "true"
- addonmanager.kubernetes.io/mode: Reconcile
- version: v2.2.1
- spec:
- serviceName: "prometheus"
- replicas: 1
- podManagementPolicy: "Parallel"
- updateStrategy:
- type: "RollingUpdate"
- selector:
- matchLabels:
- k8s-app: prometheus
- template:
- metadata:
- labels:
- k8s-app: prometheus
- annotations:
- scheduler.alpha.kubernetes.io/critical-pod: ''
- spec:
- priorityClassName: system-cluster-critical
- serviceAccountName: prometheus
- initContainers:
- - name: "init-chown-data"
- image: "busybox:latest"
- imagePullPolicy: "IfNotPresent"
- command: ["chown", "-R", "65534:65534", "/data"]
- volumeMounts:
- - name: prometheus-data
- mountPath: /data
- subPath: ""
- containers:
- - name: prometheus-server-configmap-reload
- image: "jimmidyson/configmap-reload:v0.1"
- imagePullPolicy: "IfNotPresent"
- args:
- - --volume-dir=/etc/config
- - --webhook-url=http://localhost:9090/-/reload
- volumeMounts:
- - name: config-volume
- mountPath: /etc/config
- readOnly: true
- resources:
- limits:
- cpu: 10m
- memory: 10Mi
- requests:
- cpu: 10m
- memory: 10Mi
- - name: prometheus-server
- image: "prom/prometheus:v2.2.1"
- imagePullPolicy: "IfNotPresent"
- args:
- - --config.file=/etc/config/prometheus.yml
- - --storage.tsdb.path=/data
- - --web.console.libraries=/etc/prometheus/console_libraries
- - --web.console.templates=/etc/prometheus/consoles
- - --web.enable-lifecycle
- ports:
- - containerPort: 9090
- readinessProbe:
- httpGet:
- path: /-/ready
- port: 9090
- initialDelaySeconds: 30
- timeoutSeconds: 30
- livenessProbe:
- httpGet:
- path: /-/healthy
- port: 9090
- initialDelaySeconds: 30
- timeoutSeconds: 30
- # based on 10 running nodes with 30 pods each
- resources:
- limits:
- cpu: 200m
- memory: 1000Mi
- requests:
- cpu: 200m
- memory: 1000Mi
- volumeMounts:
- - name: config-volume
- mountPath: /etc/config
- - name: prometheus-data
- mountPath: /data
- subPath: ""
- terminationGracePeriodSeconds: 300
- volumes:
- - name: config-volume
- configMap:
- name: prometheus-config
- - name: prometheus-data
- persistentVolumeClaim:
- claimName: prometheus-claim
7、效果测试
- [root@VM_0_48_centos prometheus]# cat test.yaml
- apiVersion: v1
- kind: Service
- metadata:
- name: nginx
- labels:
- app: nginx
- spec:
- ports:
- - port: 80
- name: web
- clusterIP: None
- selector:
- app: nginx
- ---
- apiVersion: apps/v1
- kind: StatefulSet
- metadata:
- name: web
- spec:
- serviceName: "nginx"
- replicas: 3
- selector:
- matchLabels:
- app: nginx
- template:
- metadata:
- labels:
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx
- ports:
- - containerPort: 80
- name: web
- volumeMounts:
- - name: www
- mountPath: /usr/share/nginx/html
- volumeClaimTemplates:
- - metadata:
- name: www
- spec:
- accessModes: [ "ReadWriteOnce" ]
- storageClassName: "managed-nfs-storage"
- resources:
- requests:
- storage: 1Gi
- kubectl exec -it web-0 sh
- # cd /usr/share/nginx/html
- # touch 1.txt
k8s-静态PV和动态PV的更多相关文章
- 4.k8s存储之Volume、PV、PVC和StatefulSet
3.Volume 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题.首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失--容器以干净的状态(镜像最初的 ...
- Kubernetes 动态PV使用
Kubernetes 动态PV使用 Kubernetes支持动态供给的存储插件:https://kubernetes.io/docs/concepts/storage/storage-classes/ ...
- 8.3 k8s部署jenkins,通过pv/pvc结合NFS服务器持久化
1.制作jenkins docker镜像 1.1 下载jenkins wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.30 ...
- Android GradientDrawable(shape标签定义) 静态使用和动态使用(圆角,渐变实现)
Android GradientDrawable使用优势: 1. 快速实现一些基本图形(线,矩形,圆,椭圆,圆环) 2. 快速实现一些圆角,渐变,阴影等效果 3. 代替图片设置为View的背景 4. ...
- C++ 系列:静态库与动态库
转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...
- Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式
前言 啦啦啦~(博主每次开篇都要卖个萌,大家是不是都厌倦了呢~) 本篇博文希望帮助大家掌握 Broadcast 编程基础,实现动态注册 Broadcast 和静态注册 Broadcast 的方式以及学 ...
- C++静态库与动态库
C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...
- Linux下Gcc生成和使用静态库和动态库详解(转)
一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...
- VS中Debug和Realease、及静态库和动态库的区别整理(转)
原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不 ...
随机推荐
- linux主机名称文件修改
目录 一:linux主机名称查看与修改 1.查看自己主机名: 3.临时修改 4.永久修改 一:linux主机名称查看与修改 1.查看自己主机名: [root@localhost ~]# echo $H ...
- 在海外上传文件到中国AWS S3
s3cmd --access_key= --secret_key=xxxx --region=cn-north-1 --host=s3.cn-north-1.amazonaws.com.cn --ho ...
- Springboot +redis+⾕歌开源Kaptcha实现图片验证码功能
Springboot +redis+⾕歌开源Kaptcha实现图片验证码功能 背景 注册-登录-修改密码⼀般需要发送验证码,但是容易被 攻击恶意调⽤ 什么是短信-邮箱轰炸机 手机短信轰炸机是批.循环给 ...
- Java IO: ByteArrayOutputStream使用
感谢原文作者:小思思smile 原文链接:https://blog.csdn.net/u014049880/article/details/52329333/ 更多请查阅Java API文档! 在创建 ...
- 什么是Native方法 (转)
一个Native Method就是一个java调用非java代码的接口(NDK也跟这有关吗?(疑问)一个Native Method由非java语言实现 在定义一个native method时,并不提供 ...
- libcurl库openssl编译
openssl编译 win32: perl Configure no-shared VC-WIN32 --prefix=E:/lib/openssl-1.1.1 linux: ./config -f ...
- 浮动float、浮动影响和清除浮动
普通流(normal flow) 这个单词很多人翻译为 文档流 , 字面翻译 普通流 或者标准流都可以. 前面我们说过,网页布局的核心,就是用CSS来摆放盒子位置.如何把盒子摆放到合适的位置? CSS ...
- laravel中closure和curry 科里化函数式编程
推荐值得的一看博客文档:谢谢作者 : https://my.oschina.net/zhmsong 函数式编程curry的概念: 只传递给函数一部分参数来调用函数,然后返回一个函数去处理剩下的参数. ...
- onclick="func()"和 onclick = "return func()"区别
onclick="func()" 表示只会执行 func , 但是不会传回 func 中之回传值onclick = "return func()" 则是 执行 ...
- Web集群调度器-Haproxy
Web集群调度器-Haproxy 目录 Web集群调度器-Haproxy 一.Web集群调度器 1.常用的Web集群调度器 2. Haproxy应用分析 3. Haproxy的主要特性 4. 常用集群 ...