kubernetes之概念入门篇

K8S的内容是要比docker多很多的。

kubernetes中文官网: Kubernetes(K8S)中文文档_Kubernetes中文社区

1、认识kubernetes

1.1、什么是kubernetes?

        kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,kubernetes的目标是然该部署容器化的应用简单而且高效,kubernetes提供了应用部署,规划,更新,维护的一种机制。其实提到管理容器第一想到的肯定是docker compose,只不过他是单主机的;而k8s是天然的用于多主机管理的应用,显然功能更加强大。

       kubernetes这个名字源于希腊语,以为“舵手”、“飞行员”。“K8S”这个缩写是因为k和s之间有八个字符,所以这样缩写。kubernetes是谷歌开源的一个项目,其前身就是google内部使用的borg系统(borg积累了google十多年的大规模运行生产工作负载的经验)。

        kubernetes的logo其实就是一个“船舵”,结合docker的鲸鱼上面背着集装箱的logo就能知道k8s是用于管理和驾驭docker的。

1.2、为什么需要kubernetes?

1.2.1、服务部署的发展历程

(1)传统部署 —— 环境不隔离

一台物理机上部署多个应用。隔离性不好,资源争夺。

(2)虚拟化部署 —— 占用资源过大

对物理机进行虚拟化,虚拟化处多个虚拟机。每个虚拟机都可以视为一个独立的机器。

优点:解决了环境隔离的问题。

缺点:虚拟化偏重资源损耗过大,创建速度较慢。

(3)容器化部署

容器用的资源是Linux原本的资源,而不是重新搞一套。没有过重的虚拟化对资源消耗明显减少了。容器的创建效率也非常高,秒级别。

1.2.2、容器化带来的新的问题

(1)容器的生命周期大大缩短。

频繁的删除重建就会给容器的网络、磁盘等资源管理(不稳定)带来很多问题;而k8s可以很好的解决这些问题。

(2)k8s提供了很多东西。

自我修复:检测到异常后自动重启;

自动伸缩:自动扩缩容;

自动部署和回滚:自动完成部署和回滚;

服务发现和负载均衡:k8s自身就有服务发现和负载均衡的功能;

机密和配置管理:对于敏感的非敏感的数据k8s都可以管理起来;

存储编排:把所有的机器的存储资源管理成一个抽象的虚拟磁盘,容器统一访问虚拟磁盘;

批处理:批量的处理;

1.3、企业级容器调度平台(同级别产品介绍)

同级别产品介绍!!!!

以前是三足鼎立,现在google一家独大。

1.3.1、Apache Mesos
Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用。

诞生的比较早甚至早于docker,但是它一开始就不是面向容器的而是面向节点(机器)的。

1.3.2、Docker Swarm
Swarm:Docker自己的容器编排工具。

优势:和docker无缝集成;更轻量更便捷。

缺点:功能不够强大。


1.3.3、Google Kubenetes
Kubernetes:Google开源的的容器编排工具。

2、集群架构与组件

注:这些都可以在中文官网上找得到!!!!Kubernetes 组件 _ Kubernetes(K8S)中文文档_Kubernetes中文社区

先大概知道有哪些组件,后面用的时候再深挖。

我们可以在中文官网上找到这个架构图。

Kubernetes 架构 _ Kubernetes(K8S)中文文档_Kubernetes中文社区

2.1、相关组件

2.1.1、控制组件(master)

 master节点的组成及同外界交互如下。

(1)etcd

        一个分布式的key-value数据库,etcd保存了整个集群的状态;

        老版本是基于内存的,新版本是持久化存储的;现在应该都是新版本了。

(2)kube-apiserver

       提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制; 一切操作的访问入口,通过apiserver才能真正的调用到具体的应用。调度器scheduler、副本控制器、命令行、etcd、kubelet、kube-proxy、命令行工具、可视化界面等等都需要和api server交互。

        最核心的组件。

(3)kube-controller-manager

        controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

(4)cloud-controller-manager

        云控制器管理器:第三方平台提供的控制器API对接管理功能;

(5)kube-scheduler

scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;


2.1.2、节点组件(Node)

Node节点组成如下: 

(1)kubelet

        kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;

(2)kube-proxy

        kube-proxy负责为Service提供cluster内部的服务发现和负载均衡;

(3)container runtime

        Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);

        容器运行的运行时环境:docker(最主流)、另外还有Containerd、CRI-O。

注:

2.1.3、附加组件

