k8s 基础组件详解

一、k8s简介

Kubernetes 是容器集群管理系统工具,是一个开源平台,可实现容器集群的自动化部署、自动扩缩容、维护等功能。Kubernetesk8s是Kubernetes的缩写,Google 于 2014 年开源了 Kubernetes 项目,Kubernetes的名字来自希腊语,意思是“舵手” 或 “领航员”,K8s是将8个字母“ubernete”替换为“8”的缩写。

二、k8s来源与理论

2.1  应用部署方式的演变

在应用程序部署的方式上,主要经历了三个时代:

传统部署方式

互联网早期,直接将应用部署在物理机上(真实的服务器);

优点:

  • 是部署简单快捷,资源独享,不需要其他的技术参与;

缺点:

  • 不能为应用程序定义资源的使用边界,很难合理的分配服务器计算资源,程序之间容易产生干扰和影响;
  • 部署多个物理机,维护许多物理服务器的成本很⾼;

虚拟化部署方式

允许在一台物理机上运行多个虚拟机,每个虚拟机都是一个独立环境,虚拟化能使应⽤程序在不同 VM 之间被彼此隔离,且能提供⼀定程度的安全性;

  • 优点:程序环境不会相互产生影响,提供了一定程序上的安全性;
  • 缺点:增加了操作系统,浪费了部分资源;

容器化部署方式

容器类似于 VM,但具有更宽松的隔离特性,使容器之间可以共享操作系统(OS),最典型的代表就是docker技术,随着docker的产生和大规模的实践,以docker为代表的容器化部署方式逐渐流行起来,其优势是很明显的:

  • 简单的一行命令就可以快速搭建和部署各种中间件,如mysql,redis等;
  • ⽐起 VM 被认为更轻量级,每个容器都有⾃⼰的⽂件系统、CPU、内存、进程空间等;
  • 运行应用程序所需要的资源都被容器包装,并和底层基础架构解耦;
  • 容器化的应用程序可以跨云服务商、跨 Linux 操作系统发行版进行部署;

用一张图表示如下

2.2  k8s 演变过程

传统的服务 => 虚拟机部署  =>  容器部署  =>  k8s

k8s的由来,归根结底是容器的由来,因此需要先搞清楚容器的来龙去脉,k8s是在容器的基础上,方便容器管理、维护,包括声明式配置和自动化。

说到底,k8s的发展历程可以说说与docker的发展有着千丝万缕的联系,为了后面弄清k8s的相关理论,有必要对docker的发展做一个简单的介绍;

2.3  docker 演变历史

容器化时代,一台物理机上可以运行多个容器实例,而一个容器跑多个应用程序,如下图,为一个使用容器部署应用的典型架构;

容器类似于虚拟机,但它们具有松隔离性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻量级的;

与 VM 类似,容器有自己的文件系统、CPU 、内存、进程等。由于它们与底层基础架构分离,因此它们可以实现跨云和操作系统的分布移植。比如可以在ubuntu,centos,redhat,甚至不同的云平台都可以方便快捷的部署应用;

容器之所以在短短的几年快速流行起来,其自身的优势是多方面的,总结如下:

  • 敏捷的应用创建与部署:与使用VM镜像像比,容器镜像创建的简便性和效率更高;
  • 持续开发、集成和部署:提供可靠,且频繁的容器镜像构建和部署,以及可以快速高效的回滚(由于映像不变性);
  • Dev 和 Ops 的关注点分离:在构建/发布时而不是部署时创建应用程序容器的镜像,从而将应用程序与基础架构解耦;
  • 可观测性:不仅可以显示操作系统级别的信息和指标,还可以显示应用程序运行状况和其他信号;
  • 开发、测试和生产之间的环境一致性:在笔记本电脑上运行与在云中运行环境相同;
  • 以应用为中心的管理:将抽象级别从在虚拟硬件上运行操作系统提高到使用逻辑资源在操作系统上运行应用程序;
  • 松散耦合、分布式、弹性、自由的微服务:应用程序被分解成更小的、独立的部分,并且可以动态部署和管理——而不是在一台大型单一用途机器上运行的单一堆栈;
  • 资源隔离:可预测的应用程序性能;
  • 资源利用:高效率、高密度;

总结来说,Docker 由镜像、镜像仓库、容器三个部分组成:

  • 镜像: 跨平台、可移植的程序+环境包;
  • 镜像仓库: 镜像的存储位置,有云端仓库和本地仓库之分,官方镜像仓库地址;
  • 容器: 进行了资源隔离的镜像运行时环境;

2.4  从Docker到Kubernetes

