0
点赞
收藏
分享

微信扫一扫

K8s-存储

目录

ConfigMap配置管理

使用configmap设置环境变量

通过数据卷使用configmap 

configmap热更新

​Secret配置管理 

​Volumes配置管理 

 emptyDir卷(临时卷)

hostPath 卷

​实现不同节点之间文件共享

 PersistentVolume(持久卷) PV

静态PV创建

NFS动态分配PV

使用statefullset部署mysql主从集群:

          部署 MySQL

StatefulSet


ConfigMap配置管理

Configmap用于保存配置数据,以键值对形式存储。

configMap 资源提供了向 Pod 注入配置数据的方法。 旨在让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。 典型的使用场景:

填充环境变量的值
设置容器内的命令行参数
填充卷的配置文件

创建ConfigMap的方式有4种: 使用字面值创建 使用文件创建 使用目录创建 编写configmap的yaml文件创建

使用configmap设置环境变量

通过数据卷使用configmap 

configmap热更新

Secret配置管理 

Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 ssh key。  
敏感信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。 
Pod 可以用两种方式使用 secret:
      作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里。 
      当 kubelet 为 pod 拉取镜像时使用。
Secret的类型:
Service Account:Kubernetes 自动创建包含访问 API 凭据的 secret,并自动修改pod 以使用此类型的 secret。
Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,因此安全性弱。
kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。

 在harbor仓库中新建用户

 将用户加入到私有仓库中

Volumes配置管理 

容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。首先,当容器崩溃时,kubelet 将重新启动容器,容器中的文件将会丢失,因为容器会以干净的状态重建。其次,当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件。 Kubernetes 抽象出 Volume 对象来解决这两个问题。

Kubernetes 卷具有明确的生命周期,与包裹它的 Pod 相同。 因此,卷比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。 当然,当一个 Pod 不再存在时,卷也将不再存在。也许更重要的是,Kubernetes 可以支持许多类型的卷,Pod 也能同时使用任意数量的卷。

卷不能挂载到其他卷,也不能与其他卷有硬链接。 Pod 中的每个容器必须独立地指定每个卷的挂载位置

 emptyDir卷(临时卷)

同一pod内容器之间的网络栈是共享的

重新打开一个终端,成功访问

使用dd命令生成200M的文件,可以看到提示报错,因为限制物理内存使用100M

emptydir缺点:
不能及时禁止用户使用内存。虽然过1-2分钟kubelet会将Pod挤出,但是这个时间内,其实对node还是有风险的;
影响kubernetes调度,因为empty dir并不涉及node的resources,这样会造成Pod“偷偷”使用了node的内存,但是调度器并不知晓;
用户不能及时感知到内存不可用

hostPath 卷

能将主机节点文件系统上的文件或目录挂载到 Pod 中。 虽然这不是大多数 Pod 需要的,但是它为一些应用程序提供了强大的逃生舱

在server3上自动创建/data,写入数据

在server2上可以成功访问

查看server4自动创建/data。写入数据

可以成功访问

实现不同节点之间文件共享

server3和server4node节点安装nfs,并且挂到server1的/nfsshare

 在/nfsshare目录下写入数据

pod 可以成功访问

 PersistentVolume(持久卷) PV

 PersistentVolume(持久卷,简称PV)是集群内,由管理员提供的网络存储的一部分。就像集群中的节点一样,PV也是集群中的一种资源。它也像Volume一样,是一种volume插件,但是它的生命周期却是和使用它的Pod相互独立的。PV这个API对象,捕获了诸如NFS、ISCSI、或其他云存储系统的实现细节。 

PersistentVolumeClaim(持久卷声明,简称PVC)是用户的一种存储请求。它和Pod类似,Pod消耗Node资源,而PVC消耗PV资源。Pod能够请求特定的资源(如CPU和内存)。PVC能够请求指定的大小和访问的模式(可以被映射为一次读写或者多次只读)

有两种PV提供的方式:静态和动态。

PVC与PV的绑定是一对一的映射。没找到匹配的PV,那么PVC会无限期得处于unbound未绑定状态。

静态PV创建

server1中创建两个目录

在server1的/nfsshare/pv1写入数据

可以成功访问

NFS动态分配PV

StorageClass提供了一种描述存储类(class)的方法,不同的class可能会映射到不同的服务质量等级和备份策略或其他策略等。 

每个 StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段, 这些字段会在StorageClass需要动态分配 PersistentVolume 时会使用到。 

StorageClass的属性

 删除之前创建的pv目录,动态pv会自动创建

上传所需镜像到本地仓库

