PV&PVC&HeadlessService

4.1、什么是无状态/有状态服务?

无状态服务

1、没有实时的数据需要存储 (即使有,也是静态数据)

2、服务集群网络中,拿掉一个服务后,一段时间后,加入这个服务,对服务集群没有任何影响。

比如:

目前开发应用程序(Java代码)

有状态服务

1、有实时的数据需要存储

2、服务集群网络中,拿掉一个服务后,一段时间后,加入这个服务,对服务集群有一定的影响(数据完整性,一致性)

比如:

关系型数据库(mysql、sqlserver)

4.2、服务部署

4.2.1、无状态服务部署

kubernetes部署无状态服务,部署架构,形态:对于无状态服务部署的几个关键对象:Deployment、ReplicaSet、Pod.

4.2.2、有状态服务部署

在kubernetes中,服务部署的最小单元都是POD;对于部署有状态服务,必须对POD容器的数据存储做持久化处理。需要引入PV(persistent volume)PVC(persistent volume claim)、磁盘等存储器。

4.3、Volume 数据卷

https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/config-and-storage-resources/volume/#local-temporary-directory

4.3.1 数据卷结构



Volume数据卷生命周期:(volume数据卷是kubernetes资源对象,本身并不存储数据,而仅仅是提供把数据挂载到容器中的能力)

1、pod内部容器宕机,volume数据卷及数据不会丢失;

2、pod宕机,此时volume数据卷消失了,数据也丢失了,重建的pod无法找回数据了。



Volume 数据卷是Kubernetes抽象出来的一个资源对象,它本身不存储数据,它主要实现数据挂载(把不同存储介质中的数据给挂载到pod内部容器中)

4.3.2 数据卷的类型

4.3.3 本地挂载卷

  1. emptyDir 数据卷空挂载方式



    验证:进入容器内部,发现有/cache目录,但是没有数据



    2)hostpath 磁盘挂载方式:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# 宿主上目录位置
path: /data
# 此字段为可选
type: Directory

4.3.4 网络存储卷

1)首先自行安装一台nfs服务器。

2)yaml文件

apiVersion: v1
kind: Pod
metadata:
name: nfs
spec:
containers:
- image: harbor.hyz.com/library/mynginx:v1
name: test-vo
volumeMounts:
- mountPath: /cache
name: test-nfs
volumes:
- name: test-nfs
nfs:
server: 192.168.211.13
path: /data/harbor

4.3、configmap

4.3.1 什么是configmap?

ConfigMap是k8s提供的一个配置中心,类似于微服务架构中(nacos,zookeeper)配置中心服务,用来存储一些配置文件。

例如:

1、部署Redis服务,可以把redis.conf配置文件存储在configmap资源对象中;

2、部署mysql服务,可以把my.cnf配置文件存储在configmap资源对象中。

ConfigMap资源对象存储结构:key-value模式,key是关键字符,value可以是字符串,也可以是一个文件内容。

4.3.2 创建configmap

Examples:
# Create a new configmap named my-config based on folder bar
kubectl create configmap my-config --from-file=path/to/bar # Create a new configmap named my-config with specified keys instead of file basenames on disk
kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt # Create a new configmap named my-config with key1=config1 and key2=config2
kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2 # Create a new configmap named my-config from the key=value pairs in the file
kubectl create configmap my-config --from-file=path/to/bar # Create a new configmap named my-config from an env file
kubectl create configmap my-config --from-env-file=path/to/bar.env

1、根据目录创建

kubect create cm my-config-1 --from-file=/data/config

2、根据文件创建

kubectl create cm my-config-2 --from-file=/data/config/application.yml

3、根据字面量(key-value)创建

kubectl create cm my-config-3 --from-literal=key=value1 --from-literal=key2=value2

4.3.3 Pod服务引用

1)使用单个 ConfigMap 中的数据定义容器环境变量

apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: harbor.hyz.com/library/mynginx:v1
command: [ "/bin/sh", "-c", "env" ]
env:
# 定义环境变量
- name: SPECIAL_LEVEL_KEY
valueFrom:
configMapKeyRef:
# ConfigMap 包含你要赋给 SPECIAL_LEVEL_KEY 的值
name: special-config
# 指定与取值相关的键名
key: special.how
restartPolicy: Never

经过测试:发现成功的把configmap中数据引入到环境变量中;



2)volume方式挂载:

