简述Kubernetes Replica Set和Replication Controller之间有什么区别?

都可以让你管理/访问它们,就像它们在本地运行一样。这也有助于消除为每个集群处理不同管理工具的需要。Clusternet 还可以帮助你从托管集群中的一组 API 将应用程序部署和协调到多个集群。当你的集群在 VPC 网络、边缘或防火墙后面运行时,Clusternet 可以通过可配置的方式设置网络隧道。

以 Clusternet 项目为基础实现多云多集群管理平台,为用户提供跨云、跨集群、跨 region/zone 的分布式容器服务,将更好的满足多种场景需求。

其中 clusternet-agent 组件需要部署在各个子集群中,主要负责:

  • 将当前集群作为子集群自动注册到父集群,也称为子集群 ManagedCluster
  • 提供 Kubernstes 风格的 REST API 来重定向/代理/升级请求到每个子集群 ( 从一组 API 协调应用程序并将其部署到多个集群; 2、概念
    对于每个想要被管理的 Kubernetes 集群,我们称之为子集群,子集群注册到的集群,我们称之为父集群。组件 clusternet-agent 在子集群中运行,clusternet-hub 在父集群中运行。Clusternet 支持向不同集群分发和管理各种应用资源,包括原生 Kubernetes
  • Subscription 定义了订阅者想要安装到集群中的资源,对于每个匹配的集群,将在其专用命名空间中创建一个相应的 Base 对象

首先在集群中 Clone 项目代码:

Clusternet 将帮助部署和协调应用程序到多个集群,可以通过以下命令检查状态。

当然也可以在子集群中用 Helm 命令行工具来验证安装情况,比如:

对外暴露了Kubernetes API。它是的 Kubernetes 核心控制层。它被设计为水平扩展,即通过部署更多实例来横向扩展。API Server 负责和 etcd 交互(其他组件不会直接操作 etcd,只有 API Server 这么做),是整个 kubernetes 集群的数据中心,所有的交互都是以 API Server 为核心的。API Server 提供了以下的功能:

  • 整个集群管理的 API 接口:所有对集群进行的查询和管理都要通过 API 来进行。
  • 集群内部各个模块之间通信的枢纽:所有模块之间并不会互相调用,而是通过和 API Server 打交道来完成各自的工作。
  • 集群安全控制:API Server 提供的验证和授权保证了整个集群的安全。

在k8s的组件中,其中有kube-scheduler和kube-controller-manager两个组件是有leader选举的,这个选举机制是k8s对于这两个组件的高可用保障。需要--leader-elect=true启动参数。即正常情况下kube-scheduler或kube-manager-controller组件的多个副本只有一个是处于业务逻辑运行状态,其它副本则不断的尝试去获取锁,去竞争leader,直到自己成为leader。如果正在运行的leader因某种原因导致当前进程退出,或者锁丢失,则由其它副本去竞争新的leader,获取leader继而执行业务逻辑。

在K8s中, 通过创建资源对象(当前的实现中实现了 ConfigMap 和 Endpoint 两种类型的资源)来维护锁的状态。这两种资源对象存在etcd里,也可以说是用etcd来实现的。

分布式锁一般实现原理就是大家先去抢锁,抢到的成为 leader ,然后 leader 会定期更新锁的状态,声明自己的活动状态,不让其他人把锁抢走。K8s 的资源锁也类似,抢到锁的节点会将自己的标记。设为锁的持有者,其他人则需要通过对比锁的更新时间和持有者来判断自己是否能成为新的 leader ,而 leader 则可以通过更新RenewTime来确保持续保有该锁。

副本控制器(Replication Controller): 负责维护系统中每个副本控制器对象正确数量的 Pod。副本控制器的作用即保证集群中一个RC所关联的Pod副本数始终保持预设值。只有当Pod的重启策略是Always的时候(RestartPolicy=Always),副本控制器才会管理该Pod的操作(创建、销毁、重启等)。

资源配额管理控制器ResourceQuota Controller:资源配额管理确保指定的资源对象在任何时候都不会超量占用系统物理资源。支持三个层次的资源配置管理:

  • 容器级别:对CPU和Memory进行限制;
  • Pod级别:对一个Pod内所有容器的可用资源进行限制;
  • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现;

service是一组pod的服务抽象,相当于一组pod的负载均衡器,负责将请求分发给对应的pod。service会提供一个clusterIP。kube-proxy的作用主要是负责service的实现,具体来说,就是实现了内部请求到service和外部的从node port向service的访问,转发到后端某个pod。

  • userspace:是以socket的方式实现代理的,userspace这种模式最大的问题是,service的请求会先从用户空间进入内核iptables,然后再回到用户空间,由kube-proxy完成后端Endpoints的选择和代理工作,这样流量从用户空间进出内核带来的性能损耗是不可接受的;
  • IP),使用轮询作为LB策略(ipvsadm命令查看),IPVS模块会负责请求的转发。
 以下截图来自于极客时间张磊的课程描述:复制代码

