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

控制器

内置控制器

  1. 无状态应用

    • 通用场景
      • RC
      • RS
      • Deployment
    • 特殊场景
      • 批处理任务:任务运行成功,即返回状态码 0
        • Job
        • CronJob
      • 每个 Node 有且仅有一个
        • DaemonSet
      • 自动扩缩容
        • HPA,根据给定配置,配合 RC、RS、Deployment,动态扩缩副本数量
  2. 有状态应用

    • StatefulSet

自定义控制器

Kubernetes 开发

  • VPA,根据给定配置,动态调整 Pod 中运行的 Container 对应的 Cpu,Memory 等资源使用(目前还是实验阶段)double check

内置控制器

StatefulSet

适用于为了解决有状态服务的问题(对应 Deployments 和 ReplicaSets 是为了无状态服务而设计)

  1. 稳定持久化存储,即 pod 重新调度后还能访问到相同的持久化数据,基于 PVC 实现
  2. 稳定的网络标识,即 pod 重新调度后其 Podname 和 Hostname 不变,基于 Headless Service(即没有 Cluster IP 的 Service)实现
  3. 有序部署,有序扩展,即 Pod 是有顺序的,在部署或者扩展的时候能够根据定义的顺序依次进行(即从 0 到 N-1,在下一个 Pod 运行之前所有之前创建的 Pod 必须满足 Running 和 Ready 状态),基于 init containers1 来实现。
  4. 有序收缩,有序删除,即从 N-1 到 0,与有序部署,有序扩展相反

DaemonSet

适用于为了确保全部(或者一些)Node 上运行一个 Pod 副本。当有 Node 加入集群时,也会为他们新增一个 Pod。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。具体应用:

  1. 运行集群存储 daemon 服务,例如在每个 Node 上运行 glusterd,ceph 等
  2. 运行日志收集 daemon 服务,如在每个 Node 上运行 fluentd,logstash 等
  3. 运行监控 daemon 服务,如在每个 Node 上运行 Prometheus Node Exporter 等

Job

适用于仅执行一次或多次的任务,比如批处理,数据备份,当备份完成,回收 Pod;也能保证批处理任务的一个 Pod 或多个 Pod 成功结束,比如冗余备份。

CronJob

适用于基于时间的 Job,同 Linux cronjob,如:

  1. 在给定时间仅执行一次
  2. 周期性的在给定时间点执行

网络通信模式

分类

  • 同 Pod 间不同 container 互相访问:通过回还网卡(lo)
  • 不同 Pod 间互相访问
    • 同物理机:通过 docker0 网桥互相访问,效率仅次于 lo
    • 不同物理机:如 Flannel,利用 udp 对网络数据包的二次封装,效率最次
  • SVC 网络与 Pod 间的通信

网络隔离

通过 namespace network 进行隔离

具体应用案例

  1. Flannel 使用 udp 协议对网络数据包的二次封装(三层网络通信,因为隔离了广播域,所以网络冲突几乎为 0,但效率可能较差),加上 network overlay,实现的扁平化网络

  2. 思科开发的组件

  3. 其他方式 比如通过路由表转发,或者通过广播域实现不同进程间的通信(二层网络通信,效率可能较高,但是网络冲突可能增大)


  1. init containers ↩︎