vim pvc.yaml
kubectl apply -f pvc.yaml
kubectl get pvc #获取pvc处于绑定状态
kubectl get pv
kubectl get pod
kubectl get pod -o wide
curl 10.244.141.236 #访问失败,因为没有默认发布页面
kubectl delete -f pvc.yaml #在删除pvc时会连pv一起删掉
kubectl get pod
kubectl get pvc
kubectl get pv

可以看到动态创建的目录,在目录地下写入数据

 访问成功

看到挂接的目录中变为回收打包状态

创建三个pvc之后目录动态更新

删除之后变为回收打包,手动删除

可以看到自动创建

删除pvc之后,目录自动清除

默认的 StorageClass 将被用于动态的为没有特定 storage class 需求的 PersistentVolumeClaims配置存储:(只能有一个默认StorageClass) 如果没有默认StorageClass,PVC 也没有指定storageClassName 的值,那么意味着它只能够跟 storageClassName的 PV 进行绑定。  

StatefulSet如何通过Headless Service维持Pod的拓扑状态

打开server1上nfs

 StatefulSet将应用状态抽象成了两种情况:

拓扑状态:应用实例必须按照某种顺序启动。新创建的Pod必须和原来Pod的网络标识一样

存储状态:应用的多个实例分别绑定了不同存储数据。 

StatefulSet给所有的Pod进行了编号,编号规则是:$(statefulset名称)-$(序号),从0开始。 

删除过程

 PV和PVC的设计,使得StatefulSet对存储状态的管理

 自动创建了三个存储目录

在目录中写入测试页,便于查看

唯一的标识

使用statefullset部署mysql主从集群:

部署 MySQL

MySQL 示例部署包含一个 ConfigMap、两个 Service 与一个 StatefulSet

这个无头服务给 StatefulSet 控制器为集合中每个 Pod 创建的 DNS 条目提供了一个宿主。 因为无头服务名为 mysql,所以可以通过在同一 Kubernetes 集群和命名空间中的任何其他 Pod 内解析 <Pod 名称>.mysql 来访问 Pod。

客户端服务称为 mysql-read,是一种常规服务,具有其自己的集群 IP。 该集群 IP 在报告就绪的所有MySQL Pod 之间分配连接。 可能的端点集合包括 MySQL 主节点和所有副本节点。

 

StatefulSet

 同时在共享的目录下生成mysql目录

 

vim mysql.yaml #加入clone-mysql 的 Init 容器
kubectl apply -f mysql.yaml

第二个名为 clone-mysql 的 Init 容器,第一次在带有空 PersistentVolume 的副本 Pod 上启动时,会在从属 Pod 上执行克隆操作。 这意味着它将从另一个运行中的 Pod 复制所有现有数据,使此其本地状态足够一致, 从而可以开始从主服务器复制。

MySQL 本身不提供执行此操作的机制,因此本示例使用了一种流行的开源工具 Percona XtraBackup。 在克隆期间,源 MySQL 服务器性能可能会受到影响。 为了最大程度地减少对 MySQL 主服务器的影响,该脚本指示每个 Pod 从序号较低的 Pod 中克隆。 可以这样做的原因是 StatefulSet 控制器始终确保在启动 Pod N + 1 之前 Pod N 已准备就绪

kubectl get pod #看到pod已经running
kubectl describe pod mysql-0 #查看详细信息
kubectl logs mysql-0 -c init-mysql #查看init-mysql的日志通过从 Pod 名称的末尾提取索引来确定自己的序号索引,而 Pod 名称由 hostname 命令返回。 然后将序数(带有数字偏移量以避免保留值)保存到 MySQL conf.d 目录中的文件 server-id.cnf
kubectl logs mysql-0 -c clone-mysql #查看clone-mysql,将从另一个运行中的 Pod 复制所有现有数据,使此其本地状态足够一致, 从而可以开始从主服务器复制。
kubectl logs mysql-0 -c xtrabackup#

kubectl run demo --image=mysql:5.7 --restart=Never -it bash执行

mysql -h mysql-0.mysql

#运行带有 mysql:5.7 镜像的临时容器并运行 mysql 客户端二进制文件, 将测试查询发送到 MySQL 主服务器(主机名 mysql-0.mysql)创建数据库,写入数据

 在server1上可以看到数据已经同步过来

 创建的westos数据库信息已经复制到从服务器

 

举报

相关推荐

k8s-存储卷

k8s-存储(volumes)

k8s-部署

k8s-权限管理

K8s-安全机制

k8s-安装dashboard

K8s-网络原理-下篇

0 条评论