乐趣区

关于kubernetes:关于-Kubernetes-的这些原理你一定要了解

kubernetes 曾经成为容器编排畛域的王者,它是基于容器的集群编排引擎,具备扩大集群、滚动降级回滚、弹性伸缩、主动治愈、服务发现等多种个性能力。

本文将带着大家疾速理解 kubernetes,理解咱们议论 kubernetes 都是在议论什么。

kubernetes 架构

从宏观上来看 kubernetes 的整体架构,包含 Master、Node 以及 Etcd。

Master 即主节点,负责管制整个 kubernetes 集群。它包含 Api Server、Scheduler、Controller 等组成部分。它们都须要和 Etcd 进行交互以存储数据。

  • Api Server:次要提供资源操作的对立入口,这样就屏蔽了与 Etcd 的间接交互。性能包含平安、注册与发现等。
  • Scheduler:负责依照肯定的调度规定将 Pod 调度到 Node 上。
  • Controller:资源控制中心,确保资源处于预期的工作状态。

Node 即工作节点,为整个集群提供计算力,是容器真正运行的中央,包含运行容器、kubelet、kube-proxy。

  • kubelet:次要工作包含治理容器的生命周期、联合 cAdvisor 进行监控、健康检查以及定期上报节点状态。
  • kube-proxy: 次要利用 service 提供集群外部的服务发现和负载平衡,同时监听 service/endpoints 变动并刷新负载平衡。

从创立 deployment 开始

deployment 是用于编排 pod 的一种控制器资源,咱们会在前面做介绍。这里以 deployment 为例,来看看架构中的各组件在创立 deployment 资源的过程中都干了什么。

  • 首先是 kubectl 发动一个创立 deployment 的申请
  • apiserver 接管到创立 deployment 申请,将相干资源写入 etcd;之后所有组件与 apiserver/etcd 的交互都是相似的
  • deployment controller list/watch 资源变动并发动创立 replicaSet 申请
  • replicaSet controller list/watch 资源变动并发动创立 pod 申请
  • scheduler 检测到未绑定的 pod 资源,通过一系列匹配以及过滤抉择适合的 node 进行绑定
  • kubelet 发现自己 node 上需创立新 pod,负责 pod 的创立及后续生命周期治理
  • kube-proxy 负责初始化 service 相干的资源,包含服务发现、负载平衡等网络规定

至此,通过 kubenetes 各组件的分工协调,实现了从创立一个 deployment 申请开始到具体各 pod 失常运行的全过程。

Pod

在 kubernetes 泛滥的 api 资源中,pod 是最重要和根底的,是最小的部署单元。

首先咱们要思考的问题是,咱们为什么须要 pod?pod 能够说是一种容器设计模式,它为那些”超密切”关系的容器而设计,咱们能够设想 servelet 容器部署 war 包、日志收集等场景,这些容器之间往往须要共享网络、共享存储、共享配置,因而咱们有了 pod 这个概念。

对于 pod 来说,不同 container 之间通过 infra container 的形式对立辨认内部网络空间,而通过挂载同一份 volume 就天然能够共享存储了,比方它对应宿主机上的一个目录。

容器编排

容器编排是 kubernetes 的看家本领了,所以咱们有必要理解一下。kubernetes 中有诸多编排相干的管制资源,例如编排无状态利用的 deployment,编排有状态利用的 statefulset,编排守护过程 daemonset 以及编排离线业务的 job/cronjob 等等。

咱们还是以利用最宽泛的 deployment 为例。deployment、replicatset、pod 之间的关系是一种层层管制的关系。简略来说,replicaset 管制 pod 的数量,而 deployment 管制 replicaset 的版本属性。这种设计模式也为两种最根本的编排动作实现了根底,即数量管制的程度扩缩容、版本属性管制的更新 / 回滚。

程度扩缩容

程度扩缩容十分好了解,咱们只需批改 replicaset 管制的 pod 正本数量即可,比方从 2 改到 3,那么就实现了程度扩容这个动作,反之即程度膨胀。

更新 / 回滚

更新 / 回滚则体现了 replicaset 这个对象的存在必要性。例如咱们须要利用 3 个实例的版本从 v1 改到 v2,那么 v1 版本 replicaset 管制的 pod 正本数会逐步从 3 变到 0,而 v2 版本 replicaset 管制的 pod 数会注解从 0 变到 3,当 deployment 下只存在 v2 版本的 replicaset 时变实现了更新。回滚的动作与之相同。

