
容器编排是指对多个容器的部署,管理和监控。
之所以有容器编排技术,其实是和业务量与系统复杂度与日俱增推动服务部署的演进方式息息相关的,下图是服务部署方式的演进过程。

更高效地利用系统资源、一致的运行环境、更轻松的迁移和拓展等诸多优点,使容器部署方式越来越成为主流。
Docker 是开源的被广泛应用的容器引擎,在实际生产环境中,在多台物理主机中协调容器资源成为首要要解决的问题,这一问题被统称为容器编排。
容器领域现阶段争论的重点也正在于为容器主机群管理提供怎样的容器编排功能。
目前比较流行的容器编排工具包括 Docker Swarm,Kubernetes 和 Mesos+Marathon。容器使用的最核心问题也恰是容器编排及如何部署和管理容器。Docker Swarm,Kubernetes,Mesos+Marathon 都可用于容器的部署、管理以及实现容器的扩容,但这三种编排工具着重处理的问题和使用场景也是不同的。
Kubernetes 也简称为 k8s,它可以提供⽤户所需的容器部署,管理和扩缩容等编排功能。
借助 Kubernetes 的编排功能,⽤户可以构建多个容器的应⽤服务,跨集群调度、扩展这些容器,并长期持续管理这些容器和检测健康状况 。
Kubernetes 为⽤户主要提供了以下功能:
回归根本问题:why Kubernetes?
Kubernetes 具有很好的可扩展性。K8s 内置一组资源,例如 Pod,Deployment、StatefulSets、Secrets、ConfigMaps 等,用户和开发人员也可以以“Custom Resource Definition”的形式添加更多自定义资源。 Kubernetes 可扩展性的另一种形式是开发人员具有编写自己的能力 Operators 的能力,operator 允许用户通过与 Kubernetes API 进行对话来自动管理 Custom Resource Definition。
Kubernetes 受欢迎的另一个重要方面是其强大的社区。Kubernetes 于 2015 年在 1.0 版本时就捐赠给了与供应商无关的基金会,Kubernetes 是活跃在 Github 中前几名的项目之一:占有在所有项目前 0.01%的排名。 随着项目的推进,还有各种各样的社区 SIG(特殊兴趣小组)针对 Kubernetes 中的不同领域。他们不断添加新功能,并使其对用户更加友好。
Kubernetes 基于谷歌的 Borg 的开源技术,它累积了 Borg15 年轻人深耕细作的发展和生产实践。 在过去的几年中,Kubernetes 每年都有三到四个大小版本发布。引入的新功能的速度到目前也并未减慢,这些新功能使集群运营商在运行各种不同的工作负载时具有更大的灵活性。软件工程师也能拥有更多控件,以将其应用程序直接部署到生产环境中。

上图可以看到一个集群主要包括两个部分:
其中包括如下组件:
主要包括以下组件:

我们知道了 Master 节点包括 Api Server、Scheduler、Controller manager、Etcd。
下面对这几种组件一一做介绍。
Kubernetes API Server 是集群的统一入口,各组件协调者,以 HTTP API 提供接口服务,所有对象资源的增删改查和监听操作首先交给 API Server 处理,下一步再给 Etcd 存储。
Controller-manager 是 Kubernetes 中的资源管理器。Kubernetes 集群中有很多
的资源,如 Node、Pod 副本、服务端点 Endpoint、命名空间 namespace、服务账号
ServiceAccount 等。Controller-manager 负责这些资源的管理,以保证这些资源实际运⾏的状态达到被期望的状态。
Etcd 是一个高可用的键值存储系统,主要用于共享配置和服务发现。它使用 Go 语言编写,并通过 Raft 一致性算法处理日志复制以保证强一致性。
Etcd 可以理解为 Kubernetes 集群的数据中⼼,用于保存集群状态信息,比如 Pod、Service 等对象信息。Etcd 主要和 Api server 交互比较多,Api server 接受操作命令后,会将信息存储到 Etcd 中。从下文的 pod 的状态流程可看到,Api server 构建出完整的 Pod 信息,并将该信息存储到 etcd 中。
Scheduler 是 Kubernetes 集群中的调度器。Scheduler 的作⽤是将待调度的 Pod 按照特定的调度算法和调度策略绑定到集群中某个合适的 Node 上,并将绑定信息通过调⽤Api server 写⼊etcd 中。scheduler 在整个系统中承担了承上启下的重要功能,承上是指它负责接收 Controller manager 创建新的 Pod,为其安排一个落脚的目标 Node,启下是指安置 Node 工作完成后,目标 Node 上的 kubelet 服务进程接管 Scheduler 的后继工作。


