一、Kubernetes 是什么
Kubernetes 是由 Google 开源的容器管理工具,是一个可移植的、可扩展的、用于管理容器化工作负载和服务的开源平台。Kubernetes 是用来编排容器的,但是编排的容器不仅限于 Docker。K8s本身是针对容器的,并不针对某一种特定的容器。只是我们平时大多数时候都在使用 Docker。
二、Kubernetes能做什么?
Kubernetes 可以在物理或虚拟机的Kubernetes集群上运行容器化应用,Kubernetes能提供一个以“容器为中心的基础架构”,满足在生产环境中运行应用的一些常见需求。
Kubernetes为你提供:
服务发现和负载平衡
Kubernetes可以使用DNS名称或自己的IP地址公开容器。如果到容器的通信量很高,Kubernetes能够实现负载平衡并分配网络通信量,从而使部署保持稳定。
存储编排
Kubernetes允许你自动挂载自己选择的存储系统,比如本地存储、公有云提供商等等。
自动滚动更新和回滚
可以使用Kubernetes描述所部署容器的期望状态,并且可以以受控的速率将实际状态更改为期望状态。
自动包装
你只需为Kubernetes提供一组节点,它便可以使用这些节点来运行容器化的任务。告诉Kubernetes每个容器需要多少CPU和内存(RAM)。Kubernetes可以在你的节点上放置容器,以充分利用你的资源。
自动重启
Kubernetes会重新启动失败的容器,替换容器,杀死不响应用户定义的健康检查的容器,并且在它们准备好服务之前不会将他们暴露给客户端。
秘密和配置管理
Kubernetes允许你存储和管理敏感信息,比如密码、OAuth令牌和ssh密钥。你可以部署和更新秘密和应用程序配置,而无需重新构建容器映像,也无需在堆栈配置中公开秘密。
三、Kubernetes 组件
当你部署Kubernetes的时候,你会得到一个集群。
一个集群是一组机器,称为节点(nodes),它们运行由Kubernetes管理的容器化应用程序。
一个集群至少有一个工作节点(worker node)和一个主节点(master node)。
工作节点承载应用程序的组件。主节点管理集群中的工作节点和pods。多个主节点用于提供具有故障转移和高可用性的集群。
下面是Kubernetes集群的关系图:
三、核心组件概念
Kubernetes 中的绝大部分概念都抽象成 Kubernetes 管理的一种资源对象,
Master
Master 节点是 Kubernetes 集群的控制节点,负责整个集群的管理和控制。
Master节点包含以下组件:
-
kube-apiserver
集群控制的入口,提供 HTTP REST 服务。
提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制。
-
kube-controller-manager
Kubernetes 集群中所有资源对象的自动化控制中心。
负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。
-
Kube-scheduler
负责 Pod 的调度,按照预定的调度策略将 Pod 调度到相应的机器上,并为它们选择要运行的节点。
-
etcd
一致性和高可用的键值存储用作Kubernetes的所有集群数据备份存储。
保存了整个集群的状态,就是一个数据库。
Node
Node节点是 Kubernetes 集群的工作节点,Node 上的工作负载由 Master 节点分配工作负载主要是运行容器应用。
Node 节点包含以下组件:
-
Kubelet
负责 Pod 的创建、启动、监控、重启、销毁等工作,同时与 Master 节点协作,实现集群的基本管理的基 本功能。
负责维护容器的生命周期,同时也负责 Volume(CSI)和网络(CNI)的管理。
-
kube-proxy
实现 Kubernetes Service 的通信和负载均衡。
负责为 Service 提供 cluster 内部的服务发现和负载均衡。
-
Container runtime
运行容器化的 Pod 应用,负责镜像管理以及 Pod 和容器的真正运行。
Pod
Pod是 Kubernetes 最基本的调度单元。每个 Pod 都是由一个或多个业务容器和一个根容器(Pause 容器)组成。一个 Pod 表示某个应用的的一个实例。
ReplicaSet(副本集)
是 Pod 副本的抽象,用于解决 Pod 的扩容和伸缩。目的是维护一组稳定的副本Pods,以保证在任何给定时间都有可用的Pods。
Label
Label 是识别 Kubernetes 对象的标签,以 key/value 的方式附加到对象上(key最长不能超过63字节,value 可以为空,也可以是不超过253字节的字符串)。 Label 不提供唯一性,并且实际上经常是很多对象(如Pods)都使用相同的 label 来标志具体的应用。 Label 定义好后其他对象可以使用 Label Selector 来选择一组相同 label 的对象(比如Service 用 label 来选择一组 Pod)。Label Selector支持以下几种方式:
- 等式,如app=nginx和env!=production
- 集合,如env in (production, qa)
- 多个label(它们之间是AND关系),如app=nginx,env=test
Namespace
Namespace 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pods, services,deployments 等都是属于某一个 namespace 的(默认是default),而 Node, PersistentVolumes 等则不属于任何 namespace。
Deployment
Deployment 表示部署,在内部使用ReplicaSet 来实现。可以通过 Deployment 来生成相应的 ReplicaSet 完成 Pod 副本的创建。
Deployment 确保任意时间都有指定数量的 Pod“副本”在运行。如果为某个 Pod 创建了Deployment 并且指定3个副本,它会创建3个 Pod,并且持续监控它们。如果某个 Pod 不响应,那么 Deployment 会替换它,保持总数为3.
如果之前不响应的 Pod 恢复了,现在就有4个 Pod 了,那么 Deployment 会将其中一个终止保持总数为3。如果在运行中将副本总数改为5,Deployment 会立刻启动2个新 Pod,保证总数为5。Deployment 还支持回滚和滚动升级。
当创建 Deployment 时,需要指定两个东西:
- Pod模板:用来创建 Pod 副本的模板
- Label标签:Deployment 需要监控的 Pod 的标签。
Services
Service 是应用服务的抽象,通过 labels 为应用提供负载均衡和服务发现。匹配 labels 的Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些endpoints 上。
每个 Service 都会自动分配一个 cluster IP(仅在集群内部可访问的虚拟地址)和 DNS 名,其他容器可以通过该地址或 DNS 来访问服务,而不需要了解后端容器的运行。
四、组件通信
Kubernetes 多组件之间的通信原理:
- apiserver 负责 etcd 存储的所有操作,且只有 apiserver 才直接操作 etcd 集群
- apiserver 对内(集群中的其他组件)和对外(用户)提供统一的 REST API,其他组件均通过 apiserver 进行通信
- controller manager、scheduler、kube-proxy 和 kubelet 等均通过 apiserver watch API 监测资源变化情况,并对资源作相应的操作
- 所有需要更新资源状态的操作均通过 apiserver 的 REST API 进行
Kubernetes Pod 创建流程
- 用户通过 REST API 创建一个 Pod
- apiserver 将其写入 etcd
- scheduluer 检测到未绑定 Node 的 Pod,开始调度并更新 Pod 的 Node 绑定
- kubelet 检测到有新的 Pod 调度过来,通过 container runtime 运行该 Pod
- kubelet 通过 container runtime 取到 Pod 状态,并更新到 apiserver 中