中间件与容器
2023-05-09 15:03:08 0 举报
AI智能生成
中间件与容器
作者其他创作
大纲/内容
Prometheus
指标暴露
PushGateWay
Prometheus 再从这个网关里 Pull 指标
Exporter
指标抓取
Pull 模型
Push 模型
存储和可视化
内置的时序数据库
PromQL
监控告警
alertmanageer 基于 promql 来做系统的监控告警
工作原理
服务注册
静态注册:静态的将服务的 IP 和抓取指标的端口号配置在 Prometheus yaml 文件的 scrape_configs 配置下
动态注册:动态注册就是在 Prometheus yaml 文件的 scrape_configs 配置下配置服务发现的地址和服务名,Prometheus 会去该地址,根据你提供的服务名动态发现实例列表,在 Prometheus 中,支持 consul,DNS,文件,K8s 等多种服务发现机制。
配置更新
Metric 指标
serverless
faas (function as a service)
微虚机
Firecracker
docker
可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化,三个核心概念:镜像、容器、仓库
快速,一致地交付您的应用程序
允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期
响应式部署和扩展
基于容器的平台,允许高度可移植的工作负载,可移植性和轻量级的特性,实时扩展或拆除应用程序和服务
在同一硬件上运行更多工作负载
非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情
容器和虚拟机
每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用。每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。
容器技术是和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。
容器技术是实现操作系统虚拟化的一种途径,可以让您在资源受到隔离的进程中运行应用程序及其依赖关系。通过使用容器,我们可以轻松打包应用程序的代码、配置和依赖关系,将其变成容易使用的构建块,从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。容器可以帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。容器还赋予我们对资源更多的精细化控制能力,让我们的基础设施效率更高。通过下面这幅图我们可以很直观的反映出这两者的区别所在。
容器是怎么隔离的
容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。
Cgroups 技术是用来制造约束的主要手段
Namespace 技术则是用来修改进程视图的主要方法
基本概念
Image(镜像)
Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Container(容器)
Repository(仓库)
架构
Docker Client
Docker daemon
Docker Server
Engine
Job
命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
映射端口
docker run -p 容器外端口:容器内端口
挂载数据卷
docker run -v 容器外目录:容器内目录
传递环境变量
docker run -e 环境变量key:环境变量value
查看内容
docker inspect <容器id>
dockerfile
通过指令编排镜像,帮你自动化的构建镜像
vi: 编辑文本
FROM:从哪里导入
USER:用什么用户起
ENV:设置环境变量
RUN: 修改时区成中国时区'Asia/Shanghai'
WORKDIR:指定工作目录,这里指定的是之前ENV指定的WWW 目录,即是/usr/share/nginx/html
ADD:添加指定的东西进去
EXPOSE:暴露端口
CMD:指令的首要目的在于为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束
四种网络类型
Bridge contauner(NAT) 桥接式网络模式(默认)
None(Close) container 封闭式网络模式,不为容器配置网络
Host(open) container 开放式网络模式,和宿主机共享网络
Container(join) container 联合挂载式网络模式,和其他容器共享网络
进入容器
docker attach
SSH
nsenter
exec
sudo docker exec -it 775c7c9ee1e1 /bin/bash
日志
docker logs --tail 1000 456dec08f55f
desktop
wsl --update
docker-compose
docker-compose运行目录下的所有文件(docker-compose.yml文件、extends文件或环境变量等)组成一个工程,如无特殊指定,工程名即为当前目录名。
docker-compose是docker的独立产品,因此需要安装docker之后再单独安装docker compose。
配置字段
dockerfile
networks
links
images
seldon
seldon 通过将你的模型部署为K8S上的微服务,来提供 HTTP/GRPC 接口给业务调用。
基于 K8S 的集成的模型部署方案, 内置了很多通用的例如 tfserving、 sklearn server、mlflow server、triton这样的模型推理服务器(inference server)。除了这些还可以通过自己实现自定义的 inference server 提供一些额外的模型服务支持。
mq
ActiveMQ
RabbitMQ
convertAndSend
convertAndSend
convertSendAndReceive
当确认了所有的消费者都接收成功之后,才触发另一个convertSendAndReceive(…),也就是才会接收下一条消息。RPC调用方式
持久化
事务
高并发、持久化、支持集群、社区活跃、综合技术
client
client
Channel
basicAck
basicNack
顺序性
多个队列 或者单个消费
防止重复
幂等
为什么会重复
网络延迟
confirm模式
概念
Binding
一套绑定规则,用于告诉Exchange消息应该被存储到哪个Queue。
Exchange交换器
DIRECT
直连
FANOUT
广播
TOPIC
一个队列多个模糊匹配多个 routingkey
HEADERS
Queue
Routing Key
生产者在向Exchange发送消息时,需要指定一个Routing Key来设定该消息的路由规则。 Routing Key需要与Exchange类型及Binding Key联合使用才能生效
由于消费者读取消息之后可能会把消息放回(或者重传)到队列中(例如,处理失败的情况),这样就会导致消息的顺序无法保证。
当开发复杂的软件系统时,我们可能被诱导使用同一个消息平台去实现所有必须的消息用例。但是,从我的经验看,通常同时使用这两个消息平台能够带来更多的好处。
例如,在一个事件驱动的架构系统中,我们可以使用RabbitMQ在服务之间发送命令,并且使用Kafka实现业务事件通知。
原因是事件通知常常用于事件溯源,批量操作(ETL风格),或者审计目的,因此Kafka的消息留存能力就显得很有价值。
相反,命令一般需要在消费者端做额外处理,并且处理可以失败,所以需要高级的容错处理能力。
virtual host
RocketMQ
Kafka(见hadoop分支)
经验
AMQP协议
amqp的事务机制
为什么用
解耦、异步、削峰
缺点
系统可用性降低
系统复杂度提高
一致性问题
高可用
重复消费
幂等性
Elasticsearch
基本概念
索引
类型
文档
元数据
_index
_type
_id
词条(Term)
索引里面最小的存储和查询单元,对于英文来说是一个单词,对于中文来说一般指分词后的一个词。
词典(Term Dictionary)
或字典,是词条 Term 的集合。搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
倒排表(Post list)
一个文档通常由多个词组成,倒排表记录的是某个词在哪些文档里出现过以及出现的位置。
倒排文件(Inverted File)
所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件被称之为倒排文件,倒排文件是存储倒排索引的物理文件。
映射(Mapping)
映射是用于定义 ES 对索引中字段的存储类型、分词方式和是否存储等信息,就像数据库中的 Schema ,描述了文档可能具有的字段或属性、每个字段的数据类型。
Text
Text 用于索引全文值的字段,例如电子邮件正文或产品说明。这些字段是被分词的,它们通过分词器传递 ,以在被索引之前将字符串转换为单个术语的列表。
分析过程允许 Elasticsearch 搜索单个单词中每个完整的文本字段。文本字段不用于排序,很少用于聚合。
Keyword
Keyword 用于索引结构化内容的字段,例如电子邮件地址,主机名,状态代码,邮政编码或标签。它们通常用于过滤,排序,和聚合。Keyword 字段只能按其确切值进行搜索。
搜索
确切值
全文文本
将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。
倒排索引
由文档中出现的唯一单词列表以及每个单词在文档中的位置决定
每个文档都有一个对应的文档 ID,文档内容被表示为一系列关键词的集合。例如,文档 1 经过分词,提取了 20 个关键词,每个关键词都会记录它在文档中出现的次数和出现位置。
倒排索引就是关键词到文档 ID 的映射,每个关键词都对应着一系列的文件,这些文件中都出现了关键词。
must
should
must not
写数据
客户端选择一个 node 发送请求过去,这个 node 就是 coordinating node(协调节点)
shard = hash(document_id) % (num_of_primary_shards)
coordinating node 对 document 进行路由,将请求转发给对应的 node(有 primary shard)。[路由的算法是?]
当分片所在的节点接收到来自协调节点的请求后,会将请求写入到Memory Buffer,然后定时(默认是每隔1秒)写入到Filesystem Cache,这个从Momery Buffer到Filesystem Cache的过程就叫做refresh;
flush
当然在某些情况下,存在Momery Buffer和Filesystem Cache的数据可能会丢失,ES是通过translog的机制来保证数据的可靠性的。其实现机制是接收到请求后,同时也会写入到translog中,当Filesystem cache中的数据写入到磁盘中时,才会清除掉,这个过程叫做flush;
flush触发的时机是定时触发(默认30分钟)或者translog变得太大(默认为512M)时;
lucene
lucene 就是一个 jar 包,里面包含了封装好的各种建立倒排索引的算法代码
全文检索引擎
更新和删除文档
更新和删除文档
磁盘上的每个段都有一个相应的.del文件。当删除请求发送后,文档并没有真的被删除,而是在.del文件中被标记为删除。该文档依然能匹配查询,但是会在结果中被过滤掉。当段合并时,在.del文件中被标记为删除的文档将不会被写入新段。
在新的文档被创建时,Elasticsearch会为该文档指定一个版本号,当执行更新时,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。
集群
发现机制
ES 内部是如何通过一个相同的设置 cluster.name 就能将不同的节点连接到同一个集群的?答案是 Zen Discovery。
存储原理
优化
translog flush
默认设置下,translog 的持久化策略为:每个请求都flush:
refresh_interval
默认情况下索引的refresh_interval为1秒,这意味着数据写1秒后就可以被搜索到,每次索引的 refresh 会产生一个新的 lucene 段,这会导致频繁的 segment merge 行为,如果你不需要这么高的搜索实时性,应该降低索引refresh 周期
分词器
中文分词
中文分词有特定的难点,不像英文,单词有自然的空格作为分隔,在中文句子中,不能简单地切分成一个个的字,而是需要分成有含义的词
ik
支持自定义词库,支持热更新分词字典
jieba
Python 中最流行的分词系统,支持分词和词性标注
THULAC
清华大学自然语言处理和社会人文计算实验室的一套中文分词器
Standard Analyzer - 默认分词器,按词切分,小写处理
Simple Analyzer - 按照非字母切分(符号被过滤),小写处理
Stop Analyzer - 小写处理,停用词过滤(the ,a,is)
Whitespace Analyzer - 按照空格切分,不转小写
Keyword Analyzer - 不分词,直接将输入当做输出
Pattern Analyzer - 正则表达式,默认 \W+
Language - 提供了 30 多种常见语言的分词器
Customer Analyzer - 自定义分词器
Logstash
Kibana
Kubernetes
WHAT:用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制
概念
Pod
Pod可运行的原子
Name
namespace
Label
Label选择器
Ingress
Ingress是K8S集群里工作在OSI网络参考模型下,第7层的应用,对外暴露的接口
Service只能进行L4流量调度,表现形式是ip+port
架构
kubelet
连接master和node之间的桥梁、负责维护pod和容器的生命周期,监听到master下发的任务、创建、更新、停止pod等任务
Master节点组件(三节点)
etcd
分布式K-V数据库
保存了整个集群的状态
raft算法
apiserver
提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
controller manager
控制器的管理者、内部管理控制中心
负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
replication controller
node controller
deployment controller
ndpoint controller
scheduler
负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
worker Node
Container runtime
负责镜像管理以及Pod和容器的真正运行(CRI)
docker
kube-proxy
负责为Service提供cluster内部的服务发现和负载均衡
在node上实现pod网络代理
分层架构
核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
接口层:kubectl命令行工具、客户端SDK以及集群联邦
生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等
安装
(DNS服务)
给K8S里的容器绑host,所以我们必须做一个DNS,然后容器服从我们的DNS解析调度
签发证书环境
部署docker环境
部署harbor仓库
harbor仓库是可以部署到本地的私有仓库,也就是你可以把镜像推到这个仓库,然后需要用的时候再下载下来,这样的好处是:1、下载速度快,用到的时候能马上下载下来2、不用担心镜像改动或者下架等。
安装部署主控节点服务etcd
部署API-server集群
安装部署主控节点L4反代服务
安装部署controller-manager(节点控制器/调度器服务)
安装部署运算节点服务(kubelet)
安装部署运算节点服务(kube-proxy)
安装部署flanneld
通过给每台宿主机分配一个子网的方式为容器提供虚拟网络(覆盖网络),该网络中的结点可以看作通过虚拟或逻辑链路而连接起来的
集群宿主机/容器之间必须是互通的
flannel之SNAT规则优化
安装部署coredns(服务发现)
服务(应用)之间相互定位的过程
K8S的服务暴露ingress
把用户的请求转发至指定Service资源的规则
用户访问流程
当用户输入traefik.od.com时,被dns解析到10.4.7.10,而10则在11上,去找L7层服务,而反代配置的od.com.conf,则是将*.od.com无差别的抛给了ingress,ingress则通过noteselect找到pod
dashboard安装部署
向企业展示度量信息和关键业务指标(KPI)现状的数据虚拟化工具
K8S结合CI&CD持续交付和集中管理配置
安装部署Jenkins
安装蓝海
从仪表板到各个Pipeline运行的查看分支和结果,使用可视编辑器修改Pipeline作为代码
借助BlueOcean插件回顾Jenkins流水线构建
安装maven
K8S集群毁灭性测试
Promtheus监控k8s企业家应用
spinnaker
服务发现
背景
每一个pod都会有自己的容器组ip,集群内通过容器Ip和端口可直接访问.
服务重启pod销毁重建ip会变动,通过service实现服务通信
定义
selector
service代理的pod选择器
具有APP这个标签的选择器的一组pod,可以通过service这个统一的访问入口去做服务发现
集群内其他pod访问service三种方式
通过clusterIp+port直接去访问
同一个namespace直接访问服务名
不同的 namespace 里面,我们可以通过 service 名字加“.”kube-dns可以解决Service的发现问题,
k8s将Service的名称当做域名注册到kube-dns中,通过Service的名称就可以访问其提供的服务。
通过环境变量访问,在同一个 namespace 里的 pod 启动时,kubelet 会为每个活跃的 Service 添加一组环境变量,会把 service 的一些 IP 地址、端口,以及一些简单的配置,通过环境变量的方式放到 K8s 的 pod 里面。因此我们可以通过环境变量去直接访问。
Service 暴露在一个外部 IP 地址上
NodePort
LoadBalancer
命令
查看 kube-dns 的服务详情
kubectl get svc kube-dns -n kube-system
kubeflow 机器学习(ML)工作流程
使用GPU
k8s device plugin
不支持GPU的共享和隔离
Helm
包管理工具
主流的Kubernetes集群管理平台
rancher
Rancher的核心竞争力在于其强大的多集群管理能力,提供了极其简便的K8s部署及管理能力。同时提供了集成开源监控、日志、Git CI的能力,虽然学习成本较高,但提供了一站式的解决方案,对运维更加友好。
提供Kubernetes、Mesos和Swarm三种调度工具的企业级分发版和商业技术支持的容器管理平台
Kubesphere
KubeSphere定位是以应用为中心的容器平台,提供简单易用的操作界面,一定程度上降低了学习成本,同时集成了原生istio等功能,更加符合开发的使用习惯。
0 条评论
下一页