随着容器的火爆,越来越多的业务系统利用容器来搭建部署,像 Docker 之类的容器引擎,部署少量还可以,但随着业务的增多,服务越来越多,动辄就要使用成百上千的容器,要管理这么多容器,Docker 们就力不从心了。随着容器技术越来越多的使用,出现了很多问题

  • 百上千的容器管理问题,比如:10个物理机发布100个容器,怎么快速发布和管理?
  • 突发海量请求过来,如何根据情况进行快速扩容 ?
  • 某个容器故障了,如何快速启动新容器去替代 ?
  • 分布式环境下容器如何通信?
  • 如何协调和调度这些容器?
  • 如何在升级应用程序时不会中断服务?
  • 如何监视应用程序的运行状况?
  • 如何批量重新启动容器里的程序?

有需求就有改变,于是市场上就出现了一批容器编排工具,典型的是 Swarm、Mesos 和 K8S。

  • Docker Swarm:Docker自己的容器编排工具 ;
  • Mesos:Apache的资源管控的工具,结合Marathon使用 ;
  • Kubernetes:Google开源的的容器编排工具,基于内部Borg系统的开源版本 ;

最后,K8S“击败”Swarm 和 Mesos,几乎成了当前容器编排的事实标准

再说 k8s

  • Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”;
  • k8s 这个缩写是因为 k 和 s 之间有八个字符的关系;
  • Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践;
  • Kubernetes是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,简称 K8S ;
  • K8S的本质是一组服务器集群,可以在对应服务器集群的每个节点上运行程序,来对节点中的容器进行管理;
  • 类似Master-Work方式,每个服务器上安装特定的k8s组件,就可以形成集群,然后部署对应的应用即可;

官方文档:Kubernetes 文档 | Kubernetes

k8s常见的功能

服务发现和负载均衡

  • Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器;
  • 如果进入容器的流量很大, Kubernetes 能够自动实现请求的负载均衡分配网络流量,从而使部署稳定 ;

存储编排

  • Kubernetes 允许自动挂载选择的存储系统,例如本地存储、云提供商存储等 ;

自动部署和回滚

  • 可以用k8s自动化部署创建新容器, 删除现有容器并将它们的所有资源用于新容器 ;
  • 当版本发布错误,可以立刻回退到之前的版本

自我修复

  • 如果某个容器宕机了,K8S 可以快速重新启动新的的容器,替换旧的容器 ;

密钥与配置管理

  • K8S允许存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥 ;

k8s 主要特性

  • 高可用,不宕机,自动灾难恢复;
  • 灰度更新,不影响业务正常运转;
  • 一键回滚到历史版本;
  • 方便的伸缩管理(包括应用伸缩,机器增减),提供负载均衡;
  • 有一个完善的生态体系,谷歌背书,社区活跃;
  • 轻量级;
  • 开源;
  • 弹性伸缩;

三、k8s核心组件总结

下图为k8s的整体架构图,k8s的高效运行离不开各个组件的密切协作,接下来针对其中的各个核心组件做详细的说明;

从大的模块来看,可以分为master,node,etcd 和其他组件;

3.1  Master 相关组件

是集群控制节点(相当于整个集群的指挥中⼼),在每个Kubernetes 集群⾥都需要有⼀个 Master 来负责整个集 群的管理和控制;

  • api server: 所有服务访问的统一入口,图中未体现api server与kubelet、kube proxy交互,实际上有交互;
  • replication controller: 副本控制器,维护pod副本的期望数,超过或不足将进行自动的关闭或重建;
  • scheduler: 调度器,负责接收任务,选择合适的节点分配任务;

controller-manager

在主节点上运行 控制器 的组件。从逻辑上讲,每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。这些控制器包括:

  • 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应;
  • 任务控制器(Job controller): 监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成;
  • 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod);
  • 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌;

apiserver

API 服务器是 Kubernetes 控制面的组件, 该组件公开了 Kubernetes API, API 服务器是 Kubernetes 控制面的前端,通过kube-apiserver连接各个组件;

  • Kubernetes API 服务器的主要实现是 kube-apiserver;
  • kube-apiserver 设计上考虑了水平伸缩,也就是说,它可通过部署多个实例进行伸缩;
  • 你可以运行 kube-apiserver 的多个实例,并在这些实例之间平衡流量;

scheduler

  • 控制平面组件,负责监视新创建的、未指定运行节点(node)的 Pods,选择节点让 Pod 在上面运行;
  • 调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限;

etcd

etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库;

