参考文献:
Kubernetes中文文档
十分钟带你理解Kubernetes核心概念
Kubernetes零基础快速入门!初学者必看!


概念

来源

源自于Google内部的服务编排系统

名字

kubernetes ,译为舵手

核心

基于docker,管理快速建单,使应用的发布、重启、扩容可以实现自动化

特性

  • 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
  • 可扩展: 模块化, 插件化, 可挂载, 可组合
  • 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
  • ………

优势:

  • 快速创建/部署应用:与VM虚拟机相比,容器镜像的创建更加容易
  • 持续开发、集成和部署:提供可靠且频繁的容器镜像构建/部署,并使用快速和简单的回滚(由于镜像不可变性)
  • 开发和运行相分离:在build或者release阶段创建容器镜像,使得应用和基础设施解耦
    开发,测试和生产环境一致性:在本地或外网(生产环境)运行的一致性
  • 云平台或其他操作系统:可以在 Ubuntu、RHEL、 CoreOS、on-prem、Google Container Engine或其它任何环境中运行
  • Loosely coupled,分布式,弹性,微服务化:应用程序分为更小的、独立的部件,可以动态部署和管理
  • 资源隔离
  • 资源利用:更高效

个人理解:

镜像是创建容器的基础,可以理解为虚拟机的快照,这就解释了为什么K8S能够快速的回滚
容器可以看成一个简易版的linux环境,是从镜像中创建的,docker利用容器运行和隔离应用

集群设计

集群是一组节点,节点可以是物理或者虚拟机,每个节点都有安装k8s
kubernetes可以管理大规模的集群,使集群之间的节点相互连接
分为两类节点,master node & worker node

  • master 是负责整个集群:应用调度、更新、扩容
  • Node(worker) 即具体工作的节点,一个物理或虚拟机就是一个Node,运行着docker服务和kubelet服务(kubernetes的一个组件)

master 下达指令 ⇢ Node执行任务(用docker运行指定的应用)

组件

Master 组件和Node组件

  • master组件提供的是集群的管理控制
  • node组件运行在node,提供kubernetes运行的环境,以及维护Pod

Master组件

Master组件可以在集群中任何节点上运行。但是为了简单起见,通常在一台VM/机器上启动所有Master组件,并且不会在此VM/机器上运行用户容器。

  • kube-apiserver
    任何资源的请求/调用操作都是通过apiserver提供的kubernetes api 接口进行的

即接收客户端操作k8s的指令

  • schduler
    监测新创建的pod并把没有分配到node的pod选择一个node
  • kube-controller-manager
    运行控制管理器,集群中处理常规任务的后台线程,

这些控制器包括:

节点(Node)控制器。
副本(Replication)控制器:负责维护系统中每个副本中的pod。
端点(Endpoints)控制器:填充Endpoints对象(即连接Services&Pods)。
Service Account和Token控制器:为新的Namespace 创建默认帐户访问API Token。

  • ETCD
    提供默认的存储系统,保存所有集群数据
插件 addons

实现集群pod和Services功能

  • DNS
    为 Kubernetes services提供 DNS记录
  • 用户界面
    kube-ui提供集群状态基础信息查看
  • 容器资源监测
    提供一个UI浏览监控数据
  • Cluster-level Logging
    保存容器日志,搜索/查看日志

Node组件

  • kubelet
    就是上面所说的运行在node上的,监视已分配给节点的pod

,而schduler 是监视没有新建的分配的pod

具体功能,

安装Pod所需的volume。
下载Pod的Secrets。
Pod中运行的 docker(或experimentally,rkt)容器。
定期执行容器健康检查。
Reports the status of the pod back to the rest of the system, by creating a mirror pod if necessary.
Reports the status of the node back to the rest of the system.

  • kube-proxy
    在主机上维护网络规则并执行连接转发来实现Kubernetes服务抽象

在node节点上实现pod的网络代理,维护网络规则和四层负载均衡

  • docker或者rocket
    运行容器
  • supervisord
    轻量级的监控系统
  • fluentd
    守护进程,可提供cluster-level logging

Deployment - 应用管理者

