一文读懂Kubernetes之 K8s 概述

部署运行你感兴趣的模型镜像

目录

一、Kubernetes集群组件

(一)、控制平面组件(Control Plane Components)

1、kube-apiserver

2、etcd

3、kube-scheduler

4、kube-controller-manager

5、cloud-controller-manager(可选的)

(二)、节点组件

1、kubelet

2、kube-proxy(可选的)

3、容器运行时(Container runtime)

(三)、插件(Addons)

1、DNS

2、Web界面(Dashboard)

3、容器资源监控

4、集群层面日志

5、网络插件

二、Kubernetes核心资源对象

(一)、Namespace

(二)、Pod

(三)、Controller

(四)、Service

(五)、Ingress

(六)、标签(Label)


 更多精彩博文详见:

《Linux系统应用运维》专栏总目录(持续更新)

        Kubernetes是当前最热门的开源容器编排框架,其本质是一组服务器集群,通过在集群节点上运行特定的组件程序,来对节点中的容器进行进行声明式配置和自动化管理。主要提供了自动故障修复、服务副本弹性伸缩、请求负载均衡、版本回退等功能。

        本文主要介绍了Kubernetes集群中的核心集群组件以及核心资源对象。

一、Kubernetes集群组件

        

        Kubernetes集群由控制平面和一个或多个工作节点组成。在控制平面和工作节点上,分布着不同的集群组件,各司其职共同支撑集群地运转。

(一)、控制平面组件(Control Plane Components)

       

        控制平面组件用于管理Kubernetes集群的整体状态,为集群做出全局决策,比如资源调度以及检测和响应集群事件等。控制平面组件可以运行在集群的任意节点中,然而为了方便管理与维护,通常将控制平面组件部署在同一个节点上,可称为控制节点。

1、kube-apiserver

        Kubernetes API服务器是控制平面的前端,该组件负责公开了Kubernetes API,负责处理接受请求的工作。Kubernetes API服务器的主要实现是kube-apiserver组件。

2、etcd

        etcd组件是一个一致且高可用的键值存储系统,用作Kubernetes集群中各种资源对象数据存储的后台数据库。

3、kube-scheduler

        kube-scheduler组件负责将新创建的或者未指定工作节点的Pod,按照预定的策略,将其调度至相应的工作节点运行。

4、kube-controller-manager

        kube-controller-manager组件负责运行控制器进程。从逻辑上讲,每个控制器都是一个单独的进程,但是为了降低复杂性,它们都在同一个进程中运行。控制器有不同的类型,例如:

  • Node 控制器:负责在节点出现故障时进行通知和响应。
  • Job 控制器:监测代表一次性任务的Job对象,然后创建Pod来运行这些任务直至完成。
  • EndpointSlice控制器:填充EndpointSlice对象(以提供Service和Pod之间的链接)。
  • ServiceAccount控制器:为新的命名空间创建默认的ServiceAccount。

5、cloud-controller-manager(可选的)

        cloud-controller-manager组件允许将你的Kubernetes集群连接到云提供商的API,并将与该云平台交互的组件和你的Kubernetes集群交互的组件分离开来。如果你的Kubernetes集群仅仅运行在独立的环境中,则不需要部署cloud-controller-manager组件。

(二)、节点组件

        

        运行节点组件的节点,可称为工作负载节点。节点组件会在每个工作负载节点上运行,负责维护运行的Pod并提供Kubernetes运行时环境。

1、kubelet

        kubelet组件在Kubernetes集群的每个工作负载节点上运行,负责维护容器(containers)的生命周期,保证容器(containers)都运行在Pod中。

        kubelet组件是基于PodSpec来工作的。每个PodSpec是一个描述Pod的YAML或JSON对象。 kubelet组件接收一组通过各种机制(主要是通过apiserver)提供给它的PodSpec,并确保这些PodSpec中描述的容器处于健康运行状态。kubelet组件只管理由 Kubernetes集群所创建的容器。

2、kube-proxy(可选的)

        kube-proxy组件是Kubernetes集群每个工作负载节点上所运行的网络代理,是实现Kubernetes中服务(Service)概念的一部分。

        kube-proxy组件维护工作负载节点上的一些网络规则,这些网络规则会允许集群内部或者外部的网络会话与Pod进行网络通信。如果操作系统提供了可用的数据包过滤层,则kube-proxy组件会通过它来实现网络规则。否则,kube-proxy组件仅做流量转发。

        如果使用网络插件为服务(Service)实现自身的数据包转发,并提供与kube-proxy组件等效的功能,则不需要在Kubernetes集群的工作负载节点上运行kube-proxy组件。