对k8s来说,只要etcd的数据库存在,各组件就能恢复,因此 Kubernetes 集群的 etcd 数据库通常需要有个备份方式,具体来说:

  • 可信赖分布式键值对存储服务(KV服务),键值对数据库,存储k8s集群的所有重要信息(持久化);
  • v2版本,写入内存;
  • v3版本,支持本地磁盘;
  • k8s的v1.11废弃了etcd的v2版本;

3.2  Node相关组件

node

一个node可直观上认为是k8s集群管理的一个物理节点,在一个node上面可能运行了多个docker容器;

  • 除了 master k8s 集群中的其他机器被称为 Node 节点, Node节点才是 kubernetes 集群中的⼯作负载节点;
  • 每个 Node 节点都会被 master 分配⼀些⼯作负载(docker容器), node 节点上的 docker 负责容器的运⾏;

从上图可知,node上面除了docker容器,还有kubelet 和kube proxy,具体来说:

  • kubelet: 直接跟容器引擎交互,实现容器的生命周期管理。比如:管理docker;
  • kube proxy: 负责写入规则至IPTables或IPVS实现服务映射访问。通过操作防火墙达到Pod之间的通信以及Pod的负载均衡;

Pod

Pod 是⼀组容器 , K8S 中,最⼩的单位是 Pod, ⼀个 Pod 可以包含多个容器,但通常情况下我们在每个Pod 中仅使⽤⼀个容器;

pod根据是否自主创建,可以分为自主创建和控制器创建,具体来说:

  • ⾃主创建:直接创建出来的Pod,这种pod删除后就没有了,也不会⾃动重建;
  • 控制器创建:通过控制器创建的pod,这类Pod删除了之后还会⾃动重建;

kubelet

一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都运行在 Pod 中。

  • kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康;
  •  kubelet 不会管理不是由 Kubernetes 创建的容器;

kube-proxy

kube-proxy 是集群中每个节点上运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分,例如做流量负载均衡。

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

两种kube-proxy:

  •  iptables:不允许访问service本身;
  •  ipvs:可以访问service本身;

Service

  • k8s ⾥,每个 Pod 都会被分配⼀个单独的 IP 地址, 但这个IP地址会随着 Pod 的销毁⽽消失;
  • Service (服务)就是⽤来解决这个问题的,对外服务的统⼀⼊⼝,⽤于为⼀组提供服务的Pod 抽象⼀个稳定的⽹络访问地址;
  • ⼀个Service可以看作⼀组提供相同服务的Pod的对外访问接⼝,作⽤于哪些Pod是通过标签选择器来定义的;

Label

K8S 提供了⼀种机制来为 Pod 进⾏分类,那就是 Label (标 签),同⼀类pod 会拥有相同的标签

  • Label 的具体形式是 key-value 的标记对,可以在创建资源的时候设置,也可以在后期添加和修改;
  • 给某个资源对象定义⼀个Label,就相当于给它打了⼀个标签,可以通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象,K8S通过这种⽅式实现了类似SQL的对象查询机制;
适用场景

需要对不同版本的应用进行集中式的管理时,可以为不同的pod打上不同的标签,对应的资源打上标签后,可以使⽤标签选择器过滤指定的标签

 NameSpace

Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为命名空间

 具体来说,k8s中的NameSpace具有如下特点:​​​​​​​

  • 同⼀个名字空间中的资源名称必须唯⼀,⽽不同名字空间之间则没有这个要求;
  • NameSpace是不能嵌套的,每⼀个 Kubernetes 的资源都只能在⼀个NameSpace内;
  • NameSpace是在多个⽤户之间划分集群资源的⼀种⽅法(通过资源配额);
  • 不必使⽤多个名字空间来分隔轻微不同的资源,例如同⼀软件的不同版本: 应该使⽤标签 来区分同⼀名字空间中的不同资源;

Kubernetes启动后,会创建四个初始NameSpace名称空间

  • default 没有指明使⽤其它名字空间的对象所使⽤的默认名字空间;
  • kube-system Kubernetes 系统创建对象所使⽤的名字空间;
  • kube-public
  • kube-node-lease;

3.3  其他重要组件

  • CoreDNS: 可以为集群中的svc创建一个域名ip的对应关系解析;
  • DashBoard: 给K8s提供一个B/S访问体系;
  • Ingress Controller: 官方实现四层代理,Ingress可以实现七层代理(负载均衡);
  • Federation: 提供一个可以跨集群中心多k8s统一管理功能;
  • Prometheus: 提供K8S集群的监控能力;
  • ELK: 提供k8s集群日志统一接入平台;

