Kubernetes 集群分为两部分:

  • Kubernetes 控制平面
  • (工作) 节点

控制平面的组件

  • etcd
  • API 服务器
  • 调度器
  • 控制器管理器

工作节点上运行的组件

  • Kubelet
  • kube-proxy
  • 运行时 (Docker, rkt 或者其他)

附加组件

  • Kubernetes DNS 服务器
  • 仪表板
  • Ingress 控制器
  • Heapster (容器集群监控)
  • 容器网络接口插件

11.1.1 Kubernetes 组件的分布式特性

image.png

列出各组件的状态:

image.png

  1. $ kubectl get componentstatuses
  2. Warning: v1 ComponentStatus is deprecated in v1.19+
  3. NAME STATUS MESSAGE ERROR
  4. controller-manager Unhealthy Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
  5. scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
  6. etcd-0 Healthy {"health":"true"}

组件间如何通信

  • 各组件通过 API 服务器通信
  • API 服务器是和 etcd 通信的唯一组件

image.png

单组件运行多实例

  • etcd 和 API 服务器可以多个实例同时并行工作
  • 调度器和控制器管理器在给定时间内只能有一个实例起作用

组件是如何运行的

  • kube-proxy 可以直接运行或者以 pod 形式部署
  • Kubelet 是唯一一直作为常规系统组件来运行的组件
    • 其他组件作为 pod 来运行

image.png

11.1.2 Kubernetes 如何使用 etcd

乐观并发控制 (乐观锁):

  • 使用版本号

资源如何存储在 etcd 中

etcd 的使用应该参考目前最新的文档.

类似目录的结构:

image.png

/registry/pods :

image.png

image.png

注意路径最后不是目录, 是 key 名:

image.png

确保存储对象的一致性和可验证性

  • API 服务器实现了乐观锁
  • 所有平面组件都通过 API 服务器操作存储模块

确保 etcd 集群一致性

  • 运行多个 etcd 实例
  • RAFT

image.png

为什么 etcd 实例数量应该是奇数

书中描述不够清楚.

11.1.3 API 服务器做了什么

  • 提供 CRUD 接口
  • 对数据进行校验
  • 处理乐观锁

image.png

通过认证插件认证客户端

通过授权插件授权客户端

认证和鉴权.

通过准入控制插件验证 AND/OR 修改资源请求

准入控制插件包括:

image.png

还有其他准入控制插件.

验证资源以及持久化存储

验证存储到 etcd 的对象.

11.1.4 API 服务器如何通知客户端资源变更

HTTP 连接

image.png

用 kubectl 监听事件:

image.png

11.1.5 了解调度器

调度器 -> API 服务器 -> Kubelet

image.png

默认的调度算法

  1. 找出可用节点
  2. 按照排序规则选择节点

image.png

查找可用节点

可用条件:

image.png

为 pod 选择最佳节点

根据实际情况选择节点.

pod 高级调度

  • 亲缘性

使用多个调度器

通过 schedulerName 属性来指定 pod 所使用的调度器.

  • default-scheduler
  • 可以实现自己的调度器

11.1.6 介绍控制器管理器中运行的控制器

控制器包括:

  1. Replication (ReplicationController 资源的管理器)
  2. ReplicaSet, DaemonSet, Job 控制器
  3. Deployment 控制器
  4. StatefulSet 控制器
  5. Node 控制器
  6. Service 控制器
  7. Endpoints 控制器
  8. Namespace 控制器
  9. PersistentVolume 控制器
  10. 其他

了解控制器做了什么以及如何做的

控制器执行一个 “调和” 循环, 将实际状态调整为期望状态.

  • 确保不丢掉什么: 遍历

image.png

Replication 管理器

启动 ReplicationController 资源.

  • 通过事件监听

image.png

ReplicaSet, DaemonSet 以及 Job 控制器

与 ReplicationController 类似.

Deployment 控制器

滚动升级.

StatefulSet 控制器

管理 pod 实例的持久卷.

Node 控制器

监控节点健康状态.

Service 控制器

管理 LoadBalancer.

Endpoint 控制器

image.png

Namespace 控制器

PersistentVolume 控制器

绑定 PVC 和 PV.

唤醒控制器

11.1.7 Kubelet 做了什么

了解 Kubelet 的工作内容

  • 在 API 服务器中创建 Node 资源
  • 管理 pod (通过该机器上的容器运行时)
  • 报告容器运行状态
  • 运行容器存活探针

抛开 API 服务器运行静态 pod

在本地指定 pod 清单来运行 pod.

  • 该特性用于将容器化版本的控制平面组件以 pod 形式运行

image.png

11.1.8 Kubernetes Service Proxy 的作用

  • 确保连接到达 pod
  • 对 pod 负载均衡

猜测: 客户端不能直接连接 pod, 所以需要代理

为什么被叫作代理

userspace 代理:

image.png

iptables 代理模式:

image.png

11.1.9 介绍 Kubernetes 插件

如何部署插件

DNS 服务器如何工作

  • 集群中所有 pod 默认使用内部 DNS 服务器
  • DNS 服务 pod 通过 kube-den Service 对外暴露, 该地址被写到每个容器的 /etc/reslv.conf 文件中
  • kube-dns 利用 API 服务器的监控机制来订阅 Service 和 Endpoint 变动, DNS 记录变更

Ingress 控制器如何工作

  • 运行反向代理服务器
  • 直接将流量转到 pod 而不经过 Service IP
  • 可以保存客户端 IP

使用其他插件

11.1.10 总结概览