文章摘要: Kubernetes通常简称为K8s,是一个开源的容器编排平台,用于自动化计算机容器化应用程序的部署、扩展和管理。
简介
简要说明
- 允许你在集群中调度和运行容器,集群可以由物理机或虚拟机组成。
- Kubernetes隐藏了底层硬件层的复杂性,使得部署和管理容器化的应用程序变得更加简单。
主要功能
- 自动装箱:基于容器的资源需求,自动决定在哪个节点上运行。
- 自我修复:如果容器失败,Kubernetes会重启它;如果节点失败,则将容器重新调度到其他节点。
- 水平扩展:通过简单的命令或基于自动化的CPU等使用情况,可以很容易地增加或减少应用程序的副本数量。
- 服务发现和负载均衡:Kubernetes可以使用DNS名或自己的IP地址自动发现容器,如果容器的流量过大,可以负载均衡流量,确保部署稳定。
- 自动部署和回滚:可以描述应用程序的预期状态,Kubernetes可以改变实际状态至预期状态,如果有什么不对,可以回滚到之前的版本。
- 密钥与配置管理:无需改动镜像配置,就可以更新应用程序配置和密钥。
注意事项
- 学习曲线:Kubernetes相对复杂,有陡峭的学习曲线。
- 资源需求:运行Kubernetes集群需要相对较多的计算资源。
- 安全性:需要确保集群的安全,防止未授权访问。
- 版本兼容性:在升级Kubernetes版本时,需要确保所有组件都与新版本兼容。
- 监控和日志:需要设置适当的监控和日志记录机制来确保集群的稳定运行。
适用场景
- 微服务架构:适用于需要快速、频繁部署的微服务架构。
- 自动化和弹性:适用于需要高度自动化和弹性伸缩的应用程序。
- 资源优化:适用于希望最大化资源利用率和降低成本的环境。
- 多云和混合云:适用于需要在多个云环境或混合云环境中部署应用程序的场景。
- 持续集成/持续部署(CI/CD):适用于实现CI/CD流程,以支持敏捷开发和持续交付。
命令行工具
命令行工具详细总结:Package-Kubectl
核心概念
Pod
- Pod是Kubernetes的最小工作单元。
- 每个Pod包含一个或多个容器。
- Pod中的容器会作为一个整体被Master调度到一个Node上运行。
- Pod有自己独立的IP。
- Pod可以被创建、销毁。
- 当扩容和缩容时,Pod的数量会发生变化。
- 当Pod故障时,会创建新的Pod。
注释
- 将联系紧密的容器封装在一个Pod单元内,以Pod整体进行调度、扩展和实现生命周期管理。
- Pod内所有容器使用相同的网络和共享存储。容器之间直接通过本地网络直接通讯,提高沟通效率。
控制器(Controller)
- 负载均衡是在Pod之上的抽象,通过
控制器实现一系列基于Pod的高级特性。 - 我们通常使用
控制器来做应用真正的管理,而Pod是组成负载最小的单元。
ReplicationController
- 用来确保容器应用的副本数始终保持在用户定义的副本数。
- 如果有容器异常退出,会自动创建新的Pod来替代。
- 如果有异常多出来的容器也会自动回收。
ReplicaSet
- 与ReplicationController没有本质的不同,但支持集合式的selector。
建议使用Deployment来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题。
Horizontal Pod Autoscaling 仅限于ReplicaSet和Deployment,对Pod进行水平扩容和缩容。
StatefulSet解决有状态服务的问题
- 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC实现。
- 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service来实现。
- 有序部署,有序扩展,即Pod是有序的,在部署或者扩展的时候要依据定义的顺序一次进行,基于init containers来实现。
- 有序回收,有序删除。
DaemonSet
- 确保全部(或者一些)Node上运行一个Pod的副本。
- 当有Node加入集群时,也会为他们新增一个Pod。
- 当有Node从集群移除时,这些Pod也会被回收。
- 删除DaemonSet将会删除它创建的所有Pod。
Job
- 负责批处理任务,即仅执行一次的任务。
- 保证批处理认为的一个或多个Pod成功结束。
Cron Job管理基于时间的Job
- 在给定时间点只运行一次。
- 周期性地在给定时间点运行。
服务(Service)
服务是一种抽象概念,定义了Pod逻辑集合以及访问它们的策略。服务定义了外界访问一组特定Pod的方式。服务有自己的IP和端口,服务为Pod提供了负载均衡。
注释
- 在Kubernetes中,Pod副本发生迁移或伸缩的时候会发生变化,IP也会发生变化。
服务会监听Pod的IP变化,并统一对外提供IP。
容量(Volume)
- 用来管理Kubernetes存储。
- 声明在Pod中的容器可以访问的文件目录。
- 可以被挂载在Pod中一个或多个容器的指定路径下。
- 支持多种后端存储(本地存储、分布式存储、云存储)。
标签(Label)
- 通过
标签来实现资源分类管理。
命名空间(Namespace)
命名空间是对一组资源和对象的抽象整合。- 在同一个集群内容可创建不同的
命名空间,不同命名空间中的数据彼此隔离,实现共享同一个集群服务并且互不干扰。
集群默认存在以下命名空间:
default:所有未指定命名空间的对象都会被分配在名为default的命名空间。kube-public:在命名空间下的资源可以被所有人访问(包含未认证用户),用来部署公共插件、容器模板等。kube-system:所有由 Kubernetes 系统创建的资源都处于这个命名空间。kube-nade-lease:每个节点在该命名空间中都有一个关联的标签对象,该对象由节点定期更新,被用来记录Note节点的心跳信号。
架构
- 一个基础的Kubernetes集群(Cluster)通常包含一个Master节点和多个Note节点。
- 每个阶段都是一台物理机,也可以是一台虚拟机。
Master节点
- 提供集群控制,对集群做出全局性决策。
- Kube-apiserver:前端控制层,Kubernetes API,水平扩展架构,通过部署更多实例来承载业务。
- etcd:后端存储,存储集群数据,提供数据备份。
- Kube-controller-manager:控制器,负责策略控制,针对不同的工作负载执行不同的策略。
- Kube-scheduler:任务调度,监控没有分配节点的新创建的Pod,选择一个节点供Pod运行。
Node节点
- 运行容器应用,由Master管理,负责健康并汇总容器状态,同时根据Master的要求管理容器的生命周期。
- Kubelet:在集群内每个节点中运行的一个代理,用于保证Pod的与性能,接受Master的指令,负责管理容器(Pod)。
- Kube-proxy:负责做负载均衡工作,管理Service的访问入口。
- Add-ons:插件,用于扩展Kubernetes的功能。
- Container runtime:通常使用Docker来运行容器。
注释
- 通常在Master节点上不运行用户容器。为了提高高可用可以创建多个Master节点。
架构图
开放接口
注释
- Kubernetes作为云原生应用的基础调度平台,相当于云原生的操作系统。
- 为了便于系统的扩展,Kubernetes中开放来以下接口,可以分别对接不同的后端,实现自己的业务逻辑。
CRI(Container Runtime Interface)
- 容器运行时接口。
- 提供计算能力,定义来容器和镜像的服务接口。
- 常见的CRI后端有Docker、rkt、kata-containers等。
CNI(Container Network Interface)
- 容器网络接口。
- 提供网络能力,由一组用于配置Linux容器的网络接口的规范和库组成。
- 仅关注容器创建是的网络分配和当容器被删除是释放网络资源。
CSI(Container Storage Interface)
- 容器存储接口。
- 提供存储能力,Kubernetes可以将任意存储系统暴露给自己的容器工作负载。
工作负载对象
分类
无状态
管理的Pod集合是相互等价的,需要的时候可以被替换。
- Deployment(部署)
- ReplicaSet(副本设置)
有状态
为每个Pod维护一个唯一的ID,能够保证Pod的顺序性和唯一性,每个Pod是不可替代的。可以使用持久存储来保存服务产生的状态。
- StatefulSet(状态设置)
守护进程
保证每个节点上运行着守护进程。
- DaemonSet(守护程序设置)
批处理:
一次性的任务。
- Job(任务)
- CronJob(定时任务)
Deployment
简要说明
- 不具有唯一标识的多个Pod的集合。
主要功能
- 确保集群中期望数量的Pod运行。
- 提供多种升级策略以及意见回滚能力。
- 提供暂停/恢复的能力。
适用场景
- Web Server等无状态应用。
ReplicaSet
简要说明
主要功能
- Pod有稳定的网格标识符,Pod重新调度后Pod名称和Host名称不变。
- 每个Pod有单独存储,保证Pod重新调度后还是能访问到相同的数据。
适用场景
- 在某些分布式的场景,要求每个Pod都有自己单独的状态时。