apiVersion: v1
kind: Pod
metadata:
name: cm-volume
spec:
containers:
- image: harbor.hyz.com/library/mynginx:v1
name: test-container
command: [ "/bin/sh", "-c", "sleep 600s" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: my-config-2

查看容器内部是否挂载成功:



my-config-2中的4个文件都挂载成功。

4.3.4 POD数据热更新

修改ConfigMap中的数据,pod服务能够马上察觉到。

4.4、Secret

4.4.1 Secret是什么?

Secret是kubernetes本地数据卷的一种,secret提供存储敏感数据的一种服务,用来把敏感存储secret对象中,保证服务的安全性。

具体作用:防止一些敏感数据直接保证服务镜像中;例如:token, 秘钥,密码等等。当pod需要这些数据的时候,动态的从secret资源对象中加载即可。

4.4.2 k8s认证方式

Secret有4种类型:

  • Service Account :用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中;



  • Opaque :base64编码格式的Secret,用来存储密码、密钥、信息、证书等,类型标识符为generic;

  • kubernetes.io/dockerconfigjson :用来存储私有docker registry的认证信息,类型标识为docker-registry。

  • kubernetes.io/tls:用于为SSL通信模式存储证书和私钥文件,命令式创建类型标识为tls。



当我们采用rest风格访问k8s api时,需要携带一些鉴权信息,比如token\ca证书\账号密码等,之后每台Node节点会根据鉴权信息去master鉴权。

4.4.3 Secret使用

[root@k8s-master01 stateful]# echo -n "admin" | base64
YWRtaW4=
[root@k8s-master01 stateful]# echo -n "abcdefgh" | base64
YWJjZGVmZ2g= apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: YWJjZGVmZ2g=
username: YWRtaW4=

4.4.4 pod服务引用

apiVersion: v1
kind: Pod
metadata:
name: secret-test
labels:
name: secret-test
spec:
volumes:
- name: secrets
secret:
secretName: mysecret
containers:
- image: harbor.hyz.com/library/mynginx:v1
name: test-container
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
readOnly: true

验证:进入容器/etc/secrets目录下,打印username, password属性



确实是我们进行加密后的2个源字符串。

4.5、PV(persistent volume)

4.5.1 PV是什么?

Pv持久化数据卷,是用来让服务和存储介质解耦(让volume数据卷和底层的存储介质进行解耦,volume数据卷消失了,但是pv不会消失,pv和pod没有强关联,当pod被重构后,根据hostname不变性,从而可以再次找回数据,保证数据的不丢失),因此为了部署有状态服务,kubernetes抽象出来了一个PV持久化数据资源对象,k8s可以自由的控制这个资源对象,其作用就是屏蔽掉底层复杂的存储介质的操作,使得kubernetes管理持久化的数据卷更加高效,简单。

4.5.2 pv原理

企业中服务部署需要存储数据:前期规划数据大小,需要多少存储空间?? 然后由运维帮助创建持久化数据卷,根据需求大小进行创建.



可以把pv对象看做一个一个虚拟存储块,是一种虚拟化的概念,在逻辑上实现对物理资源隔离,同时实现对底层物理存储介质的抽象,使得k8s更加方便的管理存储空间,想使用哪个存储块,由k8s实现自由的调度。



Pv是k8s抽象出来的资源对象,k8s自由控制自己的资源对象

Pv存储块是根据业务需求,事先由运维先规划,创建好存储块,项目需要,从存储块中获取数据即可。

问题: 创建pod服务时候,需要存储数据,但是pv存储对象有上万个,pod应该是哪个pv存储块?

4.5.3 PVC匹配PV

Pvc(persistent volume claim) 持久化的数据卷声明卷,代理pod发送请求,帮助pod匹配一个合适的pv对象;



疑问:pvc是如何找到合适的pv资源对象?



创建pod服务的时候,存储数据,绑定一合适的pv对象:

1、向pvc发出请求,让pvc帮助我们选择一个合适的pv存储块

2、pvc发送申请请求,请求匹配一个合适的pv存储对象,匹配方式如下:

1)、访问大小

2)、访问方式

4.6 PV&PVC 案例

4.6.1 创建PV对象

1)创建Pv1

apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv1
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /opt/hyz
server: 192.168.66.13

2)创建pv2

apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv2
spec:
capacity:
storage: 7Gi
accessModes:
- ReadWriteMany
nfs:
path: /opt/hyz
server: 192.168.66.13

4.6.2 创建Pod对象

apiVersion: v1
kind: Pod
metadata:
name: pv-pod
spec:
containers:
- image: harbor.hyz.com/library/mynginx:v1
name: test-container
ports:
- containerPort: 80
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumes:
- name: www
persistentVolumeClaim:
claimName: my-pvc

4.6.3 创建pvc对象

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteMany
resources:
request:
storage: 5Gi

4.6.4 挂载流程

4.7 headlessService

HeadlessService : 字面意思: 无头服务,内涵含义:没有ip地址的Service; 也就是说对于有状态服务部署来说,使用的是headlessService, 不会给service分配ip地址;

HeadlessService作用就是把后端服务的ip地址暴露给前端,便于客户端使用。

4.8 storageClass

根据需求: 创建pv存储块对象,可以想象:在开发中,需要大量的存储块,如果使用人工创建,非常低效,且没有含金量。

因此根据解放生产力指标:让pv按需动态创建,再也不需要人为的方式创建。使用storageclass实现pv对象动态创建。



Storageclass 动态创建pv存储块实现的部署方案:



要想实现pv按需动态创建,那必须先完成环境配置:

1、安装storageclass

2、安装persistent volume provisioner