(1)kube-dns

         管理整个集群的dns映射,通过名字(域名)而不是ip;

(2)Ingress-Controller

        想要外部访问集群的话就需要Ingress;

(3)Prometheus

        提供k8s集群的监控能力,监控更能更强大;

(4)Dashboard

        控制台。就是一个可视化界面,这里是官方提供的。

(5)Federation

        理解为集群间的一个调度;        

(6)ELK

        提供k8s集群日志统一分析平台。        

2.2、分层架构

 由底向上,分别是:

  • 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
  • 接口层:kubectl命令行工具、客户端SDK以及集群联邦
  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
    • Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
    • Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等


3、服务的分类


一定要多理解,非常重要。

注:k8s对于这两种类型的服务的处理是不一样的(有状态vs无状态)。

无状态: 不会对本地环境产生任何依赖,例如不存储数据到本地磁盘。对于Nginx,删了、重建、用新服务器部署不用做任何处理功能依然正常。
有状态: 会对本地环境产生依赖,例如需要存储数据到本地磁盘。和无状态相比,就必须要有数据迁移和数据恢复的工作。例如redis,如果有了数据存储。
 


4、资源和对象

Linux中有个说法"一切皆文件";对应到K8S就是"一切皆资源" 。

资源和对象的关系: 资源就理解成类,对象就理解为基于类创建出来的对象。

k8s汇总所有的内容都可以抽象为资源,如Pod、Service、Node等都是资源。对象就是基于资源创建出来的实体化的对象。整个k8s就是基于这些对象实体描述的。资源的描述方式有很多,一般有json或者yaml。对于k8s而言主要用的就是yaml。

前言: 之所以做这个区分就是要清楚一个资源的作用范围究竟如何。即是否可以跨命名空间使用还是说可以集群通用,如果有这个诉求要知道怎么搞。

4.1、元数据型资源

对于资源的元数据的描述,资源的描述数据,每个资源都可以使用元数据。范围是最大的,公开的资源谁都可以访问。

(1)Horizontal Pod Autoscaler(HPA): 顾名思义就是水平自动扩容的意思。
可以根据CPU使用率、时段之类、甚至自定义的指标自动的进行扩容缩容(默认30s一次检查);解放运维人力。

(2)PodTemplate: 是关于Pod的定义。利用hpa扩容的时候其实就是用Pod模板创建新的Pod。大家都是基于一个模板创建出来的。

(3)LimitRange: 对集群的资源进行限制。例如可以配置初始内存占用2G(request),但是最多情况下可以占用4G(limit)。

总结:对Pod进行描述,满足某些条件就做某些事情。


4.2、集群级资源


作用与集群之上,集群下所有资源可以共享使用。

(1)Namespace: 命名空间本身就是资源,它属于集群。

(2)Node: 节点资源,其实就是一个服务器的概念。它和其他资源还是有些区别。物理层面node并不是由k8s创建的,k8s创建的是一个抽象对象来管理对应的资源。

(3)ClusterRole: 认证、鉴权。用于对集群的权限进行管理。

(4)ClusterRoleBinding: 上面只是声明了一个权限组但是并没有同谁绑定。这里就是把资源同角色绑定,让这个资源拥有某个权限。注:它只能对集群维度的资源进行角色绑定,不能对命名空间之类级别的资源进行绑定。

4.3、命名空间级资源

        经常使用需要重点关注的资源!!!

        同一个集群内部又可以划分为不同的命令空间。关于这个命令空间就可以理解为一个逻辑上的独立的概念。注:就是用命名空间对集群又做了一个划分/隔离。作用在这种命名空间之上,通常只能在命名空间内使用的资源就是"命名空间级的资源"。

4.3.1、工作负载型(Pod)

什么是Pod?

①k8s进行资源调度的最小单位(最重要概念)。
①一个pod里面可以有一个或多个容器;可以理解为装容器的容器(或者容器组)。 
②Pod内部必须有一个pause容器,通过pause容器可以实现容器间的网络、数据等资源的共享。注:然后就可以通过localhost进行彼此访问。
③更多情况一个Pod只运行一个应用容器(one container per pod),除非是特别紧耦合的容器可以考虑部署在一个pod。
④Pod管理的是容器,这个容器并不一定是docker,只不过现在最主流的就是docker而已。

为什么要有容器组?


1)希望两个有强耦合关系的容器可以共享网络。如果是两个独立的容器,应用程序容器通过ip访问另一个mysql容器。但是ip是会变的。
2)当两个容器有强耦合关系的时候希望可以共享数据。注: docker也可以共享数据卷,但是是不方便的。
3)希望可以对若干个容器整体占用的资源进行限制,而不是单个限制。


