Kubernetes 组件介绍
Components Glance
-
Control Plane Components
- kube-apiserver
- etcd
- kube-scheduler: 主要将新创建没有分配 node 的 pod 分配到可用的 node 上
- kube-controller-manager
- NodeController
- ReplicationController
- ReplicaSet
- Deployment
- DaemonSet
- StatefulSet
- JobController
- CronJobController
- EndpointSliceController
- ServiceAccountController
- cloud-controller-manager:提供对接云厂商的 api 接口
- NodeController:管理节点
- ServiceController:管理 load balancers
- RouteController: 配置基于云基础设施的路由
-
Node Components
- kubelet
- kube-proxy
- container-runtime
-
Addons
- DNS
- Web Ui Dashboard
- Container Resource Monitoring
- Cluster Level Logging
- Network Plugins
控制器
内置控制器
-
无状态应用
- 通用场景
- RC
- RS
- Deployment
- 特殊场景
- 批处理任务:任务运行成功,即返回状态码 0
- Job
- CronJob
- 每个 Node 有且仅有一个
- DaemonSet
- 自动扩缩容
- HPA,根据给定配置,配合 RC、RS、Deployment,动态扩缩副本数量
- 批处理任务:任务运行成功,即返回状态码 0
- 通用场景
-
有状态应用
- StatefulSet
自定义控制器
Kubernetes 开发
- VPA,根据给定配置,动态调整 Pod 中运行的 Container 对应的 Cpu,Memory 等资源使用(目前还是实验阶段)double check
内置控制器
StatefulSet
适用于为了解决有状态服务的问题(对应 Deployments 和 ReplicaSets 是为了无状态服务而设计)
- 稳定持久化存储,即 pod 重新调度后还能访问到相同的持久化数据,基于 PVC 实现
- 稳定的网络标识,即 pod 重新调度后其 Podname 和 Hostname 不变,基于 Headless Service(即没有 Cluster IP 的 Service)实现
- 有序部署,有序扩展,即 Pod 是有顺序的,在部署或者扩展的时候能够根据定义的顺序依次进行(即从 0 到 N-1,在下一个 Pod 运行之前所有之前创建的 Pod 必须满足 Running 和 Ready 状态),基于 init containers1 来实现。
- 有序收缩,有序删除,即从 N-1 到 0,与有序部署,有序扩展相反
DaemonSet
适用于为了确保全部(或者一些)Node 上运行一个 Pod 副本。当有 Node 加入集群时,也会为他们新增一个 Pod。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。具体应用:
- 运行集群存储 daemon 服务,例如在每个 Node 上运行 glusterd,ceph 等
- 运行日志收集 daemon 服务,如在每个 Node 上运行 fluentd,logstash 等
- 运行监控 daemon 服务,如在每个 Node 上运行 Prometheus Node Exporter 等
Job
适用于仅执行一次或多次的任务,比如批处理,数据备份,当备份完成,回收 Pod;也能保证批处理任务的一个 Pod 或多个 Pod 成功结束,比如冗余备份。
CronJob
适用于基于时间的 Job,同 Linux cronjob,如:
- 在给定时间仅执行一次
- 周期性的在给定时间点执行
网络通信模式
分类
- 同 Pod 间不同 container 互相访问:通过回还网卡(lo)
- 不同 Pod 间互相访问
- 同物理机:通过 docker0 网桥互相访问,效率仅次于 lo
- 不同物理机:如 Flannel,利用 udp 对网络数据包的二次封装,效率最次
- SVC 网络与 Pod 间的通信
网络隔离
通过 namespace network 进行隔离
具体应用案例
-
Flannel 使用 udp 协议对网络数据包的二次封装(三层网络通信,因为隔离了广播域,所以网络冲突几乎为 0,但效率可能较差),加上 network overlay,实现的扁平化网络
-
思科开发的组件
-
其他方式 比如通过路由表转发,或者通过广播域实现不同进程间的通信(二层网络通信,效率可能较高,但是网络冲突可能增大)
-
init containers ↩︎