一 k8s 理论前言
(一)微服务是什么
微服务是一种软件架构风格,它将一个大型复杂的应用程序拆分成一组小型、自治的服务。每个服务都围绕着特定的业务功能进行构建,可以独立部署、运行和扩展,服务之间通过API(通常是RESTful API)进行通信。这种架构模式强调模块化、松耦合和领域驱动设计原则。
1,应用场景
微服务架构适用于以下场景:
- 复杂系统:当应用程序变得非常庞大,包含众多功能模块,维护和扩展困难时,采用微服务可以将系统分解为更易于管理的部分。
- 敏捷开发:需要快速迭代和频繁部署的环境,每个服务可以由独立的团队开发和维护,加速开发周期。
- 水平扩展:系统需要根据负载动态调整资源,每个服务可以根据需求独立扩展。
- 技术多样性:不同服务可以根据其需求选择最适合的技术栈,提高开发效率和系统性能。
- 组织结构:大型组织或企业,不同部门或团队负责不同业务领域,微服务架构与其组织结构自然契合。
2,API 是什么
API,全称为Application Programming Interface,即应用程序编程接口,是一系列规则、协议和工具的集合,它们定义了软件应用程序之间如何相互交流。API规定了不同软件组件应如何相互作用,允许开发者构建能够与现有服务、操作系统、硬件或其他软件无缝协作的应用程序,而无需了解其底层实现细节。
API的核心作用在于提供模块化功能,它将复杂的系统、库、框架或服务的功能封装起来,暴露给外部调用者一个简单、标准的接口。开发者通过调用API中的预定义函数或方法,可以访问和控制这些功能,从而实现特定任务,如数据检索、文件操作、设备控制等。
API的常见应用场景包括:
- 数据共享与集成:例如,社交媒体平台通过API允许第三方应用访问用户数据或发布内容。
- 云服务访问:云服务商提供API,使得开发者能管理云资源,如创建虚拟机、存储数据或处理消息队列。
- 操作系统功能调用:操作系统提供API供应用程序调用,以实现文件读写、网络通信等功能。
- Web服务交互:RESTful API、SOAP等Web服务API使得不同系统之间可以通过HTTP协议交换数据。
- 硬件设备控制:硬件制造商提供API,使得软件可以控制特定硬件设备,如打印机、传感器等。
API的使用显著提高了软件开发的效率和灵活性,促进了技术生态的协同与创新。
(二),微服务 如何做版本迭代
在微服务架构中,Docker为版本迭代提供了便利的环境隔离和标准化部署方式。下面是利用Docker进行微服务版本迭代的关键步骤和实践:
1. Docker镜像构建
- Dockerfile:为每个微服务编写Dockerfile,详细描述服务的运行环境、依赖库和启动命令。这确保了构建过程的一致性和可重复性。
- 多阶段构建:使用Docker的多阶段构建特性,可以更高效地构建镜像,减少最终镜像的大小,仅包含运行服务所需的最小依赖。
2. 版本标记
- 在构建镜像时,为每个版本的镜像打上明确的标签,例如
<service-name>:v1.0.0
,便于管理和追溯版本。
3. Docker Registry
- 将构建好的镜像推送到私有或公有的Docker Registry,如Docker Hub、Harbor或Google Container Registry。这使得新版本镜像在部署环境中可获取。
4. 环境一致性
- 利用Docker容器,确保开发、测试和生产环境的一致性。相同的镜像可以在任何支持Docker的环境中运行,减少了因环境差异导致的问题。
5. 滚动更新与蓝绿部署
- Docker Compose:对于小型部署,可以使用Docker Compose文件定义服务、网络和卷,通过更新Compose文件并重启服务来实现版本迭代。
- Kubernetes (k8s):在Kubernetes集群中,可以利用Deployment资源进行滚动更新,自动逐步替换旧版本的Pod为新版本Pod,同时保持服务可用性。
- 滚动更新策略:设置最大不可用Pod数量、更新间隔时间等参数,细粒度控制更新过程。
- Blue/Green Deployment:在Kubernetes中通过创建新Deployment并逐渐切流至新服务,最后清理旧版本资源。
6. 健康检查与就绪检查
- 配置健康检查和就绪检查,确保新部署的服务实例在接收到流量前已经准备就绪,减少服务中断风险。
7. 日志与监控
- 集成日志收集和监控系统,如Fluentd、Prometheus,实时监控新版本服务的性能和异常,快速响应问题。
8. 版本回滚
- 在Docker和Kubernetes中,提供一键回滚机制,当新版本出现问题时,快速恢复到之前的稳定版本。
综上,Docker通过提供标准化的构建、部署和管理流程,极大地简化了微服务的版本迭代过程,增强了部署的灵活性和可靠性。
(三)什么是 蓝绿部署/金丝雀发布
- 蓝绿部署:维护两个相同的生产环境(蓝环境和绿环境)。新版本首先部署到非活跃环境(比如蓝环境),完成部署并验证无误后,通过切换路由或负载均衡器配置,将流量从旧环境(绿环境)无缝转移到新环境。
- 金丝雀发布:逐步将新版本部署到一部分用户或服务器上,监控性能和错误率。如果一切正常,逐渐扩大新版本的覆盖范围,直至完全替换旧版本。
(四) 云原生 介绍
云原生(Cloud Native)是一种构建和运行应用程序的方法论和一整套技术实践,旨在充分利用云计算的优势,如弹性伸缩、分布式处理能力以及自动化管理等。它强调应用程序从设计之初就应该考虑到云环境的特点,使得应用能够更好地在云平台上部署、运行和管理。云原生的核心要素和技术栈包括但不限于:
- 容器化(Containerization):利用如Docker这样的技术,将应用程序及其依赖打包成轻量级、可移植的容器,这有助于实现快速、一致的部署和扩展。
- 微服务(Microservices):将大型的应用程序拆分成一组小型、独立的服务,每个服务负责特定的功能,可以独立部署和扩展。这种架构促进了敏捷开发和持续集成/持续部署(CI/CD)。
- DevOps:结合开发(Development)和运维(Operations)的最佳实践,通过自动化工具和流程,加快软件交付和基础设施变更的速度,同时保证高质量。
- 持续交付/持续部署(Continuous Delivery/Continuous Deployment, CD):实现软件开发到生产的快速、自动化的流程,提高软件发布的频率和可靠性。
- 声明式API:允许开发者声明他们希望的系统状态,而非详细步骤,系统自动管理达到这一状态的过程,简化配置和运维。
- 服务网格(Service Mesh):如Istio或Linkerd,它们提供了服务间通信的抽象层,管理服务发现、负载均衡、加密通信、监控和故障恢复等功能,使得服务间交互更为灵活和安全。
- 自动化管理与编排:使用如Kubernetes这样的平台进行容器编排,自动管理应用的部署、扩展和运行时状态,提升系统的弹性和可用性。
云原生不仅仅关注技术栈,还涉及文化和组织结构的转变,鼓励快速迭代、团队自治、责任共担以及对失败的容忍。云原生的实践有助于企业更快地响应市场变化,提高软件开发和运维的效率。
(五) 为什么 tomcat 不建议放在docker 里
传统框架
tomcat将 打包好的Java Web应用程序,可以直接部署到Tomcat服务器上运行 作为后端的动态资源处理
k8s 框架
将打包好的Java Web应用程序 利用dockerfile加封到 jdk的镜像上,并启动容器
不需要tomcat 直接可以作为后端的动态资源处理
(六) 生产环境架构
二 k8s 理论·介绍
(一) k8s 是什么
K8S 是 Kubernetes 的缩写( Kubernetes (K12345678S))是一个开源的容器管理系统,最初由 Google 设计并开发,现在由 Cloud Native Computing Foundation (CNCF) 维护。Kubernetes 旨在自动化容器化应用程序的部署、扩展和管理,不论是在本地、数据中心还是在云端环境中。
官网: https://kubernetes.io GitHub: https://github.com/kubernetes/kubernetes
(二)k8s 作用
用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。
可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如 Docker)的集群,是一个生态极其丰富的容器编排框架工具。
(三)k8s 由来
K8S由google的Borg系统(博格系统,google内部使用的大规模容器编排工具)作为原型,后经GO语言延用Borg的思路重写并捐献给CNCF基金会开源。
(四)为什么要用k8s
1, 传统后端 部署的弊端
试想下传统的后端部署办法:把程序包(包括可执行二进制文件、配置文件等)放到服务器上,接着运行启动脚本把程序跑起来,同时启动守护脚本定期检查程序运行状态、必要的话重新拉起程序。
设想一下,如果服务的请求量上来,已部署的服务响应不过来怎么办?传统的做法往往是,如果请求量、内存、CPU超过阈值做了告警,运维人员马上再加几台服务器,部署好服务之后,接入负载均衡来分担已有服务的压力。
这样问题就出现了:从监控告警到部署服务,中间需要人力介入!那么,有没有办法自动完成服务的部署、更新、卸载和扩容、缩容呢?
而这就是 K8S 要做的事情:自动化运维管理容器化(Docker)程序。
2,K8S 解决了裸跑Docker 的若干痛点
●单机使用,无法有效集群
●随着容器数量的上升,管理成本攀升
●没有有效的容灾、自愈机制
●没有预设编排模板,无法实现快速、大规模容器调度
●没有统一的配置管理中心工具
●没有容器生命周期的管理工具
●没有图形化运维管理工具
(五) K8S 功能
K8S是Google开源的容器集群管理系统,在Docker等容器技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。 其主要功能如下:
●使用 Docker 等容器技术对应用程序包装(package)、实例化(instantiate)、运行(run)。
●以集群的方式运行、管理跨机器的容器。
●解决 Docker 跨机器容器之间的通讯问题。
●K8S 的自我修复机制使得容器集群总是运行在用户期望的状态。
(六)K8S 的特性
●弹性伸缩
使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
●自我修复
在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检査失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
●服务发现和负载均衡
K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
●自动发布(默认滚动发布模式)和回滚
K8S采用滚动更新策略更新应用,一次更新一个或者部分Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不影响业务。
●集中化配置管理和密钥管理
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。
●存储编排,支持外挂存储并对外挂存储资源进行编排
挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、Glusterfs、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
●任务批处理运行
提供一次性任务,定时任务;满足批量数据处理和分析的场景。
(七)Kubernetes 集群架构与组件
K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责集群的调度、管理和运维,Slave 节点是集群中的运算工作负载节点。
在 K8S 中,主节点一般被称为 Master 节点,而从节点则被称为 Worker Node 节点,每个 Node 都会被 Master 分配一些工作负载。
Master 组件可以在群集中的任何计算机上运行,但建议 Master 节点占据一个独立的服务器。因为 Master 是整个集群的大脑,如果 Master 所在节点宕机或不可用,那么所有的控制命令都将失效。除了 Master,在 K8S 集群中的其他机器被称为 Worker Node 节点,当某个 Node 宕机时,其上的工作负载会被 Master 自动转移到其他节点上去。
(八) 核心组件
1,架构图
2,Master 组件
2.1 Kube-apiserver
用于暴露 Kubernetes API,任何资源请求或调用操作都是通过 kube-apiserver 提供的接口进行。以 HTTP Restful API 提供接口服务,所有对象资源的增删改查和监听操作都交给 API Server 处理后再提交给 Etcd 存储。
可以理解成 API Server 是 K8S 的请求入口服务。API Server 负责接收 K8S 所有请求(来自 UI 界面或者 CLI 命令行工具), 然后根据用户的具体请求,去通知其他组件干活。可以说 API Server 是 K8S 集群架构的大脑。
2.2 Kube-controller-manager
运行管理控制器,是 K8S 集群中处理常规任务的后台线程,是 K8S 集群里所有资源对象的自动化控制中心。
在 K8S 集群中,一个资源对应一个控制器,而 Controller manager 就是负责管理这些控制器的。
由一系列控制器组成,通过 API Server 监控整个集群的状态,并确保集群处于预期的工作状态,比如当某个 Node 意外宕机时,Controller Manager 会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
这些控制器主要包括:
2.21 Node Controller(节点控制器)
负责在节点出现故障时发现和响应。
2.22 Replication Controller(副本控制器)
负责保证集群中一个 RC(资源对象 Replication Controller)所关联的 Pod 副本数始终保持预设值。可以理解成确保集群中有且仅有 N 个 Pod 实例,N 是 RC 中定义的 Pod 副本数量。
2.23 Endpoints Controller(端点控制器)
填充端点对象(即连接 Services 和 Pods),负责监听 Service 和对应的 Pod 副本的变化。 可以理解端点是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道它的 endpoint。
自己的理解:
endpoint 理解为 : 标记ky35
当原来的port挂了,因为期望值,会再加一个port 当port 变化 导致ip 变了
通过标签和新ip 绑定 这个标签就是endpoint
2.24 Service Account & Token Controllers(服务帐户和令牌控制器)
为新的命名空间创建默认帐户和 API 访问令牌。
2.25 ResourceQuota Controller(资源配额控制器)
确保指定的资源对象在任何时候都不会超量占用系统物理资源。
2.26 Namespace Controller(命名空间控制器)
管理 namespace 的生命周期。
Namespace
是一种内核级别的隔离技术,用于将系统资源(如进程ID、网络设备、文件系统、用户ID等)划分到不同的独立空间中。每个命名空间内的进程只能看到自己命名空间内的相应资源,从而实现了轻量级的虚拟化,增强了容器技术的安全性和隔离性。
2.27 Service Controller(服务控制器)
属于 K8S 集群与外部的云平台之间的一个接口控制器。
2.3 Kube-scheduler
是负责资源调度的进程,根据调度算法为新创建的 Pod 选择一个合适的 Node 节点。
可以理解成 K8S 所有 Node 节点的调度器。当用户要部署服务时,Scheduler 会根据调度算法选择最合适的 Node 节点来部署 Pod。
•预选策略(predicate)
•优选策略(priorities)
API Server 接收到请求创建一批 Pod ,API Server 会让 Controller-manager 按照所预设的模板去创建 Pod,Controller-manager 会通过 API Server 去找 Scheduler 为新创建的 Pod 选择最适合的 Node 节点。比如运行这个 Pod 需要 2C4G 的资源,Scheduler 会通过预选策略过滤掉不满足策略的 Node 节点。Node 节点中还剩多少资源是通过汇报给 API Server 存储在 etcd 里,API Server 会调用一个方法找到 etcd 里所有 Node 节点的剩余资源,再对比 Pod 所需要的资源,如果某个 Node 节点的资源不足或者不满足 预选策略的条件则无法通过预选。预选阶段筛选出的节点,在优选阶段会根据优先策略为通过预选的 Node 节点进行打分排名, 选择得分最高的 Node。例如,资源越富裕、负载越小的 Node 可能具有越高的排名。
自己的理解:
3, 配置存储中心 etcd
K8S 的存储服务。etcd 是分布式键值存储系统,存储了 K8S 的关键配置和用户配置,K8S 中仅 API Server 才具备读写权限,其他组件必须通过 API Server 的接口才能读写数据。
4, Node 组件
4.1 Kubelet
Node 节点的监视器,以及与 Master 节点的通讯器。Kubelet 是 Master 节点安插在 Node 节点上的“眼线”,它会定时向 API Server 汇报自己 Node 节点上运行的服务的状态,并接受来自 Master 节点的指示采取调整措施。
从 Master 节点获取自己节点上 Pod 的期望状态(比如运行什么容器、运行的副本数量、网络或者存储如何配置等), 直接跟容器引擎交互实现容器的生命周期管理,如果自己节点上 Pod 的状态与期望状态不一致,则调用对应的容器平台接口(即 docker 的接口)达到这个状态。
管理镜像和容器的清理工作,保证节点上镜像不会占满磁盘空间,退出的容器不会占用太多资源。
总结:
在 Kubernetes 集群中,在每个 Node(又称 Worker Node)上都会启动一个 kubelet 服务进程。该进程用于处理 Master 下发到本节点的任务,管理 Pod 及 Pod 中的容器。每个 kubelet 进程都会在 API Server 上注册节点自身的信息,定期向 Master 汇报节点资源的使用情况,并通过 cAdvisor 监控容器和节点资源。
4.2 Kube-Proxy
在每个 Node 节点上实现 Pod 网络代理,是 Kubernetes Service 资源的载体,负责维护网络规则和四层负载均衡工作。 负责写入规则至iptables、ipvs实现服务映射访问的。
Kube-Proxy 本身不是直接给 Pod 提供网络,Pod 的网络是由 Kubelet 提供的,Kube-Proxy 实际上维护的是虚拟的 Pod 集群网络。
Kube-apiserver 通过监控 Kube-Proxy 进行对 Kubernetes Service 的更新和端点的维护。
在 K8S 集群中微服务的负载均衡是由 Kube-proxy 实现的。Kube-proxy 是 K8S 集群内部的负载均衡器。它是一个分布式代理服务器,在 K8S 的每个节点上都会运行一个 Kube-proxy 组件。
4.3 docker 或 rocket
容器引擎,运行容器,负责本机的容器创建和管理工作。
(九) k8s 数据流向