Kubernetes --(k8s)volume 数据管理
容器的磁盘的生命周期是短暂的,这就带来了许多问题;第一:当一个容器损坏了,kubelet会重启这个容器,但是数据会随着container的死亡而丢失;第二:当很多容器在同一Pod中运行的时候,经常需要数据共享。kubernets Volume解决了这些问题
kubernets volume的四种类型
- emtyDir
- hostPath
- NFS
- pv/pvc
https://www.kubernetes.org.cn/kubernetes-volumes
emtyDir
第一步:编写yml文件
╭─root@node1 ~
╰─➤ vim nginx-empty.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: du # 对应
mountPath: /usr/share/nginx/html
volumes:
- name: du # 对应
emptyDir: {}
第二步:运行yml文件
╭─root@node1 ~
╰─➤ kubectl apply -f nginx-empty.yml
第三步:查看pod
╭─root@node1 ~
╰─➤ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 7m18s 10.244.2.14 node3 <none> <none>
第四步:到node3节点查看容器详细信息
# docker ps
╭─root@node3 ~
╰─➤ docker inspect 9c3ed074fb29| grep "Mounts" -A 8
"Mounts": [
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/2ab6183c-eddd-44eb-9e62-ded5106d1d1a/volumes/kubernetes.io~empty-dir/du",
"Destination": "/usr/share/nginx/html",
"Mode": "Z",
"RW": true,
"Propagation": "rprivate"
},
第五步:写入内容
╭─root@node3 ~
╰─➤ cd /var/lib/kubelet/pods/2ab6183c-eddd-44eb-9e62-ded5106d1d1a/volumes/kubernetes.io~empty-dir/du
╭─root@node3 /var/lib/kubelet/pods/2ab6183c-eddd-44eb-9e62-ded5106d1d1a/volumes/kubernetes.io~empty-dir/du
╰─➤ ls
╭─root@node3 /var/lib/kubelet/pods/2ab6183c-eddd-44eb-9e62-ded5106d1d1a/volumes/kubernetes.io~empty-dir/du
╰─➤ echo "empty test" >> index.html
第六步:访问
╭─root@node1 ~
╰─➤ curl 10.244.2.14
empty test
第七步:停掉容器
╭─root@node3 ~
╰─➤ docker stop 9c3ed074fb29
9c3ed074fb29
第八步:查看新起来的容器
╭─root@node3 ~
╰─➤ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14ca410ad737 5a3221f0137b "nginx -g 'daemon of…" About a minute ago Up About a minute k8s_nginx_nginx_default_2ab6183c-eddd-44eb-9e62-ded5106d1d1a_1
第九步:查看pod 信息 并访问
╭─root@node1 ~
╰─➤ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 1 40m 10.244.2.14 node3 <none> <none>
╭─root@node1 ~
╰─➤ curl 10.244.2.14
empty test
第十步:删除pod
╭─root@node1 ~
╰─➤ kubectl delete pod nginx
pod "nginx" deleted
第十一步:查看emptyDir
╭─root@node3 ~
╰─➤ ls /var/lib/kubelet/pods/2ab6183c-eddd-44eb-9e62-ded5106d1d1a/volumes/kubernetes.io~empty-dir/du
ls: cannot access /var/lib/kubelet/pods/2ab6183c-eddd-44eb-9e62-ded5106d1d1a/volumes/kubernetes.io~empty-dir/du: No such file or directory
emptyDir实验总结
- 写入文件可以访问说明文件已经同步
- 停到原容器后,kubelet新建一容器。
- 访问仍成功说明数据没有随容器的死亡而丢失
- emptyDir 寿命与pods 同步
hostPath
效果相当于执行: docker run -v /tmp:/usr/share/nginx/html
第一步:编写yml文件
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: du # 对应
mountPath: /usr/share/nginx/html
volumes:
- name: du # 对应
hostPath:
path: /tmp
第二步:运行yml文件
╭─root@node1 ~
╰─➤ kubectl apply -f nginx-hostP.yml
pod/nginx2 created
第三步:查看pods
╭─root@node1 ~
╰─➤ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx2 1/1 Running 0 55s 10.244.2.15 node3 <none> <none>
第四步:pod所在节点写入测试文件
╭─root@node3 ~
╰─➤ echo "hostPath test " >> /tmp/index.html
第五步: 访问
╭─root@node1 ~
╰─➤ curl 10.244.2.15
hostPath test
第六步:删除pods
╭─root@node1 ~
╰─➤ kubectl delete -f nginx-hostP.yml
pod "nginx2" deleted
第七步:查看测试文件
╭─root@node3 ~
╰─➤ cat /tmp/index.html
hostPath test
hostPath实验总结
- 一个hostPath类型的磁盘就是挂在了主机的一个文件或者目录
- 注意:从模版文件中创建的pod可能会因为主机上文件夹目录的不同而导致一些问题,因为挂载的目录是pod宿主机的某个目录。
NFS
第一步:部署nfs (每个节点安装nfs)
╭─root@node1 ~
╰─➤ yum install nfs-utils rpcbind -y
╭─root@node1 ~
╰─➤ cat /etc/exports
/tmp *(rw)
╭─root@node1 ~
╰─➤ chown -R nfsnobody: /tmp
╭─root@node1 ~
╰─➤ systemctl restart nfs rpcbind
----------------------------------------------
╭─root@node2 ~
╰─➤ yum install nfs-utils -y
----------------------------------------------
╭─root@node3 ~
╰─➤ yum install nfs-utils -y
第二步:编写yml文件
apiVersion: v1
kind: Pod
metadata:
name: nginx2
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: du # 对应
mountPath: /usr/share/nginx/html
volumes:
- name: du # 对应
nfs:
path: /tmp
server: 192.168.137.3
第三步:运行yml文件
╭─root@node1 ~
╰─➤ kubectl apply -f nginx-nfs.yml
pod/nginx2 created
第四步:查看pod信息
╭─root@node1 ~
╰─➤ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx2 1/1 Running 0 5m46s 10.244.2.16 node3 <none> <none>
第五步:编写测试文件
╭─root@node1 ~
╰─➤ echo "nfs-test" >> /tmp/index.html
第六步:访问
╭─root@node1 ~
╰─➤ curl 10.244.2.16
nfs-test
pv/pvc