NodePort服务是引导外部流量到你的服务的最原始方式。可以通过访问集群内的每个NodeIP:NodePort的方式,访问到对应Service后端的Endpoint。在所有节点(虚拟机)上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务。

NodePort 服务主要有两点区别于普通的“ClusterIP”服务。第一,它的类型是“NodePort”。有一个额外的端口,称为 nodePort,它指定节点上开放的端口值。如果你不指定这个端口,系统将选择一个随机端口。

  • 每个端口只能是一种服务
  • 如果节点/VM 的 IP 地址发生变化,你需要能处理这种情况。

基于以上原因,我不建议在生产环境上用这种方式暴露服务。如果你运行的服务不要求一直可用,或者对成本比较敏感,你可以使用这种方法。这样的应用的最佳例子是 demo 应用,或者某些临时应用。

这种方式在创建pod时的yaml中spec.hostNetwork: true指定走主机网络,这种方式pod使用的端口必须是宿主机上没有被占用的端口。外部可以直接通过pod所在宿主机IP:Pod端口访问。

这也是用来对集群外暴露服务的,不同的是这需要云服务商的支持,比如亚马逊等。这个方式的最大缺点是每一个用 LoadBalancer 暴露的服务都会有它自己的 IP 地址,每个用到的 LoadBalancer 都需要付费,这是非常昂贵的。

4、kube-scheduler通过预选算法过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉,端口被占用的也被过滤掉;

5、kube-scheduler通过优选算法给主机打分,对预选筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把一个deployment类型的pod分布到不同的主机上,使得资源均衡;或者将两个亲和的服务分配到同一个主机上。

6、选择主机:选择打分最高的主机,进行binding(调用apiserver将pod和node绑定)操作,结果存储到etcd中。

7、kubelet监听Api Server,根据调度结果执行Pod创建操作:绑定成功后,scheduler会调用API Server的API在etcd中创建一个bound pod对象,描述在一个工作节点上绑定运行的所有pod信息。运行在每个工作节点上的kubelet也会定期与etcd同步bound pod信息,一旦发现应该在该工作节点上运行的bound pod对象没有更新,则调用Docker API创建并启动pod内的容器。

各组件基本都是通过API Server提供的list-watch API进行监听资源对象变化,进行自己的控制循环,这些核心功能都被封装到了client-go包中。我们可以根据自己的需求,通过CRD编写controller、operator进行自己的控制循环逻辑、运维自动化部署,很轻松的扩展k8s能力。

本公众号免费提供csdn下载服务,海量IT学习资源,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以公众号后台回复【2】,免费邀请加技术交流群互相学习提高,会不定期分享编程IT相关资源。

扫码关注,精彩内容第一时间推给你


有疑问加站长微信联系(非本文作者)

我要回帖

更多关于 会计要素之间存在什么关系 的文章

 

随机推荐