东莞专业网站推广策划,韩国服务器,金融网站建设方案,wordpress数据库分析目录
k8s概述
特性
作用#xff08;为什么使用#xff09;
k8s架构
k8s工作流程
k8s集群架构与组件
核心组件详解
Master节点
Kube-apiserver
Kube-controller-manager
Kube-scheduler
存储中心
etcd
Node
Kubelet
Kube-Proxy
网络通信模型
容器引擎
k8s核… 目录
k8s概述
特性
作用为什么使用
k8s架构
k8s工作流程
k8s集群架构与组件
核心组件详解
Master节点
Kube-apiserver
Kube-controller-manager
Kube-scheduler
存储中心
etcd
Node
Kubelet
Kube-Proxy
网络通信模型
容器引擎
k8s核心概念详解
Pod
Pod 控制器
Label
Label 选择器
Service 服务
Ingress
Name
Namespace 命名空间 k8s官网https://kubernetes.io
GitHubhttps://github.com/kubernetes/kubernetes
k8s概述
Kubernetes简称K8s是因为 k 和 s 之间有八个字符是一个开源的容器编排平台用于管理云平台中多个主机上的容器化应用程序。它提供了一种机制用于自动化部署、扩展和管理容器化应用程序的集群。Kubernetes的目标是让部署容器化应用程序变得简单高效。它提供了应用程序部署、规划、更新和维护的基本机制同时具备强大的扩展性和可靠性。Kubernetes采用主从设备模型Master-Slave架构其中Master节点负责核心的调度、管理和运维任务而Slave节点负责运行应用程序的容器。通过Kubernetes开发人员可以更轻松地管理和扩展他们的容器化应用程序从而提高应用程序的可靠性和可伸缩性。
特性
主要特性 自动化容器编排弹性伸缩Kubernetes可以自动化地管理和编排容器根据定义的规则和策略来调度和部署应用程序。 服务发现和负载均衡Kubernetes提供了内置的服务发现机制可以自动为应用程序创建稳定的网络地址并通过负载均衡将流量分发到不同的容器实例。 自动扩展和弹性伸缩Kubernetes可以根据负载情况自动调整容器的数量实现应用程序的弹性伸缩确保始终具有所需的资源。 自我修复和健康检查Kubernetes具有自我修复机制可以监测容器的健康状态并在出现故障或异常时自动进行恢复或重启。 配置和存储管理Kubernetes提供了集中化的配置管理工具可以轻松管理应用程序的配置信息。支持外部存储系统的挂载并对外部存储资源进行编排。无论是本地存储、公有云提供的存储服务如AWS还是网络存储如NFS、Glusterfs、Ceph都可以作为集群资源使用提高存储的灵活性。 集中化配置管理和密钥管理Kubernetes提供了集中化的配置管理工具可以管理敏感数据和应用程序配置提高数据安全性。同时它还支持密钥管理用于安全地存储和使用敏感信息。 滚动更新和回滚Kubernetes支持滚动更新可以逐步替换旧版本的容器确保应用程序的平滑升级。如果出现问题还可以回滚到之前的版本。 多租户支持Kubernetes支持多租户的部署模式可以将不同的应用程序或团队隔离开来确保安全性和资源隔离。 可扩展性和插件机制Kubernetes具有高度可扩展的架构并提供了插件机制可以根据需要添加自定义功能或集成其他工具。 跨平台和多云支持Kubernetes可以在各种云平台和基础设施上运行包括公有云、私有云和混合云环境。 声明式配置和版本控制Kubernetes采用声明式配置的方式通过定义期望的状态来管理应用程序同时支持版本控制和回滚。 任务批处理运行Kubernetes支持一次性任务和定时任务适用于批量数据处理和分析的场景满足批处理需求。
作用为什么使用
传统的后端部署方式把程序包包括可执行二进制文件、配置文件等放到服务器上接着运行启动脚本把程序跑起来同时启动守护脚本定期检查程序运行状态、必要的话重新拉起程序。 设想如果服务的请求量较多已部署的服务响应不过来怎么办如果请求量、内存、CPU超过阈值做了告警运维人员马上再加几台服务器部署好服务之后接入负载均衡来分担已有服务的压力。 但是从监控告警到部署服务中间需要人力介入那么有没有办法自动完成服务的部署、更新、卸载和扩容、缩容呢
k8s就是为了解决这些问题设计的 它提供了自动化的容器编排和管理功能使得部署、更新、扩容和缩容等操作更加简单和高效。 通过使用Kubernetes可以将容器化的应用程序打包成镜像并通过Kubernetes进行部署。Kubernetes会自动管理容器的运行状态监控容器的健康状况并在需要时进行自动恢复。当请求量增加时Kubernetes可以根据负载情况自动扩展容器的数量以满足高负载需求。而当请求量减少时Kubernetes也可以自动缩减容器的数量以节省资源和成本。 此外Kubernetes还提供了服务发现和负载均衡的功能使得容器化的应用程序可以方便地进行服务间通信并实现负载均衡提高应用程序的可用性和性能。 总之Kubernetes的目标是简化容器化应用程序的部署和管理提供自动化的运维能力减少人工介入提高效率和可靠性。它是现代化应用程序架构的重要组成部分可以帮助更好地应对不断增长的业务需求和流量压力。
KubernetesK8S的目标是简化和高效地部署容器化应用程序。它解决了使用裸跑Docker时的一些问题包括 单机使用无法有效地进行集群管理。 随着容器数量增加管理成本也随之上升。 缺乏有效的容灾和自愈机制。 没有预设的编排模板无法实现快速、大规模的容器调度。 缺乏统一的配置管理中心工具。 缺乏容器生命周期的管理工具。 缺乏图形化的运维管理工具。
Kubernetes是由Google开源的容器集群管理系统它在Docker等容器技术的基础上提供了一系列完整的功能包括应用程序的部署运行、资源调度、服务发现和动态伸缩等。它提高了大规模容器集群管理的便捷性。其主要功能包括 使用Docker等容器技术对应用程序进行打包、实例化和运行。 以集群的方式运行和管理分布在多台机器上的容器。 解决了跨机器容器之间通信的问题。 Kubernetes的自我修复机制确保容器集群始终处于用户期望的状态。
k8s架构 Kubernetes简称K8s是一个开源的容器编排平台用于自动化部署、扩展和管理容器化应用程序。Kubernetes的架构由多个组件组成每个组件负责不同的任务协同工作以实现高可用性和弹性。
以下是Kubernetes的主要组件和其功能 API ServerAPI服务器作为Kubernetes的网关接收和处理所有的指令请求。它提供了一组RESTful API用于管理和操作Kubernetes集群中的资源对象。 Scheduler调度器负责根据预定义的调度算法将容器化应用程序的资源请求调度到合适的节点上运行。调度器考虑节点的资源利用率、健康状态和亲和性等因素来做出决策。 Controller Manager控制器管理器维护Kubernetes中的各种控制器用于管理和控制资源对象的生命周期。控制器可以监视资源对象的状态变化并根据预定义的规则执行相应的操作如创建、删除、更新和修改资源对象。 etcd是Kubernetes的分布式键值存储系统用于存储集群的配置数据和状态信息。etcd提供高可用性和一致性可以用于服务注册、发现和配置同步等功能。 Kubelet运行在每个节点上的代理程序负责管理节点上的容器和容器化应用程序。Kubelet与API Server通信接收指令并执行相应的操作如创建、销毁和监控容器。 Container Runtime容器运行时负责在节点上运行容器如Docker、containerd等。容器运行时提供了容器的生命周期管理、资源隔离和安全性等功能。 kube-proxy负责在集群中实现服务发现和负载均衡。它维护网络规则将服务请求转发到正确的目标容器。
这些组件共同协作实现了Kubernetes的核心功能包括容器编排、自动伸缩、服务发现、负载均衡和故障恢复等。通过这种架构Kubernetes能够提供高度可靠和可扩展的容器化应用程序管理平台
k8s工作流程 运维人员向API Server发出创建Pod的请求告诉它我想干什么我的期望是什么。 API Server响应请求并通过一系列认证和授权过程将请求存储到etcd分布式键值存储系统并通知Controller Manager。 Controller Manager通过API Server读取etcd中的请求并按照预设的模板去创建Pod。创建完成后将Pod的数据写入etcd。 Controller Manager通过API Server去找Scheduler为新创建的Pod选择最适合的Node节点。Scheduler会根据预算策略在所有Node节点中挑选最优的节点。 Scheduler选择合适的Node节点后将选择结果返回给Controller Manager。 Controller Manager将选择结果通过API Server写入etcd更新Pod的状态。 Kubelet运行在每个节点上的代理程序通过API Server获取到更新后的Pod状态并根据状态执行相应的操作如创建、销毁和监控容器。 Container Runtime容器运行时在选定的Node节点上运行容器如Docker、containerd等。容器运行时负责容器的生命周期管理、资源隔离和安全性等功能。 kube-proxy负责在集群中实现服务发现和负载均衡。它维护网络规则将服务请求转发到正确的目标容器。
通过这个工作流程Kubernetes实现了自动化的容器编排和管理确保应用程序的高可用性、弹性和可扩展性。各个组件之间的协作和通信使得Kubernetes能够有效地管理容器化应用程序并提供强大的功能和服务。
k8s集群架构与组件
KubernetesK8S是一个分布式系统它的集群架构由多个组件组成每个组件负责不同的任务。KubernetesK8S的架构采用了主从设备模型Master-Slave 架构。在 K8S 中Master 节点负责集群的调度、管理和运维而 Worker Node 节点则承载着实际的工作负载。 Master节点控制平面 kube-apiserver提供Kubernetes API的前端接口用于与其他组件通信。 etcd可靠的分布式键值存储用于存储集群的配置数据和状态信息。 kube-scheduler负责根据资源需求和约束条件将Pod调度到合适的工作节点上运行。 kube-controller-manager包含多个控制器负责监控和管理集群的各种资源和控制器。 cloud-controller-manager可选用于与云平台提供商集成管理云资源。 工作节点计算节点 kubelet与Master节点通信负责管理并执行Pod的生命周期包括创建、启动、监控和销毁Pod。 kube-proxy负责为Pod提供网络代理和负载均衡功能实现Kubernetes服务的访问和通信。 网络插件 Kubernetes使用网络插件来实现容器之间和容器与外部网络的通信。不同的网络插件可以提供不同的网络解决方案如Overlay网络、主机网络等。 存储插件 Kubernetes支持不同的存储插件用于提供持久化存储的功能如本地存储、网络存储、云存储等。 DNS插件 Kubernetes集群通常会配置一个DNS插件用于为Pod提供域名解析服务使得Pod可以通过域名进行相互通信。 Dashboard可选 Kubernetes提供了一个Web界面称为Dashboard用于可视化地管理和监控集群中的应用程序和资源。
核心组件详解
Master节点
Kube-apiserver
kube-apiserver是Kubernetes集群中的一个核心组件它是Kubernetes API的前端接口负责处理来自用户和其他组件的请求并将其转发到相应的组件进行处理。 API接口kube-apiserver提供了一组RESTful API接口用于管理和操作Kubernetes集群中的各种资源如Pod、Service、Deployment等。通过这些API接口用户和其他组件可以与集群进行交互。 认证和授权kube-apiserver支持多种认证和授权机制如基于Token的认证、基于证书的认证、OpenID Connect等。它可以验证用户的身份并根据配置的访问控制策略对请求进行授权。 数据存储kube-apiserver使用etcd作为后端存储将集群的配置数据和状态信息持久化保存在etcd中。etcd是一个可靠的分布式键值存储系统确保集群的元数据在节点故障或重启后仍然可用。 高可用性为了提高kube-apiserver的可用性可以运行多个kube-apiserver实例并使用负载均衡器将请求分发到这些实例上。这样即使其中一个实例发生故障其他实例仍然可以继续提供服务。 安全性kube-apiserver提供了一些安全机制来保护API的访问和数据的安全性。它支持TLS加密通信可以配置访问控制策略来限制用户的权限还可以启用审计日志记录API的访问和操作。 扩展性kube-apiserver具有良好的扩展性可以通过自定义资源定义Custom Resource Definition和自定义控制器Custom Controller来扩展API以满足特定的业务需求。
kube-apiserver是Kubernetes集群中非常重要的组件用于暴露 Kubernetes API任何资源请求或调用操作都是通过 kube-apiserver 提供的接口进行。以 HTTP Restful API 提供接口服务所有对象资源的增删改查和监听操作都交给 API Server 处理后再提交给 Etcd 存储。 可以理解成 API Server 是 K8S 的请求入口服务。API Server 负责接收 K8S 所有请求来自 UI 界面或者 CLI 命令行工具 然后根据用户的具体请求去通知其他组件干活。可以说 API Server 是 K8S 集群架构的大脑。
Kube-controller-manager
kube-controller-manager是Kubernetes集群中的一个核心组件它是控制器的集合负责管理和运行多个控制器以确保集群中的各种资源处于期望的状态。 控制器集合kube-controller-manager包含了多个控制器每个控制器负责监控和管理集群中的不同资源。常见的控制器包括副本控制器Replication Controller、节点控制器Node Controller、服务控制器Service Controller等。 副本控制器副本控制器负责确保Pod的副本数量与期望的副本数量保持一致。它会监控Pod的状态并在需要时创建、删除或重新调度Pod以满足用户定义的副本数量。 节点控制器节点控制器负责监控集群中的节点状态并根据需要进行节点的添加、删除或重新调度。它会检测节点的健康状态并根据节点的可用性和资源情况来进行节点管理。 服务控制器服务控制器负责监控Service资源的变化并确保集群中的服务始终具有稳定的网络地址。它会自动为Service创建对应的负载均衡器并将流量分发到后端的Pod实例。 控制循环每个控制器都遵循控制循环Control Loop的模式不断地监控资源的状态并根据期望的状态进行调整。控制循环包括观察资源状态、比较当前状态和期望状态、执行操作来调整资源状态等步骤。 高可用性为了提高kube-controller-manager的可用性可以运行多个实例并使用负载均衡器将请求分发到这些实例上。这样即使其中一个实例发生故障其他实例仍然可以继续提供服务。 自定义控制器除了内置的控制器kube-controller-manager还支持自定义控制器的扩展。用户可以根据自己的需求编写自定义控制器以实现特定的业务逻辑和资源管理。
运行管理控制器是 K8S 集群中处理常规任务的后台线程是 K8S 集群里所有资源对象的自动化控制中心。在 K8S 集群中一个资源对应一个控制器而 Controller manager 就是负责管理这些控制器的。 由一系列控制器组成通过 API Server 监控整个集群的状态并确保集群处于预期的工作状态比如当某个 Node 意外宕机时Controller Manager 会及时发现并执行自动化修复流程确保集群始终处于预期的工作状态。
Kube-scheduler
kube-scheduler是Kubernetes集群中的一个核心组件它负责根据预定义的调度策略为新创建的Pod选择合适的节点进行调度。 节点选择kube-scheduler会根据一系列的调度策略和规则选择最适合的节点来运行Pod。这些策略包括资源需求、亲和性Affinity和反亲和性Anti-Affinity、节点亲和性Node Affinity、节点亲和性预选Node Affinity Preemption等。 资源需求kube-scheduler会考虑Pod的资源需求如CPU、内存等并选择具有足够资源的节点来运行Pod以避免资源竞争和过载。 亲和性和反亲和性kube-scheduler支持亲和性和反亲和性规则可以将Pod调度到与其他Pod或节点具有特定关系的节点上。例如可以将具有相同标签的Pod调度到同一个节点上或者将Pod调度到与特定Pod或节点具有反亲和性的节点上。 节点亲和性kube-scheduler支持节点亲和性规则可以将Pod调度到与特定节点具有特定关系的节点上。例如可以将Pod调度到与具有特定标签的节点具有亲和性的节点上。 节点亲和性预选kube-scheduler支持节点亲和性预选规则可以在调度过程中优先考虑具有特定标签或特定条件的节点。这可以用于实现高级调度策略如将Pod调度到具有特定硬件或软件配置的节点上。 可扩展性kube-scheduler具有良好的可扩展性可以通过自定义调度器Custom Scheduler来扩展其功能。用户可以根据自己的需求编写自定义调度器以实现特定的调度策略和资源管理。 高可用性为了提高kube-scheduler的可用性可以运行多个实例并使用负载均衡器将请求分发到这些实例上。这样即使其中一个实例发生故障其他实例仍然可以继续提供调度服务。
可以理解成 K8S 所有 Node 节点的调度器。当用户要部署服务时Scheduler 会根据调度算法选择最合适的 Node 节点来部署 Pod。 •预选策略predicate •优选策略priorities
API Server 接收到请求创建一批 Pod API Server 会让 Controller-manager 按照所预设的模板去创建 PodController-manager 会通过 API Server 去找 Scheduler 为新创建的 Pod 选择最适合的 Node 节点。比如运行这个 Pod 需要 2C4G 的资源Scheduler 会通过预选策略过滤掉不满足策略的 Node 节点。Node 节点中还剩多少资源是通过汇报给 API Server 存储在 etcd 里API Server 会调用一个方法找到 etcd 里所有 Node 节点的剩余资源再对比 Pod 所需要的资源如果某个 Node 节点的资源不足或者不满足 预选策略的条件则无法通过预选。预选阶段筛选出的节点在优选阶段会根据优先策略为通过预选的 Node 节点进行打分排名 选择得分最高的 Node。例如资源越富裕、负载越小的 Node 可能具有越高的排名。
存储中心
etcd
etcd是一个开源的分布式键值存储系统它被广泛应用于Kubernetes集群中作为存储和同步集群配置数据的后端。 分布式键值存储etcd提供了一个简单而强大的分布式键值存储系统类似于一个分布式的字典或数据库。它允许用户存储和检索键值对并支持对数据的高效查询和事务操作。 一致性和可靠性etcd使用Raft一致性算法来确保数据的一致性和可靠性。Raft算法通过选举和复制日志的方式保证了集群中的节点之间的数据一致性并在节点故障或网络分区的情况下保持系统的可用性。 高可用性etcd支持多节点部署可以运行多个etcd实例组成一个集群。这样即使其中一个节点发生故障其他节点仍然可以继续提供服务保证了系统的高可用性。 集群配置存储在Kubernetes中etcd被用作存储和同步集群的配置数据包括节点信息、Pod和Service的状态、配置文件等。etcd存储了整个集群的元数据确保集群中的各个组件和资源的状态保持一致。 监控和调试etcd提供了一些工具和接口用于监控和调试集群的状态和性能。用户可以通过etcd的API接口或命令行工具来查询和监控存储的数据并进行故障排除和性能优化。 安全性etcd支持TLS加密通信可以配置访问控制策略来限制对存储数据的访问权限。它还提供了身份验证和授权机制确保只有经过授权的用户才能访问和修改存储的数据。
K8S 的存储服务。etcd 是分布式键值存储系统存储了 K8S 的关键配置和用户配置K8S 中仅 API Server 才具备读写权限其他组件必须通过 API Server 的接口才能读写数据。
Node
Kubelet
kubelet是Kubernetes集群中每个节点上的主要组件之一它负责管理和监控节点上的容器。 容器生命周期管理kubelet负责管理节点上的容器的生命周期包括创建、启动、停止和销毁容器。它会监控容器的状态并根据需要执行相应的操作以确保容器按预期运行。 Pod和容器配置kubelet根据来自Kubernetes API Server的指令负责创建和管理Pod。它会根据Pod的配置信息如容器镜像、资源需求、环境变量等来创建和配置容器。 资源管理kubelet会监控节点上的资源使用情况包括CPU、内存、存储等并根据Pod的资源需求进行资源分配和管理。它会确保节点上的容器不会超出资源限制以避免资源竞争和过载。 健康检查和自愈机制kubelet会定期对容器进行健康检查检测容器的运行状态和健康状况。如果容器出现故障或异常kubelet会尝试重新启动容器以恢复容器的正常运行。 日志和监控kubelet会收集容器的日志和监控数据并将其发送到集中化的日志和监控系统以便用户和管理员进行查看和分析。这有助于故障排除和性能优化。 安全性kubelet负责确保节点上的容器的安全性。它会执行容器的安全策略如限制容器的权限、隔离容器的网络等以保护节点和集群的安全。 与其他组件的通信kubelet与其他Kubernetes组件如kube-apiserver、kube-proxy等进行通信以获取指令、报告状态和接收更新。它通过与这些组件的交互实现了集群的协调和管理。
在 Kubernetes 集群中在每个 Node又称 Worker Node上都会启动一个 kubelet 服务进程。该进程用于处理 Master 下发到本节点的任务管理 Pod 及 Pod 中的容器。每个 kubelet 进程都会在 API Server 上注册节点自身的信息定期向 Master 汇报节点资源的使用情况并通过 cAdvisor 监控容器和节点资源。
Kube-Proxy 服务代理kube-proxy通过监听Kubernetes API Server上的Service和Endpoint对象的变化动态地维护一个服务代理表。它会为每个Service创建一个虚拟IP并将流量转发到后端的Pod实例。 负载均衡kube-proxy使用负载均衡算法将流量分发到后端的Pod实例。它支持多种负载均衡模式如轮询、随机、最少连接等以确保流量在Pod之间均匀分布。
在每个 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 组件。
网络通信模型
在KubernetesK8S中网络模型是用于管理和组织容器之间通信的一种架构。Kubernetes使用了一种称为容器网络接口Container Network InterfaceCNI的标准来定义和实现容器之间的网络通信。 Pod内部容器之间的网络通信在同一个Pod中的容器可以通过localhost进行直接通信它们共享相同的网络命名空间和IP地址。 Pod之间的网络通信不同Pod中的容器之间的通信需要通过网络进行。每个Pod都被分配一个唯一的IP地址可以通过该IP地址进行通信。Pod之间的通信是通过网络插件如Flannel、Calico、Weave等来实现的。 Pod到Service之间的网络通信Kubernetes中的Service是一种抽象用于将一组Pod封装为一个逻辑服务。Service会为这些Pod分配一个虚拟IP地址并通过负载均衡将流量分发到这些Pod上。其他Pod可以通过Service的虚拟IP地址来访问该服务。 集群外部与内部组件之间的网络通信Kubernetes集群外的组件如外部服务、其他集群、云服务等可以通过Kubernetes提供的网络代理或Ingress来与集群内的服务进行通信。网络代理和Ingress可以将外部流量转发到集群内部的Service或Pod。
具体的网络实现取决于所选择的网络插件和配置。常见的网络插件包括Flannel、Calico、Weave等它们提供了不同的网络方案和功能以满足不同的需求和环境。这些网络插件通过创建虚拟网络、路由规则和网络策略等方式实现了Kubernetes中的网络模型。
在Kubernetes中有三个与IP地址相关的概念Node IP、Pod IP和Cluster IP。 Node IP节点IPNode IP是指Kubernetes集群中每个节点Node所分配的IP地址。每个节点都有一个唯一的Node IP用于标识和访问该节点。Node IP通常用于集群外部与节点进行通信例如从外部网络访问节点上运行的服务。 Pod IP容器组IPPod IP是指Kubernetes集群中每个Pod所分配的IP地址。Pod是Kubernetes中最小的可调度和可管理的单元每个Pod都有一个唯一的Pod IP。Pod IP用于容器之间的通信不同Pod中的容器可以通过Pod IP进行网络通信。 Cluster IP集群IPCluster IP是指Kubernetes集群中Service所分配的虚拟IP地址。Service是Kubernetes中用于封装一组Pod的逻辑服务为这些Pod提供一个统一的入口。Cluster IP是Service的虚拟IP地址用于在集群内部进行服务发现和访问。其他Pod可以通过Cluster IP来访问Service提供的服务。
这些IP地址在Kubernetes中起着不同的作用Node IP用于集群外部与节点通信Pod IP用于容器之间的通信而Cluster IP用于集群内部的服务发现和访问。它们共同构成了Kubernetes中的网络基础设施。
容器引擎
在KubernetesK8S中并没有单独的容器引擎。Kubernetes本身并不提供容器运行时而是通过与容器运行时接口Container Runtime InterfaceCRI兼容的容器运行时来运行和管理容器。
CRI是Kubernetes定义的一种接口规范用于与容器运行时进行通信和交互。它允许Kubernetes与不同的容器运行时进行集成例如Docker、Containerd、CRI-O等。这些容器运行时负责实际的容器创建、管理和执行工作。
常见的Kubernetes容器运行时包括 DockerDocker是最常用的容器运行时之一它提供了广泛的功能和工具用于创建、打包和运行容器。在较早的Kubernetes版本中Docker是默认的容器运行时。 ContainerdContainerd是一个轻量级的容器运行时它是Docker的核心组件之一。Containerd提供了基本的容器管理功能可以与Kubernetes集成作为Kubernetes的容器运行时。 CRI-OCRI-O是一个专门为Kubernetes设计的轻量级容器运行时它符合CRI规范并专注于提供最小化的容器运行时功能。CRI-O使用runc作为底层容器执行器与Kubernetes紧密集成。
除了上述容器运行时还有其他一些实现了CRI规范的容器运行时如rkt现已停止开发、frakti等。这些容器运行时都可以与Kubernetes集成作为Kubernetes的容器运行时。
k8s核心概念详解
Kubernetes 包含多种类型的资源对象Pod、Label、Service、Replication Controller 等。 Pod容器组Pod是Kubernetes中最小的可调度和可管理的单元它可以包含一个或多个容器并共享相同的网络和存储资源。Pod是部署和扩展应用程序的基本单位。 Label标签Label是用于标识和组织Kubernetes资源的键值对。通过为资源对象添加标签可以对它们进行分类、选择和操作。标签可以用于实现资源的分组、服务发现、负载均衡等功能。 Service服务Service是一种抽象用于封装一组Pod并为它们提供一个统一的入口。Service为这些Pod分配一个虚拟IP地址并通过负载均衡将流量分发到这些Pod上实现了服务的访问和通信。 Namespace命名空间Namespace是用于在Kubernetes集群中创建多个虚拟集群的一种机制。通过使用命名空间可以将不同的资源对象隔离开来实现资源的多租户和资源隔离。 Controller控制器Controller是一种用于管理和控制资源对象的机制。Kubernetes提供了多种类型的控制器如副本控制器、服务控制器等用于监控和管理集群中的各种资源。 Replication Controller副本控制器Replication Controller用于确保Pod的副本数量与期望的副本数量保持一致。它会监控Pod的状态并在需要时创建、删除或重新调度Pod以满足用户定义的副本数量。
Kubernetes通过这些核心概念和机制实现了容器化应用程序的部署、管理和扩展。它提供了丰富的功能和工具使得应用程序的部署和运维变得更加简单和高效。
所有的资源对象都可以通过 Kubernetes 提供的 kubectl 工具进行增、删、改、查等操作并将其保存在 etcd 中持久化存储。 Kubernets其实是一个高度自动化的资源控制系统通过跟踪对比etcd存储里保存的资源期望状态与当前环境中的实际资源状态的差异来实现自动控制和自动纠错等高级功能。
Pod
它是最小的可部署单元。一个Pod可以包含一个或多个容器这些容器共享相同的网络和存储资源并在同一主机上运行。
Pod提供了一个抽象层用于封装应用程序的运行环境。它可以包含应用程序所需的所有组件如主应用程序容器、辅助容器如日志收集器、辅助工具等以及共享的存储卷。
Pod具有以下特点 网络共享Pod中的所有容器共享相同的网络命名空间和IP地址它们可以通过localhost相互通信。 存储共享Pod中的所有容器可以访问共享的存储卷这使得它们可以共享数据和文件。 生命周期Pod具有自己的生命周期它可以被创建、启动、停止和销毁。当Pod被销毁时其中的所有容器也会被终止。 调度和部署Pod可以由Kubernetes调度器在集群中的节点上进行部署。调度器会考虑节点的资源和约束条件选择适合的节点来运行Pod。
Pod是临时性的它可以根据需要创建和销毁。如果需要长期运行的实例可以使用Pod控制器如Deployment、ReplicaSet等来管理Pod的生命周期和副本数量。
Pod 控制器
Pod控制器是Kubernetes中的一种资源对象用于管理和控制Pod的创建、更新和删除。Pod控制器包括以下几种类型 ReplicaSet副本集ReplicaSet确保指定数量的Pod副本在集群中运行。它可以根据需要进行自动扩展或缩减Pod的数量以满足应用程序的需求。 Deployment部署Deployment建立在ReplicaSet之上它用于定义应用程序的期望状态并确保该状态得到维持。Deployment支持滚动更新和回滚操作可以方便地进行应用程序的发布和更新。 StatefulSet有状态副本集StatefulSet用于管理有状态应用程序的Pod副本。它为每个Pod分配一个唯一的标识符并提供稳定的网络标识和存储卷确保有状态应用程序的数据持久性和顺序性。 DaemonSet守护进程集DaemonSet用于在集群中的每个节点上运行一个Pod副本。它通常用于运行一些系统级别的服务如日志收集、监控等。 Job作业Job用于运行一次性任务或批处理任务。它确保任务成功完成并可以设置重试策略和并行度。
这些Pod控制器提供了不同的功能和用途可以根据应用程序的需求选择合适的控制器来管理Pod的生命周期。它们通过监控和调整Pod的数量和状态确保应用程序的高可用性和可靠性。
Label
在Kubernetes中Label标签是一种用于标识和组织资源的关键概念。它是一个键值对的元数据可以附加到Kubernetes对象如Pod、Service、Deployment等上。
以下是一些关于标签的重要信息 标签的结构标签由键值对组成例如appfrontend或tierbackend。键和值都是字符串类型且键必须是唯一的。 标签的作用标签可以用于对资源进行分类、筛选和选择。通过为资源添加标签可以更方便地管理和操作它们。 标签的用途标签可以用于多种用途例如 选择器Selector可以使用标签选择器来选择具有特定标签的资源。这在创建Service、Deployment等对象时非常有用。 资源组织可以使用标签将相关的资源进行分组和组织。例如可以为所有属于同一应用程序的资源添加相同的标签。 资源管理可以使用标签来跟踪和管理资源。通过为资源添加标签可以更容易地识别和操作它们。 标签的添加和修改可以在创建资源时为其添加标签也可以在后续的操作中对标签进行修改。例如可以使用kubectl命令行工具为Pod添加或修改标签。 标签的查询和选择可以使用标签选择器来查询和选择具有特定标签的资源。选择器可以使用等于、不等于、存在、不存在等操作符进行条件筛选。
通过使用标签可以更灵活地管理和操作Kubernetes中的资源。它提供了一种简单而强大的方式来组织、选择和管理资源使得应用程序的部署和管理更加灵活和可靠。
Label 选择器
在Kubernetes中标签选择器Label selector是一种用于查询和筛选具有特定标签的资源对象的机制。
标签选择器有两种类型基于等值关系和基于集合关系。 基于等值关系的标签选择器 选择具有指定标签键和值相等的资源对象。 !选择具有指定标签键但值不等于指定值的资源对象。 基于集合关系的标签选择器 in选择具有指定标签键且值在指定值列表中的资源对象。 notin选择具有指定标签键但值不在指定值列表中的资源对象。 exists选择具有指定标签键的资源对象。 !exists选择没有指定标签键的资源对象。
以下是一个示例展示如何使用标签选择器查询和筛选具有特定标签的Pod
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: nginxlabels:app: my-appenvironment: production要查询和筛选具有特定标签的Pod可以使用标签选择器表达式例如 appmy-app选择具有标签app的值为my-app的Pod。 environment!development选择具有标签environment的值不为development的Pod。 app in (my-app, your-app)选择具有标签app的值为my-app或your-app的Pod。
Service 服务
Service服务是一种抽象的概念用于定义一组Pod的访问方式和网络连接。Service为Pod提供了一个稳定的网络地址和DNS名称使得其他应用程序可以通过该地址和名称与Pod进行通信。
Service的主要作用是实现负载均衡和服务发现。它将流量分发到后端的Pod可以确保请求被均匀地分发到可用的Pod上从而提高应用程序的可用性和性能。 在KubernetesK8S集群中每个Pod都有一个单独的IP地址。然而由于Pod具有生命周期可能会因为业务变更而销毁并重新创建导致其IP地址也会改变。 为了解决这个问题K8S引入了Service作为核心概念。在K8S中Service并不是传统意义上的服务而更像是一个网关层用于提供一组Pod的对外访问接口和流量均衡。 Service通过标签选择器来确定作用于哪些Pod。在K8S集群中客户端需要访问的服务就是Service对象。每个Service都有一个固定的虚拟IP也称为Cluster IP它会自动绑定到后端的Pod并将所有网络请求转发给这些Pod。 除了提供稳定的对外访问方式Service还具备负载均衡的功能可以自动将请求流量分发到后端的所有Pod上。Service还能够实现透明的水平扩展对客户端来说是无感知的。 实现Service功能的关键是kube-proxy。kube-proxy在每个节点上运行监听API Server中服务对象的变化并通过三种流量调度模式userspace、iptables、ipvs来实现网络转发。 Service是K8S服务的核心它屏蔽了服务的细节统一对外暴露服务接口实现了真正的微服务。对于用户来说只需要关注一个Service的入口而不需要关心具体请求哪个Pod。 这样做的优势非常明显外部用户不需要关注Pod意外崩溃或K8S重新创建Pod导致的IP变化也不需要关注升级或变更服务导致的Pod替换和IP变化。
以下是一些关键的Service特性和概念 ClusterIP每个Service都有一个ClusterIP它是Service在集群内部的虚拟IP地址。其他Pod或Service可以通过该IP地址与Service进行通信。 Service类型Kubernetes支持多种Service类型包括ClusterIP、NodePort、LoadBalancer和ExternalName。每种类型都有不同的用途和配置方式。 SelectorService使用Selector来标识它所关联的Pod。通过标签选择器Service可以将流量转发到具有特定标签的Pod上。 端口映射Service可以将外部请求的端口映射到后端Pod的端口。这样外部应用程序可以通过Service的IP地址和映射的端口与Pod进行通信。 Headless Service除了普通的Service类型Kubernetes还支持Headless Service。Headless Service不会分配ClusterIP而是直接暴露后端Pod的网络地址。
Ingress 在Kubernetes集群中Service主要负责集群内部的网络拓扑它提供了一种抽象的方式来访问一组Pod。但是如果要从集群外部访问集群内部的服务就需要使用Ingress。 Ingress充当了整个Kubernetes集群的接入层它负责处理集群内外的通信。作为第7层应用层的组件Ingress可以通过HTTP/HTTPS等协议对外暴露服务。 与Service不同Service只能进行第4层的流量调度使用IP地址和端口进行访问。而Ingress可以根据不同的业务域和URL访问路径来调度业务流量。
用于将外部流量路由到集群内部的服务。它充当了集群和外部网络之间的入口点。 具体来说Ingress定义了一组规则用于将外部请求路由到集群内部的服务。它可以根据请求的主机名、路径或其他标识符将流量转发到相应的服务。通过使用Ingress可以实现负载均衡、SSL终止、路径基础的路由等功能。 在使用Ingress之前需要先部署一个Ingress控制器。Ingress控制器是一个运行在集群中的组件负责监视Ingress资源的变化并根据规则配置负载均衡器或代理服务器来处理外部流量。 一旦Ingress控制器部署好并配置了相应的规则外部流量就可以通过Ingress路由到集群内部的服务。这样可以通过一个统一的入口点来访问多个服务而无需暴露每个服务的具体地址。
总之Ingress是Kubernetes中用于管理外部流量访问的一种机制它通过定义规则将外部请求路由到集群内部的服务提供了更灵活和可扩展的流量管理方式。
Name
在Kubernetes中每个资源都有自己的名称通常定义在资源的元数据metadata中。元数据包含了一些描述资源的属性其中包括名称name属性。
名称在同一个命名空间namespace中必须是唯一的这意味着在同一个命名空间中不能存在相同名称的资源。这样可以确保在集群中对资源进行唯一标识和引用。
除了名称元数据还可以包含其他属性如标签labels和注释annotations。标签用于对资源进行分类和组织而注释则是一些额外的描述性信息。
通过名称和其他元数据属性可以在Kubernetes中对资源进行识别、查询和操作。这些属性在定义资源的清单文件或通过Kubernetes API进行编程时非常重要。
Namespace 命名空间
Namespace命名空间用于在集群中创建虚拟的工作环境将资源进行隔离和分类。它可以帮助不同的团队或项目在同一个集群中共享资源同时保持彼此之间的隔离。
使用Namespace可以将集群中的资源划分为逻辑上独立的单元每个Namespace都有自己的资源配额、网络和存储资源。不同的Namespace可以拥有相同名称的资源但它们彼此之间是隔离的不会相互干扰。
Namespace的主要作用包括 隔离和分类通过将资源划分到不同的Namespace中可以将不同的团队、项目或环境隔离开来避免资源冲突和干扰。 访问控制可以使用RBACRole-Based Access Control等机制对不同的Namespace进行权限控制限制用户或团队对资源的访问和操作。 资源配额可以为每个Namespace设置资源配额限制其使用的计算、存储和网络资源的数量以避免资源被某个Namespace过度占用。 管理和监控通过将资源按照Namespace进行分类可以更方便地管理和监控集群中的资源使用情况进行故障排查和性能优化。
在Kubernetes中默认会创建一个名为default的Namespace如果没有显式指定Namespace资源将被分配到default Namespace中。除了default Namespace外还可以创建自定义的Namespace根据实际需求进行资源的划分和管理。
不同 Namespace 内的 “资源” 名称可以相同相同 Namespace 内的同种 “资源”“名称” 不能相同。 合理的使用 K8S 的 Namespace可以使得集群管理员能够更好的对交付到 K8S 里的服务进行分类管理和浏览。查询 K8S 里特定 “资源” 要带上相应的 Namespace。