Kubernetes 学习笔记

基础

  • Master

    • 控制节点,负责整个集群的管理和控制。Master 节点上包含以下组件:
      • etcd
      • apiserver
      • controller manager
      • scheduler
  • Node

    • 工作节点, 工作负载主要是运行容器应用。Node 节点上包含以下组件:
      • kubelet
      • kube-proxy
      • container runtime
  • Pod

    • 静态 Pod
    • Pod Hook
      • PostStart
      • PreStop
    • 健康检查
      • livenessProbe
      • readnessProbe
    • Init Container
  • Deploymen

    • Replication Controller(RC)
    • Replication Set(RS)
      • 支持基于集合的 selector
    • 一个 Deployment 控制多个 RS ( 为了支持回滚 )
  • Service

    • 相关 IP 概念
      • Node IP
      • Pod IP
      • Cluster IP
    • 类型
      • ClusterIP
      • NodePort
      • LoadBalancer
      • ExternalName
  • ConfigMap

  • Secret

    • Opaque
    • kubernetes.io/dockerconfigjson
    • kubernetes.io/service-account-token
  • Horizontal Pod Autoscaling (HPA)

    • Heapster
  • Job

    • CronJob
  • RBAC

    • Role 和 ClusterRole
      • Rule
    • Subject
      • User Account
      • Group
      • Service Account
    • RoleBinding 和 ClusterRoleBinding
  • DaemonSet

  • StatefulSet

    • 服务的有状态和无状态
  • 持久化存储

    • PV
  • PVC

    • StorageClass

组件

  • Kubernetes 主要由以下几个核心组件组成:

    • etcd 保存了整个集群的状态,就是一个数据库
    • apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制
    • controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
    • scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上
    • kubelet 负责维护容器的生命周期,同时也负责 Volume(CSI)和网络(CNI)的管理;
    • Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI)
    • kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡
  • 除了上面的这些核心组件,还有一些推荐的插件:

    • kube-dns 负责为整个集群提供 DNS 服务
    • Ingress Controller 为服务提供外网入口
    • Heapster 提供资源监控
    • Dashboard 提供 GUI
  • Kubernetes 多组件之间的通信原理

    • apiserver 负责 etcd 存储的所有操作,且只有 apiserver 才直接操作 etcd 集群
    • apiserver 对内(集群中的其他组件)和对外(用户)提供统一的 REST API,其他组件均通过 apiserver 进行通信
      • controller manager、scheduler、kube-proxy 和 kubelet 等均通过 apiserver watch API 监测资源变化情况,并对资源作相应的操作
      • 所有需要更新资源状态的操作均通过 apiserver 的 REST API 进行
    • apiserver 也会直接调用 kubelet API(如 logs, exec, attach 等),默认不校验 kubelet 证书,但可以通过 --kubelet-certificate-authority 开启(而 GKE 通过 SSH 隧道保护它们之间的通信)
  • 比如最典型的创建 Pod 的流程:

    • 用户通过 REST API 创建一个 Pod
    • apiserver 将其写入 etcd
    • scheduluer 检测到未绑定 Node 的 Pod,开始调度并更新 Pod 的 Node 绑定
    • kubelet 检测到有新的 Pod 调度过来,通过 container runtime 运行该 Pod
    • kubelet 通过 container runtime 取到 Pod 状态,并更新到 apiserver 中

服务发现

  • 内部服务发现

    • 通过 apiserver 查询

      • 依赖 K8s
  • 通过环境变量

    • 依赖的服务必须在 Pod 启动之前就存在
    • DNS Server
    • kubedns
      • coredns
  • 外部服务发现

    • ingress
      • Traefik

Helm

  • 概念
    • chart
    • config
    • release
  • Helm Client
  • Tiller Server