K8S—理论知识

一、概述

全称: Kubernetes

1.1 作用

负责自动化运维管理多个容器化的程序的集群,也是一个容器编排工具
主要和docker搭配

1.2 搭配docker使用

可以完美解决docker的以下几个弱点

  • 单机使用,无法有效集群
  • 容器数量上升,管理成本上升
  • 没有有效的容灾,自愈机制
  • 没有编排模板,无法实现快速,大规模容器调度
  • 没有统一配置管理中心工具
  • 没有容器生命周期管理工具
  • 没有图形化管理工具

总而言之,K8S提供了了容器编排、资源调度、弹性伸缩、部署管理和服务发现等等功能

1.3 特性

弹性伸缩

使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务

自我修复

在节点故障时重新启动失败的容器,替换和重新部署;杀死失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断

服务发现和负载均衡

K8s为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题

自动发布(默认滚动发布模式)和回滚

K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务

集中化配置管理和密钥管理

管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用

存储编排,支持外挂存储并对外挂存储资源进行编排

挂载外部存储系统,无论是来自本地存储,公有云,还是网络存储都作为集群资源的一部分使用,极大提高存储使用灵活性

任务批处理运行

提供一次性任务,定时任务,满足批量数据处理和分析的场景

二、K8S架构

在这里插入图片描述

K8S属于主从设备模型,如图所示master节点负责集群的调度、管理和运维,slave节点负责集群的运算工作负载

master组件可以在集群中的任何计算机上运行,不过一般建议单独用一台独立的服务器,因为master是整个集群的大脑,如果master宕机了,那么所有的控制命令就会失效

某个节点宕机时,master会把工作负载转移到其他节点

2.1 master 组件

API server

任何的资源请求或者调用操作都是通过 API 提供的接口进行,所有对象的增删改查和监听操作也都是API处理后交给etcd存储

API就是k8s的请求入口服务,负责接收所有请求,然后再根据用户的需求通知其他组件干活

controller manager

运行管理控制器:k8s中处理常规任务的后台线程,所有资源对象的自动化控制中心

在k8s中,一个资源对应一个控制器,controller manager 就是负责管理这些控制器的

通过API监控状态,如果某个node宕机,controller manager会执行自动化修复流程,确保整个集群都是正常的工作状态

主要有一下几个控制器

  • Node Controller (节点控制器) :负责在节点出现故障时发现和响应
  • Replication Controller (副本控制器) :负责保证集群中一个RC (资源对象Replication Controller) 所关联的Pod副本数始终保持预设值。可以理解成确保集群中有且仅有N个Pod实例,N是RC中定义的Pod副本数量
  • Endpoints Controller (端点控制器) :填充端点对象(即连接Services 和Pods) ,负责监听Service 和对应的Pod副本的变化。可以理解端点是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道它的endpoint
  • Service Account & Token Controllers (服务帐户和令牌控制器) :为新的命名空间创建默认帐户和API 访问令牌
  • ResourceQuotaController(资源配额控制器):确保指定的资源对象在任何时候都不会超量占用系统物理资源
  • Namespace Controller (命名空间控制器) :管理namespace 的生命周期
  • Service Controller (服务控制器) :属于K8S 集群与外部的云平台之间的一个接口控制器

scheduler

负责资源调度的进程,根据调度算法为新的pod选择一个合适的node节点

也就是说这个组件是所有node节点的调度器,当用户要部署服务时,scheduler根据调度算法选择合适的节点来部署pod

2.2 配置存储中心

ETCD

分布式键值存储系统,存储了k8s的关键配置和用户配置

k8s里只有API有读写权限,其他组件想要读取ETCD必须通过API才可以

2.3 Node 组件

Kubelet

Node节点的监视器,以及与master节点的通讯器,定时向API回报自己这边node节点的状态

从master节点上获取自己这边pod的期望状态,如果不一样,就调用对应的容器平台接口到这个状态

管理镜像和容器的清理工作,保证节点不会被占满空间,退出的容器又不会占用太多资源

总结:kubelet负责node节点大大小小的一切事务,也是和API组件相互通讯的一个重要部分

proxy

在每个node节点上实现pod网络代理,负责维护网络规则和四层负载均衡工作

proxy本身不提供网络,pod的网络其实是kubelet提供的,proxy实际上只是维护虚拟的pod集群网络

API通过监控proxy来进行对k8s的更新和端点的维护

proxy是k8s的负载均衡器,也是一个分布式代理服务器,在每个节点上都会有proxy组件

三、核心概念

k8s有着多种类型的资源对象:
pod、label、service、replication、contreller 等等
所有的资源对象都可以通过k8s里的 kubectl 来进行增删改查,并保存在 etcd 中持久化存储

k8s是一个高度自动化的资源控制系统,通过对比etcd里保存的资源期望状态和当前环境的差异来实现自动纠错、控制等高级功能