4.3.2、服务发现与负载均衡
  • Service: k8s集群内部网络调用,包括负载均衡(基于tcp的四层负载)。node之间、pod之间的通信。行业黑话叫做"东西流量"。
  • Ingress: 将k8s内部服务暴露给外网访问的服务。是一个统一的入口,将服务暴露到外网。

关于“南北流量”、“东西流量”。

不同层级的调用: 纵向流量或者南北流量。
微服务间的调用: 横向流量或者东西流量。


4.3.3、存储
  • Volume: 数据卷,共享Pod中容器使用数据,用来持久化数据,比如数据库数据。
  • CSI: 容器存储接口(Container Storage Interface),是由k8s、mesos、docker等社区成员联合制定的标准接口规范。

4.3.4、特殊类型配置

(1)ConfigMap: 就理解成key-value类型的配置。我们可以把key-value类型的配置信息放到configmap里面,然后configmap可以加载到pod里面。然后pod里面的容器就可以读取到configmap里面的k-v配置信息。实现了一个效果就是把容器需要的数据暴露了出来,我们在外界修改就可以作用与容器。在没有配置中心的前提下如果没有configmap我们修改任何一个配置都要重新改代码、重新打包、重新部署,显然这样太麻烦了。

(2)Secret: 和configmap完全一样,只不过多了加密的功能。更多的保证数据的安全性。

(3)DownwardAPI: 把Pod的信息共享到容器内,让我们的容器可以读取到pod的信息。总共有两种方式:

        ①环境变量:用于单个变量,可以将pod信息和容器信息直接注入容器内部。
        ②volume挂载:将pod信息生成为文件,直接挂载到容器内部去。容器内部就可以通过读取这个文件拿到对应信息了。


4.3.5、其他

(1)Role: 定义一组权限。clusterRole定义的是集群级别的权限,此处定义的是命名空间级别的权限。

(2)RoleBinding: 可以作用与Role和ClusterRole,集群级中的ClusterRoleBinding可以作用与Role或者ClusterRole。其区别是 RoleBinding 是把权限绑定到命名空间,ClusterRoleBinding 是绑定到集群。
 

4.4、资源清单

资源是通过配置对象的形式来描述的。
 


5、对象规约和状态

5.1、规约(Spec)

规约就理解为"规格",理解成期望的状态。通过spec属性去描述我们期望的属性,例如期望有几个实例。注意:这个只是期望并不是实际,例如期望是三个副本但是资源就是不够了两个副本也是可以的。另外,规约是必须的。 

spec: 规格


5.2、状态(Status)

表示对象的实际的状态,由k8s自己维护。k8s由控制器控制尽可能的让实际状态与期望状态靠拢。

6、工作负载型Pod的控制器


        就理解为一个内存级的对象,这个这个对象本质还是一个pod。只不过他的作用就是控制管理具体的业务Pod(相当于又套了一层)。如下图所示。

控制器又分为四大类。其中 有状态、无状态最重要!!!

5.1、适用无状态服务的控制器

例如nginx这个无状态的应用就可以用下面控制器去构建。包括:
(1)ReplicationController(RC): 帮助我们动态更新Pod的副本数,实现扩容缩容。
 注:1.11版本之后就把RC给废掉了,替换他的就是RS。了解即可。

(2)ReplicaSet(RS): 也是用于帮助我们动态更新Pod副本数,只不过在RC的基础上做了升级。例如可以通过指定一个selector来选择对哪些Pod生效。具体来说我们先给不同的pod打上不同的标签(label),然后仅对selector指定的Pod生效。了解即可。
分析:RC只是对一个pod进行调整,但是RS可以通过选择器选择各种条件的Pod进行扩缩容。

(3)Deployment: 后续部署无状态服务我们不会直接使用RC或RS,而是用Deployment。因为RS只有扩容和缩容的功能,而Deployment基于RS做了更高层次的封装,提供了更丰富的部署相关的功能。具体来说包括:

                创建Replica Set/Pod
                滚动升级/回滚 
                平滑的扩容/缩容
                暂停与恢复Deployment

其中滚动更新/升级是我们常用的功能。假设我们要对应用更新版本,流程如下:

首先,Deployment会自动创建一个新的RS,此处为RS2;

然后,在RS2中启动一个全新的Pod,启用后会将RS1中的一个Pod停用;