原文地址:https://blog.csdn.net/zhangcongyi420" target="_blank" rel="noopener" title="小码农叔叔">小码农叔叔</a> <img class="article-time-img article-heard-img" src="https://csdnimg.cn/release/blogv2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读942次。kube-controller-manager 和 kubelet 是异步工作的,这意味着延迟可能包括任何的网络延迟、apiserver 的延迟、etcd 延迟,一个节点上的负载引起的延迟等等。当 Kubernetes 中 Node 节点出现状态异常的情况下,节点上的 Pod 会被重新调度到其他节点上去,但是有的时候我们会发现节点 Down 掉以后,Pod 并不会立即触发重新调度,这实际上就是和 Kubelet 的状态更新机制密切相关的,Kubernetes 提供了一些参数配置来触发重新调度的时间。_node-monitor-period
文章浏览阅读3.8k次。上篇文章详细介绍了弹性云混部的落地历程,弹性云是滴滴内部提供给网约车等核心服务的容器平台,其基于 k8s 实现了对海量 node 的管理和 pod 的调度。本文重点介绍弹性云的调度能力,分为以下部分:调度链路图:介绍当前弹性云调度体系链路,对架构体系有一个初步的认知k8s 调度能力的运用:整体介绍弹性云现在用到的 k8s 调度能力和对其的增强k8s 版本的升级:介绍到从 k8s 1.12 到 1...._滴滴机房 腾讯
文章浏览阅读897次。对于cpu来说,这种分配方式并不会有太大问题,因为cpu可以灵活调度,numa调度时我们只计算绑定了numa cpu的pod是可以接受的,但是对于内存来说,numa node上申请了的内存无法做到随时迁移,这就会导致调度器视角numa node的mem资源足够,但是等到pod真正使用时,由于没有绑定numa node的pod申请的内存,导致numa node的mem资源不足,造成swap中断或者远端内存申请,这会对绑定mem的pod来带来性能损耗。忽略了没有绑定numa node的pod资源。_kubectl numa
文章浏览阅读796次,点赞17次,收藏15次。只要在Service定义中设置了ClusterIp:None,就定义了一个HeadLess Service, 它与普通的Service关键区别在于它没有ClusterIp地址,如果解析HeadLess Service的DNS域名,则会返回该Service对应的全部Pod的EndPoint列表,这就意味着客户端是直接与后端的pod建立了TCP/IP链接进行通信的。一个Label是一个键值对。注解:属于资源对象的元数据,可以被理解为一种特殊的标签,不过更多的是与程序挂钩,通常用于实现资源对象属性的自定义扩展。
文章浏览阅读763次。但是此时如果配置成 NONE, 租户创建成功了,但是无法创建资源文件,也就是无法上传文件,可能 dolphinscheduler 团队就想着将文件上传到 hdfs,暂不支持本地。需要将 resource.storage.type 置为 NONE, 因为我之前用的 1.3.6 版本的时候,即使资源文件存在本地文件也需要配置成 hdfs。_[error] 2023-10-24 18:10:43.762 +0800 org.apache.dolphinscheduler.api.servic
文章浏览阅读2.7k次,点赞2次,收藏13次。公司使用的是交老的k8s版本(1.16),由于老版本的K8s对于现在很多新特性不支持,所以需要升级到新版本。目前2023年7月11日最新版本的k8s是v1.27.3。通过参考官方文档进行k8s部署工作。其中涉及到操作系统配置、防火墙配置、私有镜像仓库等。_k8s最新版本
文章浏览阅读1.8w次,点赞14次,收藏27次。能节省你在kubeadm init 时遇到问题的排错时间⌚️。整合了网上大佬
文章浏览阅读1.1k次,点赞2次,收藏7次。具体操作步骤可以参考之前的教程,建议是先安装一台,然后克隆虚拟机,这样速度快。注意:在克隆时记得修改Mac地址、IP地址、UUID和主机名。(最后别忘了保存下快照~)_部署k8s集群
文章浏览阅读863次,点赞23次,收藏16次。当部署完 Kubernetes,便拥有了一个完整的集群。一组工作机器,称为节点, 会运行容器化应用程序。每个集群至少有一个工作节点。工作节点会 托管Pod ,而 Pod 就是作为应用负载的组件。控制平面管理集群中的工作节点和Pod。说人话版本:集群:cluster,多个几点被组织到一起共同为系统提供服务过程称之为集群。本质上是将承载同一个软件服务节点组织到一起,称之为该软件(服务)的集群,当然集群中的节点身份地位是不一样的。k8s集群也是如此,他也是多个节点组成。
文章浏览阅读943次。Rancher是一个开源的企业级多集群Kubernetes管理平台,实现了Kubernetes集群在混合云+本地数据中心的集中部署与管理,以确保集群的安全性,加速企业数字化转型。Rancher 1.0版本在2016年就已发布,时至今日,Rancher已经成长为企业在生产环境中运行容器和Kubernetes的首要选择。_rancher管理k8s
文章浏览阅读742次,点赞2次,收藏3次。本篇来讲解如何在centos下安装部署高可用k8s集群。_kubeadm ha keepalived + nginx
文章浏览阅读1.9k次,点赞21次,收藏25次。那么这个空间设置成内存的2倍大小。点击IPv4设置--手动--添加--设置ip--设置DNS服务器,最后点击--“保存”;首先选中--“本地标准磁盘”,存储配置--自定义分区,点击--“完成”;在--主机名--设置主机名:(例如k8s-master01),点击--点击+,设置--挂载点/boot--期望容量,点击--添加挂载点;点击--+--挂载点swap--期望容量,点击--“添加挂载点”;默认选择--亚洲--上海,并调整日期和时间,点击--“完成”;设备类型--确认--LVM,卷组--选择“修改”;_euler 服务器搭建
文章浏览阅读1k次。在1.25版本的k8s集群中部署gpu-manage时,虽然显示gpu节点上gpu-manage的pod实例都是running状态,但是给pod申领。既可以用源码的Makefile自动编译打包成新的镜像,但是源码的。说明gpu-manager和容器运行时接口通信失败了。编译后的镜像在1.25版本的k8s中可以正常使用。,但是在k8s1.23版本之后,接口路径已经改为。资源时,却始终找不到有资源的节点。,另外有一些依赖需要国际上的支持。可以看到这里用的运行时接口是。查看节点的详情时,返回的。_launch gpu manager 报错 can't create container runtime manager: context dead
文章浏览阅读1k次,点赞18次,收藏16次。SelfLink:API的资源对象之一,表示资源对象在集群当中自身的一个连结,self-Link是一个唯一的标识号,可以用于标识k8s集群当中的每个资源的对象。容器里使用的配置,在provisioner当中定义好环境变量,传给容器,storageclass的名称,NFS服务器的地址,NFS的目录。NFS的provisionner的客户端以pod的方式运行在集群当中,监听k8s集群当中PV的请求,然后动态的创建于NFS相关的PV。命名为 nfs-client-provisioner-clusterrole。
文章浏览阅读6.3k次,点赞2次,收藏20次。k8s证书过期解决方案之替换证书_k8s证书过期如何更换
文章浏览阅读1k次。KMS,Key Management Service,即密钥管理服务,在K8S集群中,以驱动和插件的形式启用对Secret,Configmap进行加密。以保护敏感数据
文章浏览阅读888次。exporter对于云服务的监控还是很不完美,毕竟每家都有自己的护城河。自动发现多实例这样的借助consul 阿波罗这样的会简单一些。aws可以借助cloudwatch这样的导入模板到grafana中。还是希望能将类似腾讯云云监控中的这些指标采集到prometheus中,但是这过程应该还很遥远grafana出图 prometheus查询语法这些东西有时间的好好研究一下。报警有必要进行分级别,收敛配置一下!_command: - "-redis.password-file=/redis_passwd.json
文章浏览阅读1k次。可以在此处(https://cloud.google.com/kubernetes-engine/docs/how-to/kube-dns)和此处(https://www.digitalocean.com/community/tutorials/an-introduction-to-the-kubernetes-dns-service)找到更多的详细信息。-or-ipvs/)和此处(https://arthurchiao.art/blog/cracking-k8s-node-proxy/)。_k8s默认命名空间
文章浏览阅读4.9k次,点赞11次,收藏32次。如果运行runc命令时提示:runc: error while loading shared libraries: libseccomp.so.2: cannot open shared object file: No such file or directory,则表明runc没有找到libseccomp,需要检查libseccomp是否安装,本次安装默认就可以查询到。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。_kubernetes 1.28
文章浏览阅读3.6w次,点赞118次,收藏144次。Canal 提供了网络功能,使得 Kubernetes 集群中的 Pod 可以相互通信,并与集群外部的服务进行通信。它通过网络插件的方式,为每个 Pod 分配唯一的 IP 地址,并管理网络流量的路由和转发。此外,Canal 还支持网络策略,用于定义 Pod 之间的通信规则和安全策略。Canal 基于 Calico 和 Flannel 项目,结合了二者的优点。它使用 Calico 的数据平面,提供高性能的网络转发和安全特性,同时使用 Flannel 的控制平面,实现 IP 地址管理和网络策略的配置。_k8s canal