3.1 pod

pod 是k8s创建的最小基本单位,一个pod代表集群上正在运行的一个进程

  • 一个pod有一个或多个容器组成,pod内容器共享网络、存储等资源
  • 一个pod运行多个容器叫做边车模式,在生成环境中一般都是单个容器或者有着强关联互补的多个容器组成一个pod
  • 同一个pod之间的容器可以通过localhost互相访问,并且挂载pod内所有的数据卷,但是不同的pod之间的容器不能用localhost访问,也不能挂载

3.2 pod控制器

Pod控制器是Pod启动的一种模版,用来保证在K8S里启动的Pod 应始终按照用户的预期运行(副本数、生命周期、健康状态检查等)

K8S内提供了众多的Pod控制器,有以下几种:

Deployment:无状态应用部署
Deployment 的作用是管理和控制Pod 和ReplicaSet, 管控它们运行在用户期望的状态中

Replicaset:确保预期的Pod 副本数量
ReplicaSet 的作用就是管理和控制Pod,管控他们好好干活。但是,ReplicaSet 受控于Deployment

也就是说deployment是老大,监督pod干活的
如果有pod出现问题,就会重新找个新pod顶替,replicaset就是负责这个
资源对象Replication Controller 是ReplicaSet 的前身,官方推荐用Deployment 取代Replication Controller 来部署服务

Daemonset:确保所有节点运行同一类Pod, 保证每个节点上都有一个此类Pod 运行,通常用于实现系统级后台任务

Statefulset :有状态应用部署

Job:一次性任务
根据用户的设置,Job 管理的Pod把任务成功完成就自动退出了

cronjob:周期性计划性任务

3.3 label

标签

k8s的特色管理方式,用于分类管理资源对象

label可以附加到各种资源对象上,用于关联对象、查询和筛选

一个资源对象可以定义多个label,同一个label也可以被添加到多个资源对象

可以通过给指定资源对象绑定一个或多个不同的label来实现多维度的资源分组管理功能

3.4 label 选择器

给某个资源对象定义一个label,相当于给他打了个标签,然后就通过这个选择器来查询筛选有label的资源对象

标签选择器有两种:基于等值关系和基于集合关系

3.5 service

虽然每个Pod会被分配一个单独的IP地址,但由于Pod是有生命周期的(它们可以被创建,而且销毁之后不会再启动),随时可能会因为业务的变更,导致这个IP地址也会随着Pod 的销毁而消失

Service就是用来解决这个问题的核心概念

K8S中的service像是网关层,可以看作一组提供相同服务的Pod的对外访问接口、流量均衡器

Service作用于哪些Pod是通过标签选择器来定义的

每个Service都有一个固定的虚拟ip (这个ip也被称为Cluster IP) ,自动并且动态地绑定后端的Pod, 所有的网络请求直接访问Service 的虚拟ip,Service会自动向后端做转发

Service除了提供稳定的对外访问方式之外,还能起到负载均衡(Load Balance) 的功能,自动把请求流量分布到后端所有的服务.上,Service可以做到对客户透明地进行水平扩展(scale)

而实现service 这一功能的关键,就是kube-proxy。 kube-proxy 运行在每个节点上,监听API Server中服务对象的变化,可通过以 下三种流量调度模式: userspace (废弃)、iptables (濒临废弃) 、ipvs (推荐,性能最好)来实现网络的转发

Service是K8S 服务的核心,屏蔽了服务细节,统一对外暴露服务接口

优势非常明显:一方面外部用户不需要感知因为Pod上服务的意外崩溃、K8S 重新拉起Pod 而造成的IP变更,外部用户也不需要感知因升级、变更服务带来的Pod替换而造成的IP变化

3.6 ingress

service主要负责k8s集群的网络拓扑,访问集群内部就要靠ingress了,作为k8s集群的接入层,也负责集群内外通讯

ingress是七层应用,访问方式 http/https

service是四层流量调度

比如客户端请求一个网址 → ingress → service → pod 这样一个顺序

3.7 name

k8s内部使用资源定义每一种逻辑概念,但是这些资源也有自己的名称

资源有 api版本(apiversion)、类别(kind)、元数据(metadata)、定义清单(spec)、状态(status)等信息

名称就是定义在资源的元数据信息里,并且在同一个空间内是唯一的

3.8 namespace

随着项目增多,人员增多,集群扩大,需要一个逻辑上隔离k8s内部各种资源的方法,就是namespace

namespace是为了把k8s集群划分成若干个资源不共享的虚拟集群组

不同的namespace内资源名称可以一样,但是同空间内资源和名称不能一样

k8s默认的namespace有:default、kube-system、kube-public等等

四、总结

k8s集群分为两个节点,master节点和node节点

master节点里有API、Controller-manager、Scheduler、etcd组件
node节点有kubelet、proxy、pod组件

集群的框架概述