Node 节点主要包括 Kubelet、Kube-proxy、Pod,其中最重要的也就是 Pod 了。
下边我们来一一进行介绍:
kubelet 是 Master 在 Node 节点上的 Agent,每个节点都会启动 kubelet 进程,该进程⽤于处理 Master 下发到本节点的任务,管理 Pod 及 Pod 中的容器。每个 kubelet 进程都会在 Api server 上注册节点信息,定期向 Master 汇报节点资源的使⽤情况,并监控容器和节点资源。
kubelet 在启动时通过 Api server 注册节点信息,并定时向 Api server 发送节点的新信息,Api server 在接收到这些信息后,将这些信息写⼊etcd。kubelet 监听 etcd,所有针对 Pod 的操作都会被 kubelet 监听。如果发现有新的绑定到本节点的 Pod,则按照 Pod 清单的要求创建该 Pod。如果发现本地的 Pod 被修改,则 kubelet 会做出相应的修改,⽐如在删除 Pod 中的某个容器时,会通过操作本地容器运⾏时删除该容器。
在 Kubernetes 集群的每个 Node 上都会运⾏⼀个 kube-proxy 服务进程,其核⼼功能是将到某个 Service 的访问请求转发到后端的多个 Pod 实例上。kube-proxy 本质上类似一个反向代理。我们可以把每个节点上运行的 kube-proxy 看作 service 的透明代理兼负载均衡器。kube-proxy 也监听 api server 中 service 与 Endpoint 的信息, 通过配置的 iptables 规则,请求通过 iptables 直接转发给 pod。

Pod 是最小部署单元,一个 Pod 有一个或多个容器组成,Pod 中的容器共享存储和网络,在同一台 Docker 主机上运行。
pod 的构成示意图如下所示:

可以看到由一个 pause 的根容器,加上一个或多个业务容器构成。
kubernetes 中的 pause 容器主要为每个业务容器提供以下功能:
Pod 里多个业务容器共享 pause 容器的网络栈和 Volume 挂载卷。
正是由于业务容器共享这些资源,同一个 Pod 里的容器之间仅需通过 localhost 就能互相通信,所以他们之间通信和数据交换更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个 Pod 中。
ReplicationController 用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的 Pod 来替代。
在新版本的 Kubernetes 中建议使用 ReplicaSet 来取代 ReplicationController ,ReplicaSet ReplicaSet 跟 ReplicationController 没有本质的不同,只是名字不一样,并且 ReplicaSet 支持集合式的 selector。虽然 ReplicaSet 可以独立使用,但一般还是建议使用 Deployment 来自动管理 ReplicaSet,这样就无需担心跟其他机制的不兼容问题。 Deployment 为 Pod 和 ReplicaSet 提供了一个 声明式定义方法,用来替代以前的 ReplicationController 来方便的管理应用。 Deployment 典型的场景:滚动更新

Deployment 不仅可以滚动更新,还可以进行回滚,如何发现升级到 V2 版本后,发现服务不可用,可以回滚到 V1 版本。
以创建 Pod 为例,来理解 Kubernetes 中的各组件的运⾏流程:

