Kubernetes 集群分为两部分:
- Kubernetes 控制平面
- (工作) 节点
控制平面的组件
- etcd
- API 服务器
- 调度器
- 控制器管理器
工作节点上运行的组件
- Kubelet
- kube-proxy
- 运行时 (Docker, rkt 或者其他)
附加组件
- Kubernetes DNS 服务器
- 仪表板
- Ingress 控制器
- Heapster (容器集群监控)
- 容器网络接口插件
11.1.1 Kubernetes 组件的分布式特性

列出各组件的状态:

$ kubectl get componentstatusesWarning: v1 ComponentStatus is deprecated in v1.19+NAME STATUS MESSAGE ERRORcontroller-manager Unhealthy Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refusedscheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refusedetcd-0 Healthy {"health":"true"}
组件间如何通信
- 各组件通过 API 服务器通信
- API 服务器是和 etcd 通信的唯一组件

单组件运行多实例
- etcd 和 API 服务器可以多个实例同时并行工作
- 调度器和控制器管理器在给定时间内只能有一个实例起作用
组件是如何运行的
- kube-proxy 可以直接运行或者以 pod 形式部署
- Kubelet 是唯一一直作为常规系统组件来运行的组件
- 其他组件作为 pod 来运行

11.1.2 Kubernetes 如何使用 etcd
乐观并发控制 (乐观锁):
- 使用版本号
资源如何存储在 etcd 中
etcd 的使用应该参考目前最新的文档.
类似目录的结构:

/registry/pods :


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

确保存储对象的一致性和可验证性
- API 服务器实现了乐观锁
- 所有平面组件都通过 API 服务器操作存储模块
确保 etcd 集群一致性
- 运行多个 etcd 实例
- RAFT

为什么 etcd 实例数量应该是奇数
书中描述不够清楚.
11.1.3 API 服务器做了什么
- 提供 CRUD 接口
- 对数据进行校验
- 处理乐观锁

通过认证插件认证客户端
通过授权插件授权客户端
认证和鉴权.
通过准入控制插件验证 AND/OR 修改资源请求
准入控制插件包括:

还有其他准入控制插件.
验证资源以及持久化存储
验证存储到 etcd 的对象.
11.1.4 API 服务器如何通知客户端资源变更
HTTP 连接

用 kubectl 监听事件:

11.1.5 了解调度器
调度器 -> API 服务器 -> Kubelet

默认的调度算法
- 找出可用节点
- 按照排序规则选择节点

查找可用节点
可用条件:

为 pod 选择最佳节点
根据实际情况选择节点.
pod 高级调度
- 亲缘性
使用多个调度器
通过 schedulerName 属性来指定 pod 所使用的调度器.
- default-scheduler
- 可以实现自己的调度器
11.1.6 介绍控制器管理器中运行的控制器
控制器包括:
- Replication (ReplicationController 资源的管理器)
- ReplicaSet, DaemonSet, Job 控制器
- Deployment 控制器
- StatefulSet 控制器
- Node 控制器
- Service 控制器
- Endpoints 控制器
- Namespace 控制器
- PersistentVolume 控制器
- 其他
了解控制器做了什么以及如何做的
控制器执行一个 “调和” 循环, 将实际状态调整为期望状态.
- 确保不丢掉什么: 遍历

Replication 管理器
启动 ReplicationController 资源.
- 通过事件监听

ReplicaSet, DaemonSet 以及 Job 控制器
与 ReplicationController 类似.
Deployment 控制器
滚动升级.
StatefulSet 控制器
管理 pod 实例的持久卷.
Node 控制器
监控节点健康状态.
Service 控制器
管理 LoadBalancer.
Endpoint 控制器

Namespace 控制器
PersistentVolume 控制器
绑定 PVC 和 PV.
唤醒控制器
11.1.7 Kubelet 做了什么
了解 Kubelet 的工作内容
- 在 API 服务器中创建 Node 资源
- 管理 pod (通过该机器上的容器运行时)
- 报告容器运行状态
- 运行容器存活探针
抛开 API 服务器运行静态 pod
在本地指定 pod 清单来运行 pod.
- 该特性用于将容器化版本的控制平面组件以 pod 形式运行

11.1.8 Kubernetes Service Proxy 的作用
- 确保连接到达 pod
- 对 pod 负载均衡
猜测: 客户端不能直接连接 pod, 所以需要代理
为什么被叫作代理
userspace 代理:

iptables 代理模式:

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
