Kubernetes 是什么?
Kubernetes,简称 k8s,是用8代替名字中间的8个字符 "ubernete" 而成的缩写。
Kubernetes 是 Google 基于容器技术实现的大规模集群管理系统 Borg 的一个开源版本。
Kubernetes 旨在自动化部署、扩展和管理容器化的应用程序,提供一系列功能来解决容器编排的复杂问题。它是一个全新的基于容器技术的分布式架构解决方案,在 Docker 技术基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高大规模容器集群管理的便捷性。

为什么要用 Kubernetes?
“轻装上阵”地开发复杂系统。
以前需要很多人协作设计实现和运维一套分布式系统,现在只需一名架构师负责服务组件的架构设计,几名开发人员负责业务代码开发,一名系统兼运维工程师负责 k8s 的部署和运维。
全面拥抱以微服务架构为核心的新一代容器技术的领先架构。
微服务架构的核心是将一个巨大的单体应用分解为很多小的相互连接的微服务,一个微服务可能由多个实例副本支撑,副本数量可以随系统负荷变化进行调整。微服务架构使得每个服务都可以独立开发、升级和扩展,系统具备很高的稳定性和快速迭代能力。
随时随地将系统整体“搬迁”到公有云上。
k8s 最初设计目标就是让用户的应用运行在 Google 自家的公有云 GCE中,华为云 CCE、阿里云 ACK 和腾讯云 TKE 全部支持 k8s 集群,未来有更多公有云及私有云支持 k8s。使用 k8s 技术可以方便实现私有云与公有云融合的混合云领域,用户本地的私有云可以与云服务商的 k8s 集群保持一致的接口,应用程序大部分情况下不再需要与具体云服务商直接绑定。
轻松应对突发流量。
k8s 内建的服务弹性扩容机制,可以轻松应对突发流量。在服务高峰期,选择在公有云中快速扩容某些 Service 的实例副本以提升系统的吞吐量,不仅节省硬件投入,还大大改善用户体验。
提升企业竞争力。
k8s 系统架构超强的横向扩容能力可以提升企业竞争力。利用 k8s 提供的工具,不用修改代码,就能将一个 k8s 集群从几个 Node 的小集群平滑扩展到上百个 Node 的大集群,而且可以在线完成集群扩容。
Kubernetes 的基本概念和术语
资源对象
k8s 中的基本概念和术语大多围绕资源对象来说的,资源对象具体可以分为 2 类:
某种资源的对象,如 节点(Node)、Pod、服务(Service)、存储卷(Volume)。 与资源对象相关的事物与动作,如标签(Label)、注解(Annotation)、命名空间(Namespace)、部署(Deployment)、HPA、PVC。
可以采用 YAML 或 JSON 格式声明一个 k8s 资源对象,资源对象的结构定义统一保存在 etcd 当中。所有资源对象都可以通过 k8s 提供的 kubectl 工具执行增删改查等操作。
Service
Service 是 k8s 实现微服务架构的核心,主要用于提供网络服务。通过 Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。一个 Service 对象拥有几个关键特征:
有唯一指定的名称,如 mysql-server 有一个虚拟IP地址(ClusterIP)和端口号 能提供某种远程服务能力 能将客户端对服务的访问请求转发到一组容器应用上
通过分析识别并建模系统中的所有服务为微服务-Service,系统变成由多个提供不同业务能力且彼此独立的微服务单元组成,从而形成强大灵活的弹性网格,拥有强大的分布式能力、弹性扩展能力、容错能力。

Pod
Pod 是 k8s 中的最小运行单元。Pod 运行在一个称为节点 Node 的环境中,这个节点可以是物理机也可以是私有云或公有云中的虚拟机,一个节点上能运行多个 Pod。
每个 Pod 中运行着 1 个 Pause “根容器”及 N 个业务容器,这些业务容器共享 Pause 容器的网络栈和 Volume 挂载卷。

Pod 的主要特点可以概括为:
管理多个容器。
Pod 可以同时运行多个容器,这些容器共享数据和通信。这种多容器共享一个 Pod 的方式可以减少网络通信开销,并简化容器间的依赖关系。
提供共享资源。
Pod 内的所有容器共享同一个网络命名空间、IP 地址和端口号,它们可以互相访问,并通过本地主机之间的共享卷交换数据。
生命周期管理。
k8s 通过 Pod 来管理应用的生命周期,而不是直接管理容器。Pod 封装了容器的运行环境,为其提供协调的操作环境。
集群(Cluster)
集群(Cluster) 指一个由 Master 和 Node 组成的 k8s 集群。
Master 是集群中的控制节点,为了保证高可用性,一个集群上通常会包含多个 Master。Master 上运行集群管理的一些进程:kube-apiserver、kube-controller-manager和 kube-scheduler,这些进程实现整个集群的资源管理、Pod 调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,且都是自动完成。Master 上通常还需要部署 etcd 服务。
kube-apiserver:提供 HTTP RESTful API 接口的主要服务,是 k8s 里面对所有资源进行增删改查等操作的唯一入口,也是集群控制的入口进程。 kube-controller-manager:k8s 里面所有资源对象的自动化控制中心,可理解为资源对象的“大总管”。 kube-scheduler:负载资源调度 (Pod 调度) 的进程。
Node 是集群中的工作节点,每个 Node 上被 Master 分配一些工作负载 (Docker 容器)。在 Node 上,k8s 管理的最小运行单元是 Pod。Node 上运行着 k8s 的 kubelet、kube-proxy 服务进程,这些进程负责 Pod 的创建、启动、监控、重启、销毁,以及实现负载均衡。
kubelet:负责 Pod 对应容器的创建、启停等任务,同时与 Master 密切协作,实现集群管理的基本功能。 kube-proxy:实现 k8s Service 的通信与负载均衡机制的服务。 容器运行时:如 Docker,负责本机的容器创建和管理。
下图描述Pod、容器与 Node 之间的关系,

标签(Label)与标签选择器(Label Selector)
一个标签是一个 key=value 键值对,key 和 value 由用户指定。标签可以被附加到各种资源对象上,如 Node、Pod、Service 等。一个资源对象上可以定义多个 Label,同一个 Label 也可以被添加到多个资源对象上。
通过给指定的资源对象绑定一个或多个不同的 Label 可以实现多维度的资源分组管理功能,例如,部署不同版本的应用到不同的环境中,使用版本标签:release: stable 和 release: canary 等。
给某个资源对象定义 Label 后,可以通过 Label Selector 查询和筛选拥有某些 Label 的资源对象。当前有 2 种 Label Selector 表达式:基于等式的(如 name = redis-slave)和基于集合的(如 name in (redis-master,redis-slave))。
如下图所示,Label Selector 为 role=frontend 对应到 Node 1 和 Node 2 上面的 Pod。

Label 是 Pod 的重要属性,当 Pod 定义了 Label 之后,对应的 Service 添加 Label Selector 属性后,就可以实现和 Pod 的关联。