同理,在RS2中在启动一个Pod,启用后在将RS1中的另一个Pod停用;

至此,就完成了滚动升级过程(RS1依然会保留,后续回滚反之即可)。

5.2、适用有状态服务的控制器

StatefulSet:例如redis就可以用StatefulSet控制器构建。

(1)有状态服务要解决的几个问题

①稳定的网络标识
②稳定的持久化存储、
③有序部署/扩展(master/slave关系)
④有序收缩/删除(master/slave关系)

(2)Headless Service:对于有状态服务的DNS管理 —— 解决了网络和顺序问题。
StatefulSet中每个Pod的DNS格式为 statefulSetName-[0~N1]serviceName.namespace.svc.cluster.local  注: 这里就是给每个Pod都取了一个名字,然后我们就可以通过这个名字来访问到具体的pod了。

    servicename为Headless Service的名字
    0~N-1为Pod所在的序号,用于标识pod顺序性;下一个pod运行之前所有之前的pod都必须running和read状态。
    statefulSetName为statefulset的名字
    namespace为服务所在的命名空间 注:Headless Service和StatefulSet必须在相同的namespace
    .cluster.local就是集群的域名(Cluster Domain)

(3)volumeClaimTemplate:用于创建持久化卷的模板 —— 解决了存储问题

至此,statefulset控制器就解决了有状态服务的以上几个问题。

5.3、守护进程

例如搞一个小的进程监听微服务输出的日志信息,用作日志收集。


DaemonSet:确保所有(或某些)节点运行Pod的副本。当节点被添加到集群中时,Pod也被添加到其中。当节点从集群中移除时,这些Pod将被垃圾收集。删除DaemonSet将清理它创建的Pod。其实就是选择不同的Node安装收集容器,并选择目标Pod进行数据收集。看官网selector可以在node维度选择,也可以在pod维度选择。

典型应用场景:
①日志收集: 比如fluentd、logstash等
②系统监控: 比如Prometheus Node Exporter, collectd
③系统程序: 比如kube-proxy,kube-dns等

 英文官方网站: DaemonSet | Kubernetes

5.4、任务/定时任务

希望周期性的做一些事情

Job: 一次性执行的任务,例如执行一个脚本。
CronJob: 周期性执行的任务,例如定时任务。

一个任务也是一个pod,任务执行完成后pod会被销毁。我们定义一个job或者cronjob就可以实现这些功能。


 

参考:

https://znunwm.top/archives/k8s-xiang-xi-jiao-cheng
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/452304.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

漏洞发现-漏扫项目篇NucleiYakitGobyAfrogXrayAwvs联动中转被动

知识点 1、综合类-Burp&Xray&Awvs&Goby 2、特征类-Afrog&Yakit&Nuclei 3、联动类-主动扫描&被动扫描&中转扫描 章节点: 漏洞发现-Web&框架组件&中间件&APP&小程序&系统 扫描项目-综合漏扫&特征漏扫&被动…

探索TikTok云手机在社交媒体营销的作用

近年来,TikTok作为全球短视频平台之一,其用户基数呈现持续增长的趋势。伴随社交媒体的蓬勃发展,企业和个人纷纷涌入TikTok平台,追求更广泛的曝光和用户互动。为满足这一需求,TikTok云手机应运而生。本文将深度剖析TikT…

力扣面试经典150 —— 16-20题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题,安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题,文中 “数组” 通常指 python 列表;文中 “指针” 通常指 python 列表索引 文章目录 16. [困难] 接…

nginx有几种启动方式

Nginx 通常可以以两种主要的方式启动:作为前台进程运行或作为守护进程(后台)运行。 前台运行: 当Nginx以前台模式运行时,它会在命令行保持活动状态,所有的日志输出都会直接显示在命令行上。这种模式通常用于…

execl/python读取数据库( Access、MySQL)

目录 一 、读取access数据库 (一)execl读取数据库 1.搜索ODBC(注意自己的execl是64位还是32位) 2.安装数据源的驱动程序 3.打开execl 4. 补充:选择数据源时,也可以直接在execl中选择数据源 &#xff…

丘一丘正则表达式

正则表达式(regular expression,regex,RE) 正则表达式是一种用来简洁表达一组字符串的表达式正则表达式是一种通用的字符串表达框架正则表达式是一种针对字符串表达“简洁”和“特征”思想的工具正则表达式可以用来判断某字符串的特征归属 正则表达式常用操作符 操作符说明实…

