Kubernetes
原文地址:https://fredal.xin/what-is-kubernetes
kubernetes 已经成为容器编排领域的王者,它是基于容器的集群编排引擎,具备扩展集群、滚动升级回滚、弹性伸缩、自动治愈、服务发现等多种特性能力。 快速了解 kubernetes ,了解谈论 kubernetes 都是在谈论什么。kubernetes 架构

- Api Server:主要提供资源操作的统一入口,这样就屏蔽了与 Etcd 的直接交互。功能包括安全、注册与发现等。
- Scheduler:负责按照一定的调度规则将 Pod 调度到 Node 上。
- Controller:资源控制中心,确保资源处于预期的工作状态。
- kubelet:主要工作包括管理容器的生命周期、结合 cAdvisor 进行监控、健康检查以及定期上报节点状态。
- kube-proxy: 主要利用 service 提供集群内部的服务发现和负载均衡,同时监听 service/endpoints 变化并刷新负载均衡。
从创建 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 相关的资源,包括服务发现、负载均衡等网络规则
Pod
在 kubernetes 众多的 api 资源中,pod 是最重要和基础的,是最小的部署单元。 首先要考虑的问题是,为什么需要 pod?pod 可以说是一种容器设计模式,它为那些”超亲密”关系的容器而设计,可以想象 servelet 容器部署 war 包、日志收集等场景,这些容器之间往往需要共享网络、共享存储、共享配置,因此有了 pod 这个概念。
容器编排
容器编排是 kubernetes 的看家本领了,所以有必要了解一下。kubernetes 中有诸多编排相关的控制资源,例如编排无状态应用的 deployment,编排有状态应用的 statefulset,编排守护进程 daemonset 以及编排离线业务的 job/cronjob 等等。 还是以应用最广泛的 deployment 为例。deployment、replicatset、pod 之间的关系是一种层层控制的关系。简单来说,replicaset 控制 pod 的数量,而 deployment 控制 replicaset 的版本属性。这种设计模式也为两种最基本的编排动作实现了基础,即数量控制的水平扩缩容、版本属性控制的更新/回滚。水平扩缩容

更新/回滚

滚动更新
可以发现,在上述例子中,更新应用,pod 总是一个一个升级,并且最小有 2 个 pod 处于可用状态,最多有 4 个 pod 提供服务。这种”滚动更新”的好处是显而易见的,一旦新的版本有了 bug,那么剩下的 2 个 pod 仍然能够提供服务,同时方便快速回滚。 在实际应用中可以通过配置 RollingUpdateStrategy 来控制滚动更新策略,maxSurge 表示 deployment 控制器还可以创建多少个新 Pod;而 maxUnavailable 指的是,deployment 控制器可以删除多少个旧 Pod。kubernetes 中的网络
了解了容器编排是怎么完成的,那么容器间的又是怎么通信的呢? 讲到网络通信,kubernetes 首先得有”三通”基础:- node 到 pod 之间可以通
- node 的 pod 之间可以通
- 不同 node 之间的 pod 可以通

微服务—service
在了解接下来的内容之前,得先了解一个很重要的资源对象:service。 为什么需要 service 呢?在微服务中,pod 可以对应实例,那么 service 对应的就是一个微服务。而在服务调用过程中,service 的出现解决了两个问题:- pod 的 ip 不是固定的,利用非固定 ip 进行网络调用不现实
- 服务调用需要对不同 pod 进行负载均衡
kubernetes 中的服务发现与网络调用
在有了上述”三通”的网络基础后,可以开始微服务架构中的网络调用在 kubernetes 中是怎么实现的了。 这部分内容其实在说说 Kubernetes 是怎么实现服务发现的已经讲得比较清楚了,比较细节的地方可以参考上述文章,这里做一个简单的介绍。服务间调用
首先是东西向的流量调用,即服务间调用。这部分主要包括两种调用方式,即 clusterIp 模式以及 dns 模式。 clusterIp 是 service 的一种类型,在这种类型模式下,kube-proxy 通过 iptables/ipvs 为 service 实现了一种 VIP(虚拟 ip)的形式。只需要访问该 VIP,即可负载均衡地访问到 service 背后的 pod。
服务外访问