3、容器运行时(Container runtime)

        容器运行时组件在Kubernetes集群的每个工作负载节点上运行。这个基础组件,使得Kubernetes能够有效运行容器,它负责管理Kubernetes集群环境中容器的执行和生命周期。Kubernetes支持许多容器运行时环境,例如containerd、Docker Engine、CRI-O以及Kubernetes CRI(容器运行环境接口)的其他任何实现。

(三)、插件(Addons)

       

        Kubernetes中,插件并非是必须的组件。安装插件能够丰富集群的功能,可以根据实际需求选择插件。因为这些插件提供集群级别的功能,插件中命名空间域的资源属于kube-system命名空间。

1、DNS

        Kubernetes集群都应该有集群DNS,因为很多示例都需要DNS服务。集群DNS是一个DNS服务器,与环境中的其他DNS服务器一起工作,它为Kubernetes服务提供 DNS 记录。

2、Web界面(Dashboard)

        Dashboard是Kubernetes集群通用的、基于Web的用户界面。它使用户可以通过图形化界面管理集群中运行的应用服务以及集群本身,进行应用部署、故障排除等操作。

3、容器资源监控

        容器资源监控将容器常见的时序度量值保存到一个集中的数据库中,并提供浏览这些数据的界面,从而了解应用程序资源使用情况等详细信息。

4、集群层面日志

        集群层面日志机制负责将容器的日志数据保存到统一的日志存储系统中,这个日志存储系统提供搜索和浏览日志数据的接口,以便于分析容器崩溃、Pod被逐出或者节点宕机等情况。

5、网络插件

        网络插件是实现容器网络接口(CNI)规范的软件组件。它们负责为Pod分配IP地址,并使这些Pod能在集群内部相互通信。


二、Kubernetes核心资源对象

        在Kubernetes中,所有的内容都抽象为资源对象。用户管理Kubernetes的过程,即是用户操作资源对象的过程。Kubernetes中核心资源对象详见下文。

(一)、Namespace

        Namespace主要是用来进行资源隔离。Kubernetes通过将集群内的资源对象(如Pod、Service等)分配到不同的Namespace中,形成逻辑上的独立空间,以方便不同空间的资源进行隔离使用和管理。

Kubernetes在集群启动之后,通常默认创建如下的Namespace:

  • default:所有创建时未指定Namespace的资源对象都会被分配到default。
  • kube-node-lease:集群节点间的心跳维护,v1.13引入。
  • kube-public:此Namespace下的资源对象可以被所有人访问(包括未认证用户)。
  • kube-system:所有由Kubernetes系统创建的资源对象都处于这个命名空间。

(二)、Pod

        

        Pod是Kubernetes中可以创建和管理的最小单元。应用程序部署在容器中,而容器必须存在于Pod中。一个Pod中可以有1个或者多个容器。通常情况下不会直接操作Pod,而是通过Pod控制器(例如Deployment)创建或者管理Pod。

(三)、Controller

        

        在Kubernetes中,Pod是最小的管理单元,但是通常情况下Kubernetes不会直接操作Pod,而是通过Pod控制器(Controller)来管理Pod,比如创建Pod、停止Pod、伸缩Pod数量等。当Pod资源在运行中出现故障时,会基于预定的策略重启或者重建Pod。

        在Kubernetes中,有很多不同类型的Pod控制器,每种控制器都有其特定的使用场景。

常用的Pod控制器有如下:

  • ReplicaSet:保障Pod副本数量维持在期望值,并支持Pod数量扩缩容、容器镜像版本升级等。
  • Deployments:Deployments用于自动管理ReplicaSet,通过控制ReplicaSet来管理Pod,并支持滚动升级、版本回退等。
  • DaemonSet:在集群中全部或者指定工作节点上运行且仅运行一个Pod副本。当集群新增工作节点时,会新增一个Pod副本;当集群移除工作节点时,这个Pod副本也会被回收。DaemonSet一般用于守护进程类的任务,例如在每个节点上运行日志收集守护进程或者在每个节点上运行监控守护进程。
  • Job:Job会创建一个或者多个Pod,并执行指定的任务。Job会跟踪记录成功完成任务的Pod个数,当数量达到指定阈值时,任务(即Job)结束。Job可用于执行一次性任务。
  • Cronjob:Cronjob创建的Pod负责执行周期性任务,如备份、生成监控报告等。
  • StatefulSet:用来管理有状态应用的资源对象。
  • HorizontalPodAutoscaler:根据集群负载状态自动水平调整Pod的副本数量,实现削峰填谷功能。


 

