k8s微服务
k8s微服务
一、内容简介
前置知识
必须:Linux基础命令,Docker
可选:Java微服务开发,redis,elasticsearch,
prometheus,jenkins
目标
深入理解K8s各大资源对象以及最佳实践
熟练运用k8s各项调度策略
掌握k8s网络原理及应用
熟练掌握pod控制器及运用场景
熟练掌握k8s微服务devOps实战
二、核心概念
1.认识Kubernetes
1.1什么是k8s
官方文档:概述 | Kubernetes
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。
Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。
1.2为什么需要k8s

传统部署时代:
早期,各个组织是在物理服务器上运行应用程序。 由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题。 例如,如果在同一台物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。 一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程序资源利用率不高时,剩余资源无法被分配给其他应用程序, 而且维护许多物理服务器的成本很高。环境不隔离是最大问题。
虚拟化部署时代:
因此,虚拟化技术被引入了。虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。 虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问。
虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可扩缩性,以及降低硬件成本等等的好处。 通过虚拟化,你可以将一组物理资源呈现为可丢弃的虚拟机集群。
每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。解决了环境隔离,但是占用资源过多。
容器部署时代:
容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。
容器因具有许多优势而变得流行起来,例如:
敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性), 提供可靠且频繁的容器镜像构建和部署。
关注开发与运维的分离:在构建、发布时创建应用程序容器镜像,而不是在部署时, 从而将应用程序与基础架构分离。
可观察性:不仅可以显示 OS 级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
跨开发、测试和生产的环境一致性:在笔记本计算机上也可以和在云中运行一样的应用程序。
跨云和操作系统发行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。
以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分, 并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。
资源隔离:可预测的应用程序性能。
资源利用:高效率和高密度。
1.3它能做什么?
容器是打包和运行应用程序的好方式。在生产环境中, 你需要管理运行着应用程序的容器,并确保服务不会下线。 例如,如果一个容器发生故障,则你需要启动另一个容器。 如果此行为交由给系统处理,是不是会更容易一些?
这就是 Kubernetes 要来做的事情! Kubernetes 为你提供了一个可弹性运行分布式系统的框架。 Kubernetes 会满足你的扩展要求、故障转移你的应用、提供部署模式等。 例如,Kubernetes 可以轻松管理系统的 Canary (金丝雀) 部署。
Kubernetes 为你提供:
服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
存储编排
Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
自动部署和回滚
你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
自动完成装箱计算
你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。
自我修复
Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。
密钥与配置管理
Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
批处理执行 除了服务外,Kubernetes 还可以管理你的批处理和 CI(持续集成)工作负载,如有需要,可以替换失败的容器。
水平扩缩 使用简单的命令、用户界面或根据 CPU 使用率自动对你的应用进行扩缩。
IPv4/IPv6 双栈 为 Pod(容器组)和 Service(服务)分配 IPv4 和 IPv6 地址。
为可扩展性设计 在不改变上游源代码的情况下为你的 Kubernetes 集群添加功能。
1.4.企业级容器调度平台
(A)Apache Mesos
基本概念:Apache Mesos是一种开源的分布式系统内核,它提供了对计算机集群的资源管理和调度的支持。Mesos最初由加州大学伯克利分校AMPLab开发,现在已经成为Apache软件基金会的顶级项目之一。
Mesos的主要目标是实现资源共享和任务调度,以便在一个集群中高效地运行各种分布式应用程序,例如Hadoop、Spark等。它提供了一种通用的资源管理框架,可以将数据中心的计算资源池化为一个虚拟的计算机集群,从而使得应用程序可以跨越整个数据中心进行部署和运行。
Mesos采用了一种两级调度模型,其中集群中的每个节点都运行一个Mesos Agent(也称为Slave),用于管理本地计算资源。Mesos Master负责全局资源管理和调度,将任务分配到相应的Agent上,并监控整个系统的状态。这种分层模型使得Mesos可以轻松地扩展到大规模的集群中,并提供高可用性和容错性。
Mesos还支持多种应用程序框架,包括Hadoop、Spark、Storm等,可以通过Mesos接口来管理和调度这些应用程序。此外,Mesos还支持动态资源分配和任务优先级调整等高级特性,可以满足不同应用程序的需求。
总之,Apache Mesos是一个强大的分布式系统内核,它提供了高效的资源管理和调度支持,可以帮助用户更好地利用计算机集群进行分布式应用程序的部署和运行。
优势:
1.资源共享与利用效率:Mesos可以将整个数据中心的计算资源池化为一个虚拟的计算机集群,实现资源的共享和利用效率的最大化。它可以根据应用程序的需求,动态地对资源进行分配和管理,从而提高整个集群的利用率。
2.弹性和扩展性:Mesos采用了一种分层的架构,可以轻松地扩展到大规模的集群中。它支持动态添加或移除节点,并能够自动调整任务的分配策略,以适应不同负载和故障情况,从而提供高可用性和容错性。
3.多框架支持:Mesos支持多种应用程序框架,包括Hadoop、Spark、Storm等。这意味着用户可以使用自己熟悉的框架来部署和管理分布式应用程序,而无需额外学习和适应新的系统。
4.灵活的任务调度:Mesos提供了灵活的任务调度机制,可以根据任务的优先级、资源需求和约束条件等进行智能调度。它支持多种调度策略,如容器化、分布式任务和GPU加速等,以满足不同应用程序的需求。
5.可扩展的生态系统:Mesos拥有一个活跃的社区和丰富的生态系统,提供了许多与Mesos集成的工具和库。这些工具和库可以帮助用户更好地管理、监控和调试Mesos集群,以及开发自定义的调度器和框架。
综上所述,Apache Mesos具有资源共享与利用效率、弹性和扩展性、多框架支持、灵活的任务调度以及可扩展的生态系统等优势,使其成为一种强大的分布式系统内核,被广泛应用于大规模集群中。
(B)Docker Swarm
基本概念:Docker Swarm是一种容器编排和管理工具,它可以将多个Docker主机组合成一个虚拟的Docker主机,从而实现容器的高可用性、负载均衡和可扩展性。
Swarm最初是由Docker公司开发的,现在已经成为Docker Engine的一部分。它提供了一种简单和易于使用的API,允许用户创建、启动和管理多个容器,并自动分配它们到不同的主机上。Swarm还提供了自动恢复、故障检测和负载均衡等高级特性,可以确保应用程序始终处于可用状态。
Swarm的架构包括Manager节点和Worker节点。Manager节点是Swarm集群的控制中心,负责接收和处理API请求、管理集群状态、调度任务等。Worker节点是运行容器的节点,负责执行Manager分配给它们的任务。
Swarm支持多种调度策略,包括随机、平衡、最少使用等。它还支持动态扩展和缩小容器集合,以适应不同负载和需求。
总之,Docker Swarm是一种强大的容器编排和管理工具,它可以将多个Docker主机组合成一个虚拟的Docker主机,从而提供容器的高可用性、负载均衡和可扩展性。它是Docker生态系统的重要组成部分,被广泛应用于云计算和容器化部署领域。
优势:
- 简单易用:Docker Swarm设计的初衷是使容器编排变得简单易用。它与Docker Engine紧密集成,使用类似于Docker命令行的语法,使得用户可以轻松地创建、启动和管理容器集群,无需复杂的配置和学习曲线。
- 内置高可用性:Docker Swarm提供了内置的高可用性机制。通过将容器分配到多个Worker节点上,并使用故障检测和自动恢复机制,保证了应用程序的持续可用性。如果某个节点发生故障,Swarm会自动将任务重新分配到其他可用的节点上。
- 负载均衡:Docker Swarm支持内置的负载均衡机制,可以在容器之间分配流量以实现负载平衡。它可以根据容器的资源使用情况和运行状态进行智能调度,确保所有节点上的容器都得到合理的负载分配。
- 可扩展性:Docker Swarm可以根据需要动态扩展容器集群。它支持自动缩放和水平扩展,可以根据负载情况和资源需求自动添加或移除Worker节点,以满足不同规模和需求的应用程序。
- 与Docker生态系统的紧密集成:作为Docker官方提供的容器编排工具,Docker Swarm与Docker生态系统紧密集成。它可以无缝地与其他Docker工具和服务(如Docker Compose、Docker Registry等)配合使用,提供了完整的容器化解决方案。
总的来说,Docker Swarm的优势在于其简单易用、内置高可用性、负载均衡、可扩展性以及与Docker生态系统的紧密集成。这些特点使得Swarm成为一个受欢迎的容器编排和管理工具,广泛应用于容器化部署和云计算领域。
(C)Goole Kubernetes
基本概念:Google Kubernetes(通常称为Kubernetes或K8s)是一个用于自动化部署、扩展和管理容器化应用程序的开源平台。Kubernetes最初由Google开发,现在由Cloud Native Computing Foundation(CNCF)维护。它提供了一种简单而强大的容器编排和管理系统,可以帮助用户轻松管理数千个容器。
Kubernetes的设计目标是提供一个可移植、可扩展和自我修复的容器编排平台。它采用了分布式系统的思想,通过将应用程序拆分成小型、自治的单元(即容器),并使用标准API进行管理,从而实现了容器的高度可移植性和可扩展性。
Kubernetes的核心组件包括:
- Master节点:负责管理整个集群的状态和配置信息,包括控制器管理器、API服务器和etcd存储。
- Node节点:运行容器的工作节点,包括kubelet、kube-proxy和容器运行时(如Docker)等组件。
- Pod:Kubernetes最小部署单元,可以包含一个或多个容器,并共享相同的网络空间和存储资源。
- Service:抽象了一组Pod,提供了稳定的网络服务地址和负载均衡能力。
- Volume:为Pod提供持久化存储,可以挂载到任何节点上的本地或远程存储设备上。
Kubernetes还提供了一组强大的特性,包括自动化部署、水平扩展、自我修复、滚动升级、故障转移等。它支持多种云平台和环境,如Google Cloud Platform、AWS、Azure、OpenStack等,可以轻松实现跨云的容器管理。
总之,Google Kubernetes是一个用于自动化部署、扩展和管理容器化应用程序的开源平台,它提供了一组简单而强大的容器编排和管理系统,可以帮助用户轻松管理数千个容器。Kubernetes已成为CNCF旗下最重要的开源项目之一,并在全球范围内广泛应用于容器化部署和云计算领域。
优势:
- 容器编排和管理:Kubernetes提供了强大的容器编排和管理系统,可以帮助用户轻松管理数千个容器。它支持自动化部署、水平扩展、自我修复、滚动升级、故障转移等特性,使得容器的部署和管理变得更加方便和高效。
- 可移植性:Kubernetes提供了一种可移植的容器编排平台,可以在多种云平台和环境中运行。它支持跨云的容器管理,使得应用程序可以更加灵活地部署和迁移。
- 开放源代码:Kubernetes是一个开源项目,拥有庞大的社区支持和贡献。用户可以自由地使用、修改和共享Kubernetes的代码,从而获得更大的灵活性和自主权。
- 生态系统:Kubernetes拥有丰富的生态系统,包括Docker、Helm、Prometheus等工具和服务。这些工具可以与Kubernetes无缝集成,为用户提供更全面的容器解决方案。
- 可扩展性:Kubernetes的设计目标是提供一个可扩展的容器编排平台。它可以根据需要动态扩展集群,并支持水平扩展和垂直扩展等多种方式,以满足不同规模和需求的应用程序。
总的来说,Google Kubernetes的优势在于其容器编排和管理、可移植性、开放源代码、生态系统和可扩展性等特点。这些优势使得Kubernetes成为一个受欢迎的容器编排和管理工具,并广泛应用于现代应用程序的部署和管理。
2.集群架构与组件
3.核心概念与专业术语
3.1服务的类型
无状态
代表应用:Nginx,apache。
优点:对客户端透明,无依赖关系,可以高效实现扩容、迁移。
缺点:不能存储数据,需要额外的数据服务支撑。
有状态
代表应用:Mysql,Redis。
优点:可以独立存储数据,实现数据管理。
缺点:集群环境下需要实现主从、数据同步、备份、水平扩容复杂。
3.2资源与对象
k8s中所有的内容都被抽象为“资源”,例如Pod、Service、Node等。“对象”就是“资源”的实例。对象的创建、删除、修改都是通过“k8s API”实现。
3.2.1资源的分类
3.3对象规约和状态
规约spec
spec是必须的,它描述了对象的期望状态–希望对象所具有的特征,以及关于对象的一些基本信息。
状态status
status表示对象的实际状态,该属性由K8S自己维护,通过一系列的控制器对对应对象进行管理,让对象尽可能的让实际状态与期望状态重合。