API组件接收到请求后创建一批 Pod ,API会让 Controller-manager 按照所预设的模板去创建 Pod,Controller-manager 会通过 API 去找 Scheduler 为新创建的 Pod 选择最适合的 Node 节点

比如运行这个 Pod 需要 2C4G 的资源,Scheduler 会通过预算策略在所有 Node 节点中挑选最优的。

Node 节点中还剩多少资源是通过汇报给 API Server 存储在 etcd 里,API Server 会调用一个方法找到 etcd 里所有 Node 节点的剩余资源,再对比 Pod 所需要的资源,在所有 Node 节点中查找哪些 Node 节点符合要求

如果都符合,预算策略就交给优选策略处理,优选策略再通过 CPU 的负载、内存的剩余量等因素选择最合适的 Node 节点,并把 Pod 调度到这个 Node 节点上运行。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Kubernetes 的网络系统是由多个组件组成的, 它们协作为应用程序提供网络连接和通信. 其中一些主要的组件包括: - kube-proxy: 运行在每个节点上, 负责为 Pod 和 Service 提供代理服务. - kube-dns: 为应用程序提供 DNS 服务. - 网络插件: 用于为 Pod 提供网络连接, 支持不同的网络模型, 如 Calico, Flannel, Cilium 等. - Service: 为应用程序提供负载均衡和服务发现. Kubernetes 的网络模型是基于 Pod 的, 每个 Pod 都有一个独立的 IP 地址, 使得容器间直接通信成为可能. Service 则提供了一种发现和负载均衡的机制, 让外部客户端可以访问 Pod. ### 回答2: KubernetesK8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。下面是一些与K8s网络相关的知识点。 1. 服务发现:K8s通过DNS(域名系统)服务提供内部服务发现机制。每个服务都会被分配一个唯一的域名,其他服务可以通过该域名访问该服务。 2. Pod网络:Pod是K8s中的最小调度单元,它可以包含一个或多个容器。每个Pod都有一个唯一的IP地址,容器可以通过本地回环地址访问其他Pod中的容器。 3. 容器网络接口(CNI):CNI是一个规范,用于定义容器网络的实现方式。K8s使用CNI插件来设置和管理Pod的网络。不同的CNI插件可以支持不同的网络方案,如VLAN、VXLAN、Calico等。 4. 服务代理:K8s使用服务代理来实现服务之间的通信。服务代理可以在集群各个节点上运行,并通过负载均衡来分发到后端Pod。 5. 网络策略:K8s允许用户通过网络策略来定义集群中的网络访问规则。网络策略可以限制哪些Pod可以与另一个Pod通信,以及允许的协议和端口。 6. Ingress控制器:Ingress控制器是K8s中用于管理入站网络流量的组件。它可以将外部流量路由到集群内部的服务,并提供负载均衡和SSL终止等功能。 7. 可插拔网络解决方案:K8s提供了一些可插拔的网络解决方案,如Flannel、Calico等。这些解决方案可以根据具体需求选择,以提供不同的网络拓扑结构和性能。 总而言之,K8s网络相关的知识点包括服务发现、Pod网络、CNI、服务代理、网络策略、Ingress控制器和可插拔网络解决方案。这些知识点帮助我们理解和管理K8s集群中的网络配置和通信。 ### 回答3: Kubernetes(简称k8s)是一种用于容器编排和管理的开源平台,它涉及到一些重要的网络概念和组件。 首先,k8s网络模型是基于虚拟网络的概念。每个k8s集群中的容器都会被分配一个独立的IP地址,并且可以通过这个IP地址跨节点进行通信。这是通过一个称为kube-proxy的组件实现的,它会在每个节点上监听API服务器上的变化,并使用iptables或者IPVS等工具在宿主机上进行流量转发。 其次,k8s通过Service和Endpoint来暴露和访问容器。Service是一个逻辑概念,用于封装一组具有相同功能的容器,在集群内部提供服务的访问入口。一个Service可以通过ClusterIP、NodePort或者LoadBalancer等不同的类型暴露。而Endpoint是实际运行容器的IP和端口的集合,用于告诉Service流量应该转发到哪里。 此外,k8s还支持Ingress资源,用于在集群外部暴露服务,实现外部访问。Ingress通过定义一个或多个规则,将外部流量转发到不同的Service上,从而实现域名或路径的复杂路由。 最后,网络插件是k8s网络中的重要组件。k8s提供了一些默认的网络插件,如Flannel、Calico等,用于管理Pod之间的网络通信。网络插件负责创建网络的子网和路由表,并将Pod的IP地址与宿主机的虚拟网卡进行关联。 总结来说,k8s网络涉及到虚拟网络、kube-proxy、Service、Endpoint、Ingress等概念和组件,这些都是为了实现容器间的通信和外部访问的需求。不同的网络插件可以根据具体需求选择,以满足集群的网络需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值