一般通过Kubernetes的 Deployment 的配置文件去描述应用,比如应用叫什么名字、使用的镜像名字、要运行几个实例、需要多少的内存资源、cpu 资源等等,有了配置文件就可以通过Kubernetes提供的命令行客户端 - kubectl 去管理这个应用

之后就由 Kubernetes 来保证我们的应用处于运行状态,当某个实例运行失败了或者运行着应用的 Node 突然宕机了,Kubernetes 会自动发现并在新的 Node 上调度一个新的实例,保证我们的应用始终达到我们预期的结果

也就是说,平时创建docker容器都是在linux单独写配置文件,然后创建的。

k8s可以统一的进行配置创建,保证它运行,以及宕机了可以自由的调度

Pod

Kubernetes最小调度单位,一个Pod代表集群上正在运行的一个进程
一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项
pod 是短暂的

Kubernetes中的Pod使用可分两种主要方式:

  • Pod中运行一个容器。“one-container-per-Pod”模式是Kubernetes最常见的用法; 在这种情况下,你可以将Pod视为单个封装的容器,但是Kubernetes是直接管理Pod而不是容器。
  • Pods中运行多个需要一起工作的容器。Pod可以封装紧密耦合的应用,它们需要由多个容器组成,它们之间能够共享资源,这些容器可以形成一个单一的内部service单位 - 一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。

这相当于一组容器(或单个容器)上又包裹一层Pod,pod中的容器剧透相同的网络空间,就是IP地址相同,网卡网络配置相同。因此,镜像互知,端口互知

Pod可以指定一组共享存储volumes。Pod中的所有容器都可以访问共享volumes,允许这些容器共享数据

pod被创建后,被kubernetes调度到集群的node上,直到pod的进程中止、被删掉、因为缺少资源而被驱逐、或者node故障等情况 pod结束

注意:重启Pod中的容器跟重启Pod不是一回事。Pod只提供容器的运行环境并保持容器的运行状态,重启容器不会造成Pod重启。

Pod不会自愈。如果Pod运行的Node故障,或者是调度器本身故障,这个Pod就会被删除。同样的,如果Pod所在Node缺少资源或者Pod处于维护状态,Pod也会被驱逐。Kubernetes使用更高级的称为Controller的抽象层,来管理Pod实例。虽然可以直接使用Pod,但是在Kubernetes中通常是使用Controller来管理Pod的。

Controller可以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。

Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁生命就永远结束。 通过 ReplicationController 能够动态地创建和销毁 Pod(例如,需要进行扩缩容,或者执行 滚动升级)。 每个 Pod 都会获取它自己的 IP 地址,即使这些 IP 地址不总是稳定可依赖的

Service

服务发现 - 找到每个Pod

Kubernetes Service 定义了这样一种抽象:一个 Pod 的逻辑分组,一种可以访问它们的策略 —通常称为微服务。 这一组 Pod 能够被 Service 访问到,通常是通过 Label Selector(查看下面了解,为什么可能需要没有 selector 的 Service)实现的。

对 Kubernetes 集群中的应用,Kubernetes 提供了简单的 Endpoints API,只要 Service 中的一组 Pod 发生变更,应用程序就会被更新。 对非 Kubernetes 集群中的应用,Kubernetes 提供了基于 VIP 的网桥的方式访问 Service,再由 Service 重定向到 backend Pod。

接口:

  1. ClusterIP:Service 在集群内的唯一 ip 地址,我们可以通过这个 ip,均衡的访问到后端的 Pod,而无须关心具体的 Pod
  2. NodePort:Service 会在集群的每个 Node 上都启动一个端口,我们可以通过任意Node 的这个端口来访问到 Pod
  3. LoadBalancer:在 NodePort 的基础上,借助公有云环境创建一个外部的负载均衡器,并将请求转发到 NodeIP:NodePort
  4. ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)
label标签

通过给 Pod 打标签,Service 可以只负责一个 Deployment 的 Pod 也可以负责多个 Deployment 的 Pod

NameSpace(命名空间)

用来隔离pod的运行环境,默认情况下,pod是可以互相访问的

其他

当然 ,中文文档还有很多概念没去理解,暂时就这么多的概念,了解一下先。