图说Kubernetes
Posted 侠影萍踪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图说Kubernetes相关的知识,希望对你有一定的参考价值。
简介
Kubernetes是用于管理容器化应用程序集群的工具,此过程通常被称为编排。Kubernetes协调许多微服务,这些微服务一起形成了有用的应用程序。Kubernetes不断自动地监视集群并对其组件进行调整。了解Kubernetes架构对于部署和维护容器化的应用程序至关重要。
什么是Kubernetes?
Kubernetes,简称为k8s(K和S之间8个字母),用于自动执行应用程序部署。现代分布式系统通常分布在云,虚拟机和服务器之上,手动管理应用程序代价极高,k8s就是为简化分布式应用、微服务或云原生应用的部署和管理而生。
K8s将虚拟机和物理机统一起来,开发人员可以使用Kubernetes API来部署、扩展和管理容器化的应用程序。k8s为分布式系统提供了灵活的框架,提供自动扩缩容、故障转移等功能。
k8s自动管理运行应用程序的容器,并确保生产环境中没有停机时间。如果某个容器发生故障,另一个容器会自动取代其位置,而最终用户根本不会感知该过程。
Kubernetes除了编排功能之外,还维护了一组彼此独立,也相互关联的控制进程;其可以维护系统当前状态,也可以根据配置向所需方向演进和发展。
Kubernetes架构和组件
Kubernetes采用分布式架构。它基于声明式模型运行并实现“所需状态”。以下步骤说明了Kubernetes的基本过程:
管理员创建应用程序的所需状态并将其放入yaml文件中。
使用CLI或UI将文件提供给Kubernetes API Server。Kubernetes的默认命令行工具称为kubectl。
Kubernetes将文件(应用程序的所需状态)存储在称为键值存储的数据库(etcd)中。
Kubernetes在集群内的所有相关应用程序上实现所需的状态。
Kubernetes持续监视集群的元素,以确保应用程序的当前状态不会与所需状态有所不同。
k8s总体架构图
接下来,我们将通过介绍Kubernetes集群的各个组件,以更详细地了解该过程。
Kubernetes Master
Kubernetes Master(Master Node)接收来自客户通过CLI(命令行界面)或UI(用户界面)调用k8s API的请求。通过master node,用户可以定义想要Kubernetes维护的Pod,ReplicateSet和service等。例如,要使用哪些容器镜像,暴露哪些接口以及需要多少Pod副本数量等等。而且,用户可以为该集群中运行的应用程序进行所需状态的参数化配置。
k8s master架构图
API Server
API Server是k8s的前端,是用户唯一可以直接交互的k8s组件。通过API server, k8s为内部系统组件和外部用户组件,提供了统一的API调用和通信方式。
键值存储etcd
键值存储(也称为etcd)是k8s备份所有集群数据的数据库。它存储集群的整个配置和状态。主节点查询etcd以检索node,container和container的状态参数。
Controller
Controller的作用是通过API Server获得所需状态。它检查要控制的节点的当前状态,确定是否与所需状态存在差异,并最终配置为所需状态。
Scheduler
Scheduler会监视来自API Server的请求,并将其分配给运行状况良好的节点。它对节点的质量进行排名,并将Pod部署到最适合的节点。如果没有合适的节点,则将Pod置于挂起状态,直到出现合适的节点。
注意:最好不要在主节点上运行用户应用程序。让k8s master node完全专注于管理集群。
Kubernetes Worker
Worker node监听来自API server的工作分配,并执行被分配的工作,然后将结果报告回k8s Master.
k8s worker架构图
Kubelet
集群中每个节点上都运行kubelet,它是k8s最重要组件之一。通过安装kubelet,节点的CPU、内存和存储成为所处集群的一部分。它监听来自API Server的任务,执行相应任务,并报告给master节点。它还会监控Pod,如果Pod不能完全正常运行,则会向控制层报告。基于以上信息,master可以决定如何分配任务和资源以达到所需状态。
容器运行时
容器运行时从容器镜像库中拉取镜像,控制启动或停止容器。容器运行时由第三方软件或插件(例如Docker)实现。
Kube-proxy
Pod
在k8s中,Pod是调度的最小元素。没有它,容器就不能成为集群的一部分。如果需要扩展应用程序,只能通过添加或删除Pod来实现。
Pod是k8s中一个抽象化概念,是由一个或多个容器组合在一起的共享资源。根据资源的可用性,master会把Pod调度到特定工作节点上,并与容器运行时协调以启动容器。
k8s Pod
Kubernetes Services
Pod不是恒定不变的,无法正常运行的Pod会被新的Pod取代。但是,这些新的Pod具有一组不同的IP。这可能导致调用出现问题。如果放任不管,此属性将高度不可靠。
Kubernetes Service 如何工作?
Pod通过标签(Label)和选择器(Selector)的键值对与Service相关联。Service会自动发现带有与选择器匹配标签的新Pod。此过程无缝地将新Pod添加到Service,同时,从群集中删除已终止的Pod。
例如,如果所需状态定义了需要一个Pod的三个副本,而运行一个副本的节点发生故障,则当前状态将减少为两个Pod。Kubernetes观察到所需的状态是三个Pod。然后,它会调度创建一个新副本来代替发生故障的Pod,并将其分配给集群中的另一个节点。
通过添加或删除容器来扩展或缩放应用程序时,同样适用。一旦我们更新了所需状态的定义,k8s就会注意到差异并添加或删除Pod以匹配yaml文件里定义的所需状态。k8s控制面负责记录,实现和运行后台调度,循环不断地检查环境是否符合用户定义的环境要求。
什么是容器化部署 - Container Deployment?
为了充分理解k8s如何协调以及协调什么,我们需要探索容器部署的概念。
传统部署
最初,开发人员在单个物理服务器上部署了应用程序。这种部署带来了一些挑战,物理资源的共享意味着一个应用程序可能占用大部分处理能力,从而限制了同一台计算机上其他应用程序的性能。
传统部署
扩展硬件容量需要花费很长时间,增加很多成本。为了解决硬件限制,虚拟化出现了。
虚拟化部署
虚拟化部署允许在单个物理服务器上创建隔离的虚拟环境,即虚拟机(VM)。该解决方案隔离了VM中的应用程序,限制了资源的使用并提高了安全性。一个应用程序不能再自由访问另一个应用程序处理的信息。
虚拟机部署
通过虚拟化部署,可以快速扩展并分散单个物理服务器的资源,随意更新单个VM中的应用程序,并且控制硬件成本。每个VM都有其操作系统,并且可以在虚拟化硬件之上运行所有必要的系统。
容器化部署
容器部署变得更加灵活和高效。就像虚拟机一样,容器具有单独的内存,系统文件和处理空间,严格隔离不再是限制因素。现在,多个应用程序可以共享相同的基础操作系统。此功能使容器比成熟的VM效率更高。它们可跨越云,跨不同的设备,在几乎所有OS发行版间进行移植。
容器化部署
应用程序收缩到容器内,作为更小的独立个体运行,之后在多台计算机上动态部署和管理它们。如此精细的结构和任务的划分难以手动管理,需要一个像k8s这样的自动化解决方案,更加有效管理此过程中涉及的所有组件。
总结
Kubernetes采用了非常简洁的方式管理和操作容器。用户输入期望系统达成的状态,Kubernetes对比期望状态和集群当前状态,然后将系统设定为所需状态。
以上是关于图说Kubernetes的主要内容,如果未能解决你的问题,请参考以下文章
云原生之kuberneteskubernetes集群下ConfigMap使用方法
云原生之kuberneteskubernetes集群下Secret存储对象的管理
云原生之kuberneteskubernetes集群下的Deployment高级资源对象管理
云原生之kuberneteskubernetes集群下的健康检查使用方法