linux 模拟shell

💓博主CSDN主页:麻辣韭菜-CSDN博客💓   ⏩专栏分类:http://t.csdnimg.cn/G90eI⏪   🚚代码仓库:Linux: Linux日常代码练习🚚   🌹关注我🫵带你学习更多Linux知识   🔝&#x1f5…

前端JavaScript篇之常见事件

目录 JavaScript常见事件click(点击)mouseover(鼠标悬停)keydown(按键按下)load(加载)submit(提交) JavaScript常见事件 JavaScript中的事件是指用户与网页元…

剑指offer C ++双栈实现队列

1. 基础 队列:先进先出,即插入数据在队尾进行,删除数据在队头进行; 栈:后进先出,即插入与删除数据均在栈顶进行。 2. 思路 两个栈实现一个队列的思想:用pushStack栈作为push数据的栈&#xff…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑碳捕集机组与氢储能系统协调运行的源荷储低碳经济调度》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

ansible-playbook的角色(role)

1前言 角色目录如下(分别为httpd角色和nginx角色) handlers/ :至少应该包含一个名为 main.yml 的文件; 其它的文件需要在此文件中通过include 进行包含 vars/ :定义变量,至少应该包含一个名为 main.yml 的…

React Hooks 那些事儿

翻了波之前写的文章还有笔记,发现关于前端的文章并不多(好歹也划水做过点前端开发)。巧了,最近没什么好话题可写,做下 React Hooks 学习笔记吧。 Effect Hook 不得不说 Hook 的出现降低了我们在 React 中处理副作用&…

极简云商业版 开源源码

简化版的云商业源码已经以开源形式发布了,现在可以解绑卡密和查询卡密。总体而言,这个版本已经相当完善了。在对接示例网盘中有一个用户注册的例子,需要配置一个邮箱。您可以在网页上启用QQ邮箱的标准版SMTP,并生成一个授权码。 …

【Spring】学习Spring框架那点小事儿

Spring作者:Rod Johnson Rod Johnson 是一位软件开发人员和作家,他在软件开发领域有着广泛的影响力。他出生于澳大利亚,拥有计算机科学和音乐双学位(能写出有优雅的代码一定有艺术细胞)。 Rod Johnson 在 2002 年出版…

保研复习数据结构记(7)--散列查找(哈希表)

哈希表有什么特点?数据元素的关键字与其存储地址直接相关(通过哈希函数相关),典型的用空间换时间的算法处理冲突的方法?拉链法(链地址法),开放定址法,再散列法什么是查找…

2024年G3锅炉水处理证模拟考试题库及G3锅炉水处理理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年G3锅炉水处理证模拟考试题库及G3锅炉水处理理论考试试题是由安全生产模拟考试一点通提供,G3锅炉水处理证模拟考试题库是根据G3锅炉水处理最新版教材,G3锅炉水处理大纲整理而成&#xff0…

【YOLOv9】训练模型权重 YOLOv9.pt 重新参数化轻量转为 YOLOv9-converted.pt

【YOLOv9】训练模型权重 YOLOv9.pt 重新参数化轻量转为 YOLOv9-converted.pt 1. 模型权重准备2. 模型重新参数化2.1 文件准备2.2 参数修改2.3 重新参数化过程 3. 重新参数化后模型推理3.1 推理超参数配置3.2 模型推理及对比 4. onnx 模型导出(补充内容)4…

在WSL2中安装多个Ubuntu教程

文章目录 前言一、前期准备1、WSL安装2、Docker安装 二、安装第二个Ubuntu系统1.切换为WSL22.获取Ubuntu16.04的tar文件从容器中导出tar 3. 将tar文件导入WSL4. 设置默认用户 总结 前言 适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 的一项功能,可用于在 Wind…

指针篇章-(5)+最终思维导图

sizeof和strlen的对比 sizeof不是函数 侧面证明sizeof不是函数 如果是函数 应该需要有括号 不能落下来 strlen 只针对字符串 包含头文件 string.h 并且这个是个函数 随机数值 sizeof里面有表达式的话 表达式里面是不参与计算的 下面的s求出的是4 就是因为是不参与计算的 不…

03_渲染进程调用node

我们先创建一个文件夹及文件,并且在 html 引入 JS 文件。 在 render.js 里面输入以下内容: let fs require(fs) // let是在当前代码块有效console.log(fs) // 将fs对象的内容打印到控制台供调试和查看 fs 模块:对文件系统进行操作&#xf…