第一步:部署NFS
略
第二步:编写pv的yml文件
apiVersion: v1
kind: PersistentVolume
metadata:
name: mypv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
path: /tmp
server: 192.168.137.3
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc1
spec:
accessModes:
- ReadWriteMany
volumeName: mypv
resources:
requests:
storage: 1Gi
accessModes有三类
- ReadWriteOnce – 可以被单个节点进行读写挂载
- ReadOnlyMany – 可以被多个节点进行只读挂载
- ReadWriteMany – 可以被多个节点进行读写挂载
reclaim policy有三类
- retain – pvc被删除之后,数据保留
- recyle- 删除pvc之后会删除数据(被废弃)
- delete – 删除pvc之后会删除数据
第三步:执行yml文件 创建pv/pvc
╭─root@node1 ~
╰─➤ vim pv-pvc.yml
╭─root@node1 ~
╰─➤ kubectl apply -f pv-pvc.yml
persistentvolume/mypv created
persistentvolumeclaim/mypvc1 created
第四步:查看
╭─root@node1 ~
╰─➤ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mypv 1Gi RWX Retain Bound default/mypvc1 68s
╭─root@node1 ~
╰─➤ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mypvc1 Bound mypv 1Gi RWX 78s
使用pvc
第五步:编写nginx的yml文件
apiVersion: v1
kind: Pod
metadata:
name: nginx3
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: du # 对应
mountPath: /usr/share/nginx/html
volumes:
- name: du # 对应
persistentVolumeClaim:
claimName: mypvc1
第六步:执行yml文件
╭─root@node1 ~
╰─➤ kubectl apply -f nginx-pv.yml
pod/nginx3 created
第七步:查看pod
╭─root@node1 ~
╰─➤ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx3 1/1 Running 0 3m45s 10.244.2.17 node3 <none> <none>
第八步:编写访问文件并访问
╭─root@node1 ~
╰─➤ echo "pv test" > /tmp/index.html
╭─root@node1 ~
╰─➤ curl 10.244.2.17
pv test
删除一直处于terminating状态的pod
我这里的pod是与nfs有关,nfs挂载有问题导致pod有问题,执行完删除命令以后看到pod一直处于terminating的状态。
这种情况下可以使用强制删除命令:
kubectl delete pod [pod name] --force --grace-period=0 -n [namespace]
# 注意:必须加-n参数指明namespace,否则可能报错pod not found
演示:
╭─root@node1 ~
╰─➤ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx3 0/1 Terminating 0 7d17h
╭─root@node1 ~
╰─➤ kubectl delete pod nginx3 --force --grace-period=0 -n default
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "nginx3" force deleted

