企业级的容器编排平台。
Kubernetes 这个单词是希腊语,它的中文翻译是“舵手”或者“飞行员”。联想一下 Docker 的集装箱,不难想到 k8s 是想成为运送集装箱的轮船,来管理集装箱,也就是管理容器。
“k8s”,是通过将8个字母“ubernete ”替换为“8”而导致的一个缩写。(这种缩短名称的方式还是第一次见,有创意)
k8s 将用户提交的容器,放置到集群的某个节点上。结合容器的大小,所需要的资源情况等,将容器放到一个满足容器要求的、相对空闲的节点上。
k8s 会检查节点是否健康,如果节点出现故障,k8s 会自动将该节点的容器迁移到健康的节点上。
k8s 具备业务负载检查的能力,如果某个容器 cpu 利用率过高,响应时间长,k8s 可以对该容器进行水平扩展。其中需要用到负载均衡。
典型的二层架构和 server-client 架构。(Docker 也是 server-client 架构)
每个业务负载会以 Pod 的形式运行,一个 Pod 中运行的一个或者多个容器。
真正去运行这些 Pod 的组件的是叫做 kubelet,通过 API Server 接收到所需要 Pod 运行的状态,然后提交到 Container Runtime 组件中。
在 OS 上创建容器运行所需要的环境,需要对存储、网络进行管理,Kubernetes 并不会直接进行网络存储的操作,他会靠 Storage Plugin 或者是网络的 Plugin 来进行操作。用户自己或者云厂商都会去写相应的 Storage Plugin 或者 Network Plugin,去完成存储操作或网络操作。
也就是定义规范,让各个厂商自己去实现。前提是软件自身要有话语权,想想一下如果不这样,就需要对接各种 OS,任务之重,没有话语权又想让各个 OS 使用 k8s,是多么的难。还好在容器编排领域,k8s 处于领先地位
在 Kubernetes 自己的环境中,也会有 Kubernetes 的 Network,它是为了提供 Service network 来进行搭网组网的。真正完成 service 组网的组件的是 Kube-proxy,它是利用了 iptable
的能力来进行组建 Kubernetes 的 Network,就是 cluster network。
用户可以通过 UI 或者 CLI 提交一个 Pod 给 Kubernetes 进行部署,这个 Pod 请求首先会通过 CLI 或者 UI 提交给 Kubernetes API Server,下一步 API Server 会把这个信息写入到它的存储系统 etcd,之后 Scheduler 会通过 API Server 的 watch 或者叫做 notification 机制得到这个信息:有一个 Pod 需要被调度。
这个时候 Scheduler 会根据它的内存状态进行一次调度决策,在完成这次调度之后,它会向 API Server report 说:“OK!这个 Pod 需要被调度到某一个节点上。”
这个时候 API Server 接收到这次操作之后,会把这次的结果再次写到 etcd 中,然后 API Server 会通知相应的节点进行这次 Pod 真正的执行启动。相应节点的 kubelet 会得到这个通知,kubelet 就会去调 Container runtime 来真正去启动配置这个容器和这个容器的运行环境,去调度 Storage Plugin 来去配置存储,network Plugin 去配置网络。
一般用 Deployment 这个抽象来做应用的真正的管理,而 Pod 是组成 Deployment 最小的单元。
滚动升级:
区分不同的BU(business units:业务单位)
从 high-level(学到个新名词) 上看,Kubernetes API 是由 HTTP+JSON 组成的