是什么

[kubernetes official docs][https://kubernetes.io/zh-cn/docs/concepts/overview/components/]

  • 管理容器的工具
  • 用于容器的部署、管理、scaling、网络配置 Kubernetes 提供了一种高度抽象和灵活的资源管理方式, 使得 物理硬件资源 被视为可以 被软件程序动态管理和使用的对象

Note

Kubernetes 平台使用软件接口重新定义了什么是 CPU,什么是内存,什么是磁盘,什么是网卡,它直接接管了物理机的全部资源,以软件接口的形式对外暴露资源…
高并发哲学

基本概念

+-------------------------------------------------------+
|                   Control Plane                       |
|   +--------------------+  +----------------------+    |
|   | API Server         |  | Controller Manager   |    |
|   +--------------------+  +----------------------+    |
|   +--------------------+  +----------------------+    |
|   | etcd               |  | Scheduler            |    |
|   +--------------------+  +----------------------+    |
+----------|------------------------|-------------------+
           |                        |
           |                        |
+----------v--------+           +---v--------------+
|   Worker Node     |           |    Worker Node   |
|   +-----------+   |           |  +-------------+ |
|   |  kubelet  |   |           |  |   kubelet   | |
|   +-----------+   |           |  +-------------+ |
|   |    Pod    |   |           |  |     Pod     | |
|   |   |- Cont.|   |           |  |    |- Cont. | | 
|   |   |- Cont.|   |           |  |    |- Cont. | |
|   +-----------+   |           |  +-------------+ |
+-------------------+           +------------------+
(Cont. for container)

节点 node:

  • 运行容器的工作节点
  • 也就是一台 物理机器虚拟机

Pod:

  • Kubernetes 里的 基本部署单元, 本质上是 集群上 一组正在运行的容器
  • 一个 pod 可以包含 一个或多个容器
  • pod 里的容器一起被部署、管理, 共享内存和网络等资源
  • pod 相当于是把 有相关性的容器 都放在一起了
    • 比如说需要相互通信的容器, 就可以放在一个 pod 里, 共享一个 network namespace, 通过 localhost (loopback address) 进行通信
    • pod 里的储存卷 (volumes) 也是共享的
  • 每个 pod 都有 unique ip address
    • 一个 pod 里的 container 共享这个 pod 的 ip 地址
    • 一个 pod 里的 container 共享这个 pod 被 network namespace 分配的 port space

service:

  • a set of pods
  • 因为 pods 具有动态性 (machine reboot, pod restart 等会导致 pod 的 ip 变化)
  • service 作为 pods 上层的抽象, 统一管理 a set of pods
  • service 有自己的 virtual ip (也叫 cluster ip)
    • 其他 service 通过这个 ip 进行通信, 所以即便 pods 的 ip 改变了也不会有影响
  • 到一个 virtual ip 的的 traffic 会被 load balance 到不同的 pods

control panel:

  • 负责管理和调度一个集群里的 pods
  • 上面有个 etcd, 存储集群所有的 配置信息状态数据

集群:

  • 一个集群就是一些节点; 一些有相关性的节点放在一起就是一个集群
  • 一个集群通常有个 control panel, 和若干个 worker node
  • 每个 worker node 上有一个或多个 pods

api-server

“In Kubernetes, everything is an API call served by the Kubernetes API server. The API server is a gateway to an etcd datastore that maintains the desired state of your application layer.”
source

kubelet

  • 作为 daemon 在每个节点上运行, 管理该节点上的容器和 pods
    • 管理的内容包括: 资源, 健康, 状态
  • 和 api server 交互, 用户通过 api server 设置一个 desired state, kubelet 使得对应的 容器/pods 到这个 desired state

etcd

official docs 是什么:

  • 分布式的 key value 储存系统
  • etcd 相当于 k8s 的 后台数据库, 用来储存集群的状. 和配置数据

卷 volumes (TBC)

  • 简单来说, 在 Kubernetes 中指的是 可以被 pod 里的容器访问的数据的目录

Kubernetes networking

几个原则:

  • all Pods can communicate with all other Pods without using network address translation.
  • all Nodes can communicate with all Pods without NAT.
  • the IP that a Pod sees itself as is the same IP that others see it as.

pod to pod communication

每个 pod 都有自己的 unique address, 不同 pod 之间的通信是怎么样的? 在同一台机器上的 inter-pod communication 和不同机器上的 inter-pod communication 分别是怎么样的?

同一台机器上:

  • linux 有 virtual ethernet device(veth), 能够让不同的 network namespace 之间通信
  • 每个 pod 都以为自己有个 ethernet device
  • 通过 veth, 这些 ethernet device 能够让每个 pod 和 机器上的 root namespace 通信
  • root namespace 起到的作用是 packet forwarding, 有个 table, 根据 IP 地址 (然后有 ARP 那套, 发现MAC 地址) 进行转发

不同机器:

  • packet 从 pod 到 root namespace 的时候, MAC 地址转发会失败, 因为 table 里没有对应的 MAC, ARP 也找不到
  • 这时候就会被 root 的 ethernet device 发送出去 感兴趣的是, 在不同的 node 之间是怎么样转发的

在干啥, 解决啥问题

多容器

  • 现在的一个应用程序都被拆分成很多个微服务, 一个微服务又在多个容器里跑着
  • 如何管理这些容器? 跨主机的情况如何管理这些容器的生命周期、网络配置?
  • kubernetes 就可以用来 创建、管理、调度 这些容器

应用的 scaling, 可拓展性

  • 针对客户请求的高峰和低峰, k8s 也能根据负载情况资源消耗情况 (CPU) 自动、动态地调整容器实例的个数

自愈能力

  • 容器出现异常的时候, k8s 能够重启容器
  • 部分容器异常的时候, 能够调度其他容器支持

服务发现和负载均衡

  • k8s 给每个容器都分配一个 ip, 内置了服务发现, 能够让容器之间通信
  • k8s 能均衡地把流量分配到不同的容器上

更新、回滚

  • k8s 支持平滑地更新、 回滚
  • 逐步替换旧容器实例, 换成新容器实例

helm

a package manager for kubernetes 怎么样理解 “package” package 就是 , 在 helm 的 context 下, package 就是 打包好的 Kubernetes 应用 helm chart 就是这个 package 的模板

helm 在干啥

例子, 比如说要在 kubernetes 上部署 nginx, 并不是一条 command 就可以把服务部署好的. 实际上需要考虑:

  • 怎么配置 pod、deployment 来确保 high availability
  • ingress
  • 储存
  • … helm 就是为了解决这些 kubernetes 所引入的复杂性:
  • helm 把这一堆 kubernetes 的资源文件打包成一个 chart
  • 统一通过模板来调整部署细节
  • 统一部署、升级、回滚、删除

就像在 Ubuntu 上用 apt install nginx, 它会帮你把 NGINX 安装好并配置好. 在 Kubernetes 中, 用 helm install nginx, 它会帮你部署好 NGINX 和所有关联的 Kubernetes 资源。