滚动更新

能够发现,在上述例子中,咱们更新利用,pod 总是一个一个降级,并且最小有 2 个 pod 处于可用状态,最多有 4 个 pod 提供服务。这种”滚动更新”的益处是不言而喻的,一旦新的版本有了 bug,那么剩下的 2 个 pod 依然可能提供服务,同时不便疾速回滚。

在理论利用中咱们能够通过配置 RollingUpdateStrategy 来管制滚动更新策略,maxSurge 示意 deployment 控制器还能够创立多少个新 Pod;而 maxUnavailable 指的是,deployment 控制器能够删除多少个旧 Pod。

kubernetes 中的网络

咱们理解了容器编排是怎么实现的,那么容器间的又是怎么通信的呢?

讲到网络通信,kubernetes 首先得有”三通”根底:

  • node 到 pod 之间能够通
  • node 的 pod 之间能够通
  • 不同 node 之间的 pod 能够通

简略来说,不同 pod 之间通过 cni0/docker0 网桥实现了通信,node 拜访 pod 也是通过 cni0/docker0 网桥通信即可。

而不同 node 之间的 pod 通信有很多种实现计划,包含当初比拟广泛的 flannel 的 vxlan/hostgw 模式等。flannel 通过 etcd 获知其余 node 的网络信息,并会为本 node 创立路由表,最终使得不同 node 间能够实现跨主机通信。

微服务—service

在理解接下来的内容之前,咱们得先理解一个很重要的资源对象:service。

咱们为什么须要 service 呢?在微服务中,pod 能够对应实例,那么 service 对应的就是一个微服务。而在服务调用过程中,service 的呈现解决了两个问题:

  • pod 的 ip 不是固定的,利用非固定 ip 进行网络调用不事实
  • 服务调用须要对不同 pod 进行负载平衡

service 通过 label 选择器选取适合的 pod,构建出一个 endpoints,即 pod 负载平衡列表。理论使用中,个别咱们会为同一个微服务的 pod 实例都打上相似 app=xxx 的标签,同时为该微服务创立一个标签选择器为 app=xxx 的 service。

kubernetes 中的服务发现与网络调用

在有了上述”三通”的网络根底后,咱们能够开始微服务架构中的网络调用在 kubernetes 中是怎么实现的了。

这部分内容其实在说说 Kubernetes 是怎么实现服务发现的曾经讲得比较清楚了,比拟细节的中央能够参考上述文章,这里做一个简略的介绍。

服务间调用

首先是东西向的流量调用,即服务间调用。这部分次要包含两种调用形式,即 clusterIp 模式以及 dns 模式。

clusterIp 是 service 的一种类型,在这种类型模式下,kube-proxy 通过 iptables/ipvs 为 service 实现了一种 VIP(虚构 ip) 的模式。只须要拜访该 VIP,即可负载平衡地拜访到 service 背地的 pod。

上图是 clusterIp 的一种实现形式,此外还包含 userSpace 代理模式 (根本不必),以及 ipvs 模式 (性能更好)。

dns 模式很好了解,对 clusterIp 模式的 service 来说,它有一个 A 记录是 service-name.namespace-name.svc.cluster.local,指向 clusterIp 地址。所以个别应用过程中,咱们间接调用 service-name 即可。

服务外拜访

南北向的流量,即内部申请拜访 kubernetes 集群,次要包含三种形式:nodePort、loadbalancer、ingress。

nodePort 同样是 service 的一种类型,通过 iptables 赋予了调用宿主机上的特定 port 就能拜访到背地 service 的能力。

loadbalancer 则是另一种 service 类型,通过私有云提供的负载均衡器实现。

咱们拜访 100 个服务可能须要创立 100 个 nodePort/loadbalancer。咱们心愿通过一个对立的内部接入层拜访外部 kubernetes 集群,这就是 ingress 的性能。ingress 提供了对立接入层,通过路由规定的不同匹配到后端不同的 service 上。ingress 能够看做是”service 的 service”。ingress 在实现上往往联合 nodePort 以及 loadbalancer 实现性能。

到当初为止,咱们简略理解了 kubernetes 的相干概念,它大抵是怎么运作的,以及微服务是怎么运行在 kubernetes 中的。于是当咱们听到他人探讨 kubernetes 时,咱们能够晓得他们在探讨什么。

作者:fredalxin
地址:https://fredal.xin/what-is-ku…

退出移动版