简介

Kubernetes 简称k8s。是用于自动Deployment,扩展和管理Containerization应用程序的开源系统。 中文官网:https://kubernetes.io/zh/ 中文社区:https://www.kubernetes.org.cn/ 官方文档:https://kubernetes.io/zh/docs/home/ 社区文档:http://docs.kubernetes.org.cn/

部署方式的进化

https://kubernetes.io/zh/docs/concepts/overview/

功能

架构

整体主从方式

Master 节点架构

kube-apiserver

对外暴露K8S 的api Interface,是外界进行资源操作的唯一入口。

提供认证、授权、访问控制、API 注册和发现等Mechanism。

etcd

etcd 是兼具一致性和High Availability性的键值Database,可以作为保存Kubernetes 所有集 群Data的后台Database。 Kubernetes 集群的etcd Database通常需要有个Backup计划

kube-scheduler

主节点上的组件,该组件监视那些新Create的未指定Run节点的Pod,并Choose节点 让Pod 在上面Run。 所有对k8s 的集群操作,都必须经过主节点进行Scheduling

kube-controller-manager

在主节点上Run控制器的组件 这些控制器包括: 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应。 副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维 护正确数量的Pod。 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入Service 与Pod)。 Service帐户和令牌控制器(Service Account & Token Controllers): 为新的命名 空间Create默认帐户和API 访问令牌

Node 节点架构

kubelet

一个在集群中每个节点上Run的Proxy。它保证Container都Run在Pod 中。 负责维护Container的生命周期,同时也负责Volume(CSI)和网络(CNI)的管理;

kube-proxy

负责为Service 提供cluster 内部的Service Discovery和Load Balancing;

容器运行环境(Container Runtime)

ContainerRun环境是负责RunContainer的软件。 Kubernetes 支持多个ContainerRun环境: Docker、containerd、cri-o、rktlet 以及任 何ImplementationKubernetes CRI (ContainerRun环境Interface)。

fluentd

是一个守护进程,它有助于提供集群层面Logging集群层面的Logging

概念

Container:容器,可以是docker 启动的一个容器

Pod

k8s UsagePod 来组织一组Container 一个Pod 中的所有Container共享同一网络。 Pod 是k8s 中的最小Deployment单元

Volume

声明在Pod Container中可访问的FileDirectory 可以被挂载在Pod 中一个或多个Container指定Path下 支持多种后端Storage抽象(本地Storage,DistributedStorage,云存 储…)

Controllers:更高层次对象,部署和管理Pod;

ReplicaSet:确保预期的Pod 副本数量 Deplotment:无状态应用Deployment StatefulSet:有状态应用Deployment DaemonSet:确保所有Node 都Run一个指定Pod Job:一次性任务 Cronjob:Scheduled Tasks

Deployment

定义一组Pod 的副本数目、Version等 通过控制器(Controller)维持Pod 数目(自动回 复失败的Pod) 通过控制器以指定的策略控制Version(滚动升级,回滚等)

Service

定义一组Pod 的访问策略 Pod 的Load Balancing,提供一个或者多个Pod 的稳定访问地址

支持多种方式(ClusterIP、NodePort、LoadBalance)

Label:标签,用于对象资源的查询,筛选

Namespace:命名空间,逻辑隔离

一个集群内部的逻辑隔离Mechanism(鉴权,资源)

每个资源都属于一个namespace

同一个namespace 所有资源名不能重复

不同namespace 可以资源名重复

API

我们通过kubernetes 的API 来操作整个集群。 可以通过kubectl、ui、curl 最终发送http+json/yaml 方式的请求给API Server,然后控制k8s集群。

注意

k8s 里的所有的资源对象都可以采用yaml 或JSON 格式的File定义或描述

流程叙述

1、通过Kubectl 提交一个CreateRC(Replication Controller)的请求,该请求通过APIServer 被写入etcd 中 2、此时Controller Manager 通过API Server 的监听资源变化的Interface监听到此RC 事件

3、分析之后,发现当前集群中还没有它所对应的Pod Example, 4、于是根据RC 里的Pod 模板定义生成一个Pod 对象,通过APIServer 写入etcd 5、此事件被Scheduler 发现,它立即Execute一个复杂的Scheduling流程,为这个新Pod 选定一 个落户的Node,然后通过API Server 讲这一结果写入到etcd 中, 6、目标Node 上Run的Kubelet 进程通过APIServer 监测到这个“新生的”Pod,并按照它 的定义,Start该Pod 并任劳任怨地负责它的下半生,直到Pod 的生命结束。 7、随后,我们通过Kubectl 提交一个新的映射到该Pod 的Service 的Create请求 8、ControllerManager 通过Label 标签查询到关联的Pod Example,然后生成Service 的 Endpoints 信息,并通过APIServer 写入到etcd 中, 9、接下来,所有Node 上Run的Proxy 进程通过APIServer 查询并监听Service 对象与 其对应的Endpoints 信息,建立一个软件方式的Load Balancing器来ImplementationService 访问到后端 Pod 的流量转发功能。

k8s 里的所有的资源对象都可以采用yaml 或JSON 格式的File定义或描述