(四)、Service

        

        在Kubernetes中,Pod是应用程序的载体。在集群内部,我们可以通过Pod的IP来访问应用程序。但是Pod的IP并不是固定的,使用IP访问服务并不是很方便。Kubernetes使用Service资源将运行在一个或一组Pod上的应用程序公开,并提供统一的服务访问入口地址。这样客户端就能通过Service的统一入口地址,访问到后端的Pod服务,而不必关心Pod的变化。

Service主要有以下几个类型:

  • ClusterIP:通过集群的内部IP公开Service,只能在集群内部访问。这个类型是默认值。
  • NodePort:通过每个工作节点的IP和端口公开Service。通过此方法可以在集群外部访问服务。
  • LoadBalancer:使用云平台的负载均衡器向外部公开Service。Kubernetes不直接提供负载均衡组件,此模式需要外部云环境支持。
  • ExternalName: 把集群外部的服务引入集群内部,直接使用。

(五)、Ingress

        

        Kubernetes中的Ingress资源对象,相当于一个七层的负载均衡器,提供从集群外部到集群内部服务的HTTP或者HTTPS路由。Ingress资源对象定义指定的规则,将流量路由最终映射到对应的后端Pod应用程序。通过配置,Ingress可为Service提供外部可访问的URL、对其流量作负载均衡、终止SSL/TLS,以及基于名称的虚拟托管等能力。

        Ingress控制器负责完成Ingress的工作,是具体实现反向代理及负载均衡的程序。对Ingress定义的规则进行解析、根据配置的规则来实现请求转发等功能均是由Ingress控制器完成。实现方式有很多,比如Ingress-Nginx控制器等。

        Ingress目前已经停止更新,新的功能正在集成至Gateway API中。

(六)、标签(Label)

       

        标签(Label)是附加到Kubernetes资源对象(例如Pod)上的键值对,用于标识、区分资源对象。标签(Label)既可以在创建资源对象时附加,也可以动态添加、修改或者删除。每个资源对象可以定义任意数量的标签(Label),同一个标签(Label)也可以被添加到任意数量的资源对象上。

常用的标签(Label)示例如下:

  • 版本标签:"version":"1.2", "version":"1.3"
  • 环境标签:"environment":"test","environment":"pro","environment":"qa"
  • 架构标签:"architecture":"frontend","architecture":"backend"

        标签(Label)定义完成后,如何选择符合需求的标签(Label)呢?这里就需要使用到标签选择器(Label Selector)。标签选择器(Label Selector)用于查询和筛选拥有指定标签(Label)的资源对象。

当前有两种标签选择器(Label Selector):

1、基于等值的

  • environment = pro:表示选择所有包含Label中key="environment "且value="pro"的资源对象。
  • environment != test:表示选择所有包含Label中key="environment "且value!="test"的资源对象。

2、基于集合的

  • environment in (qa, pro):表示选择所有包含Label中key="environment"且value="qa"或者value="pro"的资源对象。
  • environment not in (qa):表示选择所有包含Label中key="environment"且value不等于"qa"的资源对象,以及所有没有“environment”键标签的资源对象。

        标签(Label)的选择条件可以有多个,即将多个标签选择器(Label Selector)进行组合,使用逗号","进行分隔即可。

例如:

version = 1.2, environment != test, architecture = backend


您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

Kubernetes (k8s)是一种用于自动化应用程序部署、扩展和管理的开源容器编排平台。在k8s中,Pod是最小的可调度和可管理的单位,也是应用程序的运行实例。 Pod是一组共享资源的容器集合,它们运行在同一个节点上,并共享相同的网络命名空间和存储卷。一个Pod通常包含一个或多个紧密相关的容器,它们共享相同的生命周期和资源。这些容器之间可以通过本地主机上的localhost进行通信。 Pod的设计理念是将一组密切相关的容器放在同一个Pod中,以便它们能够轻松地共享资源,包括存储和网络。Pod可以在Kubernetes上进行水平扩展,即通过增加Pod的数量来增加应用程序的容量和吞吐量。 Pod是临时的和短暂的,它可以在任何时候被创建、销毁或重新创建。这个设计使得应用程序变得弹性和可伸缩,并支持故障恢复。当Pod被销毁时,Kubernetes会自动重新创建一个新的Pod来替代它,以保持应用程序的可用性。 Pod具有唯一的IP地址,并且可以由其他Pod或外部网络访问。它还可以指定一些元数据(如标签和注释),以方便按需选择和管理Pod。通过使用Pod模板,可以定义Pod的规范,包括容器映像、资源要求和环境变量等。 总之,Pod是Kubernetes中的基本概念,它是一组紧密相关的容器的运行实例。Pod提供了容器之间共享资源的环境,并支持弹性扩展和故障恢复。通过使用Pod,我们可以更高效地管理和部署我们的应用程序。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野熊佩骑

您的鼓励是我持续创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值