Kubernetes --(k8s)volume 数据管理的更多相关文章
- Kubernetes K8S之存储Volume详解
K8S之存储Volume概述与说明,并详解常用Volume示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C ...
- 《两地书》--Kubernetes(K8s)基础知识(docker容器技术)
大家都知道历史上有段佳话叫“司马相如和卓文君”.“皑如山上雪,皎若云间月”.卓文君这么美,却也抵不过多情女儿薄情郎. 司马相如因一首<子虚赋>得汉武帝赏识,飞黄腾达之后便要与卓文君“故来相 ...
- Docker Kubernetes(K8s)简介
入职了新公司,使用了Docker和K8s,需要有一个基础的了解,对网络上相关信息进行了简单总结. 一Docker 1简介: Docker 将应用程序与该程序的依赖,打包在一个文件里面.运行这个文件,就 ...
- Kubernetes(k8s) docker集群搭建
原文地址:https://blog.csdn.net/real_myth/article/details/78719244 一.Kubernetes系列之介绍篇 •Kubernetes介绍 1.背 ...
- Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之集群部署环境规划(一)
0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.环境规划 软件 版本 ...
- k8s volume存储卷(四)
介绍 volume存储卷是Pod中能够被多个容器访问的共享目录,kubernetes的volume概念,用途和目的与docker的volume比较类似,但两者不能等价,首先,kubernetes中的v ...
- Kubernetes(K8s)基础知识(docker容器技术)
今天谈谈K8s基础知识关键词: 一个目标:容器操作:两地三中心:四层服务发现:五种Pod共享资源:六个CNI常用插件:七层负载均衡:八种隔离维度:九个网络模型原则:十类IP地址:百级产品线:千级物理机 ...
- kubernetes(k8s)容器编排工具基础概念
Kubernetes (K8s): 中文社区:https://www.kubernetes.org.cn/replication-controller-kubernetes 官网:https://ku ...
- Kubernetes K8S之通过yaml文件创建Pod与Pod常用字段详解
YAML语法规范:在kubernetes k8s中如何通过yaml文件创建pod,以及pod常用字段详解 YAML 语法规范 K8S 里所有的资源或者配置都可以用 yaml 或 Json 定义.YAM ...
- k8s volume存储卷
k8s volume存储卷 介绍 volume存储卷是Pod中能够被多个容器访问的共享目录,kubernetes的volume概念,用途和目的与docker的volume比较类似,但两者不能等价, ...
随机推荐
- Spark算子使用
一.spark的算子分类 转换算子和行动算子 转换算子:在使用的时候,spark是不会真正执行,直到需要行动算子之后才会执行.在spark中每一个算子在计算之后就会产生一个新的RDD. 二.在编写sp ...
- 5款极简极美WordPress主题,亲测可用附送源码
2020年深冬,新闻上报道是.从1950年以来最寒冷的冬天. 一个周六的下午,我找遍了全网的简约博客主题,搭建了三年来的第7个独立博客, 多么难得的周末啊,我却在家花了一整天的时间.整理出直接套用5️ ...
- 原生redis命令
一. redis-cli 连接 redis 进入redis安装目录 cd /usr/local/bin 进入redis客户端 ./redis-cli -p 6379 -h 用于指定 ip -p 用于指 ...
- 超有用的linux笔记
名词解释 根目录说明 tree -L 1 . ├── bin -> usr/bin # 英语binary的缩写,表示"二进制文件",bin目录包含了会被所有用户使用的可执行程 ...
- PAT甲级 Perfect Sequence (25) 记忆化搜索
题目分析: 意思是要求对于一个给出的数组,我们在其中尽可能多选数字,使得所选数字的max <= min * p,而由于数据量较大直接二层循环不加优化实现是不现实的,由题意得知,对于数字序列的子序 ...
- 【Oracle】删除表空间
删除表空间如果是 SQL> DROP TABLEPSACE XXXX; 是无法将数据文件一同都删除的 想要删除表空间和数据文件需要如下操作: SQL> drop tablespace XX ...
- 未使用绑定变量对share_pool的影响
oracle SGA中包含数据高速缓冲,重做日志缓冲,以及共享池(share_pool).共享池中包含库高速缓冲(所有的SQL,执行计划等)和数据字典缓冲(对象的定义,权限等). 所以,如果SQL中没 ...
- Java基础复习2
三目运算符 语法:条件判断?表达式1:表达式2; 如果条件判断成立则获取值1否则获取值2 public class demo1{ public static void main(String[ ...
- 图像分类学习:X光胸片诊断识别----迁移学习
引言 刚进入人工智能实验室,不知道是在学习机器学习还是深度学习,想来他俩可能是一个东西,查阅之后才知道这是两个领域,或许也有些交叉,毕竟我也刚接触,不甚了解. 在我还是个纯度小白之时,写下这篇 ...
- 。SLI,Service Level Indicator,服务等级指标,其实就是我们选择哪些指标来衡量我们的稳定性。而 SLO,Service Level Objective,服务等级目标,指的就是我们设定的稳定性目标,比如“几个 9”这样的目标。
.SLI,Service Level Indicator,服务等级指标,其实就是我们选择哪些指标来衡量我们的稳定性.而 SLO,Service Level Objective,服务等级目标,指的就是我 ...