Pod 能创建成功了,也能很好的对 Pod 做管理了,那么客户端如何找出相应的 Pod 调用其服务呢?
Kubernetes 支持多种服务暴露的方式。
下面介绍ClusterIP、NodePort和Ingress是三种广泛使用的服务暴露方式。其中 ClusterIP 和 NodePort 方式属于 Service 资源类型,Ingress 属于 Ingress 资源类型。
Kubernetes 集群会为一组 Pod 分配对应的集群 IP,同时产⽣⼀个域名。集群内部可以通过这集群 IP 或者域名访问 Service 对应的 Pod。
该类型只能在集群内部访问,也是默认的 ServiceType。
apiVersion: v1kind: Servicespec: metadata: name: my-service selector: app: my-app type: ClusterIP ports: - name: http port: 80 targetPort: 8080 protocol: TCP
复制代码
上面的示例定义了一个 ClusterIP Service。ClusterIP 上端口 80 的流量将转发到 Pod 上的 8080 端口 (targetPort 配置项)上,携带 app: my-app标签的 Pod 将被添加到 Service 中作为作为服务的可用节点。
常见使用场景:
集群内部服务的暴露。
NodePort 在固定端口号上公开向集群外部暴露服务,它允许从集群外部访问该服务,在集群外部需要使用集群的 IP 地址和 NodePort 指定的端口才能访问。
创建 NodePort Service 将在集群中的每个 Node 上开放该端口。
创建 NodePort Service 的同时还会自动创建一个 ClusterIP 类型的 Service,NodePort 会将端口上的流量路由给 ClusterIP` 类型的 Service。
常见使用场景:
可以使用 NodePort 快速设置开发,测试环境的服务或在其上公开 TCP 或 UDP 服务,但是对于公开 HTTP 服务来说 NodePort 不是一个的理想选择,因为其使用的都是非 HTTP 标准的端口。
Ingress 实际上是与 Service 完全不同的资源,算是 Service 上面的一层代理,通常在 Service 前使用 Ingress 来提供 HTTP 路由配置。它让我们可以设置外部 URL、基于域名的虚拟主机、SSL 和负载均衡。
为了让 Ingress 资源⼯作,集群必须有⼀个正在运⾏的 Ingress 控制器。与 Controller-manager 控制器不同,Ingress 控制器不是随集群⾃动启动的,可以选择不同外部组件来做 Ingress 控制器。
比如:nginx-ingress,它使用 nginx 服务器作为反向代理来把流量路由给后面的 Service。
常见使用场景:
可以处理 http,https 请求的流量,并且可以处理多个域名的流量。一个 IP 可以暴露多个应用,支持同域名不同 uri,支持证书等功能。使用场景比较广泛。
无论是中小型企业,还是大型互联网为了提高资源利用率,实现降本增效,利用 Kubernetes 构建一套自动化运维环境已成为最佳选择。
下图是企业服务云平台正在实现的云上架构能力的一幅蓝图,其中服务容器化作为云平台基础中的基础能力。在容器的编排和管理上最基础能力上实现扩容、限流等可操作 api 和日志、监控等可观测的 api。上层能力层可通过这些 api 提供服务构建,部署,流量控制等功能。
可见 Kubernetes 在整个架构图中重要的位置。

从容器编排管理的实现细节来看,如下图,经过 7 层负载,请求会打到一组 Ingress 控制器上,由于容器的 ip 会经常变动,所以 Ingress 会向上屏蔽掉变动,到达了 Ingress 请求就由 Kubernetes 来控制了,Kubernetes 会将此请求路由到相应服务的某个 Pod 上,同一个服务会有多个 Pod,这些 Pod 也会分部在不容物理机上。目前贝壳采用 Eureka 注册,每个 Pod 对应的服务节点,都会在 Eureka 上注册, 如果服务 A 需要调用服务 B,则请求到服务 A 的 pod 后,会从 Eureka 上寻找服务 B 的 Pod 的节点(目前通过 Eureka+DNS 来实现)拿到上游服务 Pod 信息后就直接调用服务 B 某一个 Pod 上的服务了。

希望今天的讲解对大家有所帮助,谢谢!
Thanks for reading!
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
我刚刚看到whitehouse.gov正在使用drupal作为CMS和门户技术。drupal的优点之一似乎是很容易添加插件,而且编程最少,即重新发明轮子最少。这实际上正是Ruby-on-Rails的DRY理念。所以:drupal的缺点是什么?Rails或其他基于Ruby的技术有哪些不符合whitehouse.org(或其他CMS门户)门户技术的资格? 最佳答案 Whatarethedrawbacksofdrupal?对于Ruby和Rails,这确实是一个相当主观的问题。Drupal是一个可靠的内容管理选项,非常适合面向社区的站点。它
当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在
我感到有点困惑——大约24小时以来,我一直在考虑在我的项目中使用哪种组播技术。基本上,我需要的是:创建组(通过一些后端进程)任意客户端广播消息(1:N,N:N)(可能)直接消息(1:1)(重要)使用我自己的后端(例如,通过某种HTTPAPI)对客户端进行身份验证/授权能够通过后端进程(或服务器插件)踢出特定的客户端这是我要的:Ruby或Haxe中的后端相关流程JS+Haxe(Flash9)中的前端—在浏览器中,因此理想情况下通过80/443进行通信,但不一定。因此,这项技术必须能够在HaxeforFlash中轻松访问,最好是Ruby。我一直在考虑:RabbitMQ(或OpenAMQ)、
一文解决关于VLAN所有的疑惑VLAN基本概念为什么需要VLAN?怎么在交换机上划分VLAN,VLAN的工作原理有了子网,已经隔离了广播,还需要VLAN干啥?只进行子网划分,不进行VLAN划分VLAN划分与子网划分附加VLAN信息的方法VLAN划分交换机的端口类型(Access和Trunk)一、访问链接二、汇聚链接汇聚链接VLAN间通信为什么要进行VLAN间通信?路由器实现VLAN间通信路由器和交换机的连接方式通信细节三层交换机实现VLAN间通信加速VLAN间通信三层交换机与路由器三层交换机路由器路由器和交换机配合构建LAN的实例使用VLAN设计局域网的特点VLAN增加网络的灵活性不使用VLA
文章目录概述背景为何要存算分离优势**应用场景**存算分离产品技术流派华为JuiceFSHashDataXSKY概述背景Hadoop一出生就是奔存算一体设计,当时设计思想就是存储不动而计算(code也即是代码程序)动,负责调度Yarn会把计算任务尽量发到要处理数据所在的实例上,这也是与传统集中式存储最大的不同。为何当时Hadoop设计存算一体的耦合?要知道2006年服务器带宽只有100Mb/s~1Gb/s,但是HDD也即是磁盘吞吐量有50MB/s,这样带宽远远不够传输数据,网络瓶颈尤为明显,无奈之举只好把计算任务发到数据所在的位置。众观历史常言道天下分久必合合久必分,随着云计算技术的发展,数据
很多初学者的代码其实都不够“漂亮”,那是因为没有养成好的编码习惯。本篇博客以C语言为例,总结一些好习惯。其实,很多习惯都是肌肉记忆,举个例子:请你写一个程序,输入2个整数并输出它们的和。有些朋友可能写出来是这个样子。#includeintmain(){ inta=0; intb=0; intsum=0; scanf("%d%d",&a,&b); sum=a+b; printf("%d\n",sum); return0;}我写这段代码,是在模仿有些朋友在初学的时候容易写成的样子。更有甚者,写成这个样子:#includeintmain(){inta=0;intb=0;intsum=0;scanf(
文章目录华为OD面试流程1.mysql数据库建了两个字段,且设置了联合索引,如果其中有一个字段为空会出现什么问题?2.谈谈springIOC的理解,有什么好处,解决了什么问题3.谈谈springAOP的理解,切面编程有没有实际应用,有哪些注解,作用是什么,有那些应用场景?4.Erika和zookeeper有了解过吗,作用是什么,主要解决了什么问题5.谈谈JDK、JRE、JVM的理解,区别是什么6.谈谈对泛型的理解7.JVM的组成华为OD面试流程机试:三道算法题,关于机试,橡皮擦已经准备好了各语言专栏,可以直接订阅。性格测试:机试技术一面(本专栏核心)技术二面(本专栏核心)主管面试定级定薪发of
✅作者简介:大家好,我是小杨📃个人主页:「小杨」的csdn博客🔥系列专栏:小杨带你玩转C语言【初阶】🐳希望大家多多支持🥰一起进步呀!大家好呀!我是小杨。小杨花几天的时间将C语言中的操作符这部分知识做了一个大总结,在方便自己复习的同时也能够帮助到大家。通篇字数在一万字左右,可以算作是非常详细了,一文就可以带领大家彻底掌握操作符这部分内容,文章很长建议先收藏再看,防止下次想看就找不到啦。文章目录✍1,算术操作符✍2,移位操作符 🔍2.1,左移操作符 🔍2.2,右移操作符 ✨2.2.1,算术移位 ✨2.2.2,逻辑移位✍3,位操作符 🔍3.1,按位与&