k8s之有状态服务部署基石(基础知识)的更多相关文章

  1. 吾八哥学k8s(二):golang服务部署到kubernetes

    本篇主要讲解如何将golang的服务部署到kubernetes集群里,附带相关的golang的demo和yml文件内容.纯新手入门方式,生产服务需要完整的CI/CD流程来支持. golang服务代码 ...

  2. K8S的安装部署以及基础知识

    Kubernetes(K8S)概述 Kubernetes又称作k8s,是Google在2014年发布的一个开源项目. 最初Google开发了一个叫Borg的系统(现在命名为Omega),来调度近20多 ...

  3. kubernetes有状态集群服务部署与管理

    有状态集群服务的两个需求:一个是存储需求,另一个是集群需求.对存储需求,Kubernetes的解决方案是:Volume.Persistent Volume .对PV,除了手动创建PV池外,还可以通过S ...

  4. io型和有状态的应用不放入k8s,而是做服务映射

    io型和有状态的应用不放入k8s,而是做服务映射 待办 在实际应用中,一般不会把mysql这种重IO.有状态的应用直接放入k8s中,而是使用专用的服务器来独立部署.而像web这种无状态应用依然会运行在 ...

  5. Kubernetes如何支持有状态服务的部署?

    作者:Jack47 转载请保留作者和原文出处 PS:如果喜欢我写的文章,欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. Kubernetes对无状态服务有完善的支持 ...

  6. 使用IIS服务器部署网页,需要开启服务里的“ASP.NET 状态服务”

    否则会提示“请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同.如果服务器位于远程计算机上,请检查 HKEY_LOCAL_MACHI ...

  7. Linux基础学习-使用iSCSI服务部署网络存储

    使用iSCSI服务部署网络存储 iSCSI技术实现了物理硬盘设备与TCP/IP网络协议的相互结合,使得用户可以通过互联网方便地访问远程机房提供的共享存储资源.下面介绍如何在Linux上部署iSCSI服 ...

  8. 《两地书》--Kubernetes(K8s)基础知识(docker容器技术)

    大家都知道历史上有段佳话叫“司马相如和卓文君”.“皑如山上雪,皎若云间月”.卓文君这么美,却也抵不过多情女儿薄情郎. 司马相如因一首<子虚赋>得汉武帝赏识,飞黄腾达之后便要与卓文君“故来相 ...

  9. 微服务实战(六):选择微服务部署策略 - DockOne.io

    原文:微服务实战(六):选择微服务部署策略 - DockOne.io [编者的话]这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺点.随后的文章讨论了微服务不同 ...

随机推荐

  1. windows批处理执行图片爬取脚本

    背景 由于测试时需要上传一些图片,而自己保存的图片很少. 为了让测试数据看起来不那么重复,所以网上找了一个爬虫脚本,以下是源码: 1 import requests 2 import os 3 4 c ...

  2. selenium模块获得js动态数据-17track为例

    通过selenium模块驱动Chrome浏览器,获得js动态数据,以17track为例:通过运单号查询最新的物流信息 1 import re 2 from time import sleep 3 fr ...

  3. openlayers API实现鹰眼图OverviewMap时地图不断闪烁等问题的解决思路

    前言:我吐了,OpenLayers的巨坑之一--鹰眼图OverviewMap创建之必备注意事项. 许久没有更新博客的我,在今天饱受折磨之后一定要分享一下(这么过分一定要说出来.jpg) 相信大家如果使 ...

  4. mask-image实现聚光灯效果

    大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...

  5. python matplotlib在mac os x 中如何显示中文,完美解决

    一. 下载相关的中文字体 simhei 文件: 下载地址 二.通过以下代码查找matplotlib的数据存放位置: import matplotlib print(matplotlib.matplot ...

  6. Nginx实战|Nginx健康检查

    开源Linux 长按二维码加关注~ 上一篇:盘点提高国内访问Github的速度的9种方案 服务治理的一个重要任务是感知服务节点变更,完成服务自动注册及异常节点的自动摘除.这就需要服务治理平台能够:及时 ...

  7. MVC 与 Vue

    MVC 与 Vue 本文写于 2020 年 7 月 27 日 首先有个问题:Vue 是 MVC 还是 MVVM 框架? 维基百科告诉我们:MVVM 是 PM 的变种,而 PM 又是 MVC 的变种. ...

  8. 如何定制.NET6.0的日志记录

    在本章中,也就是整个系列的第一部分将介绍如何定制日志记录.默认日志记录仅写入控制台或调试窗口,这在大多数情况下都很好,但有时需要写入到文件或数据库,或者,您可能希望扩展日志记录的其他信息.在这些情况下 ...

  9. 1.Spring开发环境搭建——intellj

    1.在intellj中新建项目,选择JDK版本(1.8版本) 2.选择相关信息填写,注意Java版本要和上面步骤选择的版本一致. 3.选择springBoot版本,勾选Spring Web选项. 4. ...

  10. 一文看懂 ZooKeeper ,面试再也不用背八股(文末送PDF)

    ZooKeeper知识点总结 一.ZooKeeper 的工作机制 二.ZooKeeper 中的 ZAB 协议 三.数据模型与监听器 四.ZooKeeper 的选举机制和流程 本文将以如下内容为主线讲解 ...