乐趣区

关于kubernetes:从零开始了解-kubernetes还有谁不会

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 pod 的具体介绍请参阅旧文:Kubernetes 之 Pod 实现原理

容器编排

容器编排是 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…

退出移动版