概述

官方中文文档

简介

  • Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
  • Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务),管理员可以加载一个微型服务,让规划器来找到合适的位置,同时,Kubernetes也系统提升工具以及人性化方面,让用户能够方便的部署自己的应用。

Kubernetes组成

  • Kubernetes节点有运行应用容器必备的服务,而这些都是受Master的控制。
  • 每个节点上都要运行容器(Docker)。容器来负责所有具体的映像下载和容器运行。
  • Kubernetes主要由以下几个核心组件组成:
    • etcd 保存了整个集群的状态
    • apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
    • controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
    • scheduler 负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
    • kubelet 负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
    • container runtime 负责镜像管理以及Pod和容器的真正运行(CRI)
    • kube-proxy 负责为Service提供cluster内部的服务发现和负载均衡
  • 除了核心组件,还有一些推荐的Add-ons:
    • kube-dns负责为整个集群提供DNS服务
    • Ingress Controller为服务提供外网入口
    • Heapster提供资源监控
    • Dashboard提供GUI
    • Federation提供跨可用区的集群
    • Fluentd-elasticsearch提供集群日志采集、存储与查询

集群(Cluster)

Kubernetes集群

  • Master
    • master是指集群控制节点,来负责整个集群的管理和控制,基本上k8s的所有控制命令都是发给它。执行的命令基本都是在master节点上运行。通常它会占据一个独立的服务器(虚拟机)
    • master节点上运行的一些关键进程:
      • kube-apiserver (k8s API server)
      • kube-controller-manager
      • kube-scheduler
      • etcd server
  • Node
    • k8s集群中其他机器被称为node节点,Node可以是一台物理机,也可以是一台虚拟机。当某个node宕机,其上的工作负载会被master自动转移到其他节点上。
    • node节点上运行的一些关键进程:
      • kubelet
      • kube-proxy
      • 容器引擎(docker engine、containerd)

Kubernetes集群最小工作单位Pod

Pod是kubernets的最小工作单元。每个pod包含一个或多个容器。pod中的容器会做为一个整体被master调度到一个node上运行。

kubernets引入pod主要基于下面两个目的

  1. 可管理性
    有些容器天生就是需要紧密联系,一起工作。Pod提供了比容器更高层次的抽象,将它们封装到一个部署单元中。Kubernetes以Pod为最小单元进行调度、扩展、资源共享、管理生命周期。

  2. 通信和资源共享
    Pod中所有容器使用同一个网络namespace,即相同的IP地址和Port空间。它们可以直接使用localhost进行通信。同样的,这些容器可以共享存储,当kubernets挂在volume到pod,本质上是将volume挂在到pod中的每一个容器。

Pod有两种使用方式

  1. 运行单一容器
    one-container-per-Pod 是 Kubernetes 最常见的模型,这种情况下,只是将单个容器简单封装成 Pod。即便是只有一个容器,Kubernetes 管理的也是 Pod 而不是直接管理容器

  2. 运行多个容器

控制器(Controller)

ReplicaSet

ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。ReplicaSet 是下一代的 Replication Controller。

ReplicationController

ReplicationController 确保任何时候都有特定数量的Pod副本处于运行状态,新版本推荐ReplicaSet来代替

Deployments

Deployment 是一个更高级的概念,它管理 ReplicaSet,并向 Pod 提供声明式的更新以及许多其他有用的功能。

DaemonSet

在每个节点上运行一个Pod,对于管理那些提供主机级别功能(如主机监控和主机日志)的容器

StatefulSets

有状态的Pod

Job

自行终止的Pod,执行一次

CronbJob

基于时间调度的Jobs。一个 CronJob 对象就像 crontab (cron table) 文件中的一行。它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job。

存储(Storage)

Volumes

Volume是Pod中能够被多个容器访问的共同目录。也就是被定义在Pod上,然后被一个Pod中的多个容器挂载到具体的文件目录下,其次,vVolume与Pod生命周期相同,但与容器生命周期不相关,当容器终止或重启,Volume中的数据也不会丢失。

Persistent Volumes

Persistent Volumes 是已经由管理员提供或者动态使用供应的集群中的一块存储的Storage Class。创建PersistentVolumes,绑定StorageClass,再由PersistentVolumesClaims使用。

Storage Class

定义存储的类型,不同的类型可能会映射到不同的的服务质量等级或备份策略,或是由集群管理员制定的任意策略。动态卷供应首先需要定义不同的Storage Class对象,当动态供应被调用时,根据Storage Class对象设置的参数,哪些持久卷将被使用。

网络和负载均衡

Service

Service 为Pods提供自己的IP地址和一组Pod的单个DNS名称,并且可以在它们之间进行负载平衡,可以提供外界对Pod访问的接口

暴露方式分三种

  1. ExternalName
    通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容(例如, foo.bar.example.com)。 没有任何类型代理被创建。
  2. ClusterIP
    通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 ServiceType。
  3. NodePort
    通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求 <NodeIP>:<NodePort>,可以从集群的外部访问一个 NodePort 服务。
  4. LoadBalancer
    使用云提供商的负载局衡器,可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务。
  5. HostPort
    这种比较特殊,在Pod里面配置Ports里配置HostPort。暴露Pod运行的主机端口,供外部访问,如:1.2.3.4:30000

Ingress

Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。通过Ingress连接Service,对外部提供更丰富的访问方式