K8S基本架构设计&专业术语
下面是一个简单的单Master的集群架构图,我们从这一张图作为切入点来进行学习
一个kubernetes集群主要是由控制节点(master)+ 工作节点(node)构成,每个节点上都会安装不同的组件
控制节点(master)
master节点作为Kubenetes中的控制节点,他主要的作用是负责集群的管理,根据上面的架构图,我们发现master节点中主要包含一下几个组件
ApiServer
作为K8S中资源对象的唯一操作入口,其他所有的组件都必须通过它提供的API来操作资源数据 API Server 内部有一套完备的安全机制,包括认证、授权、准入控制等实现资源数据的安全保证
Controller Manager
主要负责的就是集群内部应用的部署、状态监控、恢复的自动化工作
Scheduler
负责集群资源的调度,按照预定的调度策略将Pod调度分配到相应的工作节点node上
Etcd
-
可以理解K8S的储存系统,负责存储集群中各种资源对象的信息,Api Server提供的接口就是用来操作Etcd中的数据
工作节点(node)
-
node节点又被称为工作节点,主要的作用为我们运行容器提供一个被K8S监控的环境,在node节点中主要包含以下几个组件
kube-proxy
-
提供集群内部服务访问、对外暴露访问的网络代理,以及访问时的负载均衡
kubelet
-
负责本Node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里。
-
可以理解为,这就是master节点派来此node节点的使臣,用于实现master对本node节点上容器的全生命周期管理
container
-
容器的运行时环境,这里我们仍然以docker做为典型,真名应该叫:container runtime
-
环境运行容器,因为K8S的出现就是为了容器编排,而这里做为最底层的容器docker是可以被替代的
-
比如:containerd、Podman、LXC/LXD、rkt、OpenVZ、 Singularity、CRI-O
-
在K8S的官方也明确表示出在1.20开始放弃docker,原因是K8S编排docker的时候,需要桥接服务才能和docker通信,桥接服务也是由K8S维护的,目前市面上兼容了CRI接口的容器技术已经出现了很多,换掉维护成本高的docker也是理所当然
-
但在目前的发展中,docker也在推动本身实现CRI,以至于不被诸多资源编排技术排斥
业务流程如下所示
-
编写kubenetes的资源清单文件,定义我们要创建的资源对象规格数据
-
通过kebectl apply 或者kubectl create 指定我们的资源清单文件,进行构建资源对象
-
kubectl会将这个资源对象的构建请求发送给API Server , 然后写入到etcd中
-
此时Controller Manager通过 API Server暴露的资源变化端口感知到该资源对象创建事件
-
然后获取K8S的资源列表发现没有该资源对象,于是根据资源清单文件定义了该资源,并通过API Server写入到了etcd中
-
然后该资源对象被scheduler检测到,进过调度分许,为这个资源对象选定了一个node节点作为运行环境并补充写入到etcd中
-
然后node节点上运行的kubelet组件通过API Server监听到该资源对象,并按照它的定义,创建了该资源并负责它的全生命周期
核心概念&专业术语
有状态服务
-
会储存数据到本地,对本地数据产生依赖,比如MySQL、Redis等应用就会有数据管理的需求
无状态服务
-
不会对本地环境产生任何依赖,随便在某个节点上都能运行,完全独立的个体,可以随时高效的进行扩容/迁移的服务,比如Nginx
Pod
-
是K8S最小的部署单元,一个Pod内可以运行一个或者多个容器,一般情况下一个Pod运行一个容器
-
每个Pod中都有一个pause容器, 该容器使得该Pod中的多个容器之间的网络、文件系统实现共享
replicas
-
一个 Pod 可以被复制成多份,这些复制出来的Pod提供相同的功能
RC(Replication Controller)
-
Pod的控制器之一 ,适用于无状态服务的部署 , 后来被RS替代
-
帮助我们动态的更新Pod的运行副本数到我们的预期副本数
RS(Replica Set)
-
Pod的控制器之一 , 适用于无状态服务的部署 , 后来被Deployment替代
-
帮助我们动态的更新Pod的运行副本数到我们的预期副本数,和RC区别不大,只是支持了label和selector
-
label:附加到资源对象的标签
-
selector:匹配某类资源对象
-
RS通过selector来关联Pod的label,实现动态的更新关联pod的副本数
Deployment
-
Pod的控制器之一 , 适用于无状态服务的部署 , 目前部署无状态服务的推荐控制器
-
Deployment对RS做了更好的包装 , 包括但不限于:自动伸缩(RS) 、滚动升级&回滚 、 平滑伸缩 、 暂停与恢复
StatefulSet
-
Pod的控制器之一 , 适用于有状态服务的部署 , 目前部署有状态服务的推荐控制器
-
【特点】基于PVC实现Pod即使重新调度后仍然能访问到之前相同的持久化数据 , 下面会细说PVC
-
【特点】基于Headless Service使Pod重新调度后PodName和HostName也不会变化,拥有稳定的网络标志
-
【特点】有序部署 、 有序扩展 , 即Pod是有顺序的,在部署或者扩展时依次进行,从0-N
-
【特点】有序收缩 、 有序删除 , 即Pod是有顺序的,在部收缩或删除时依次进行,从N-
-
【组成】headless Service
-
用于定义网络标志(DNS domain), DNS = Domain Name Server = 域名服务
-
服务名 --> 域名 --> ip
-
-
【组成】volumeClaimTemplate
-
用于创建PersistentVolumes , 关于PersistentVolumes 简称PV,下面亦会和PV一起做详细说明
-
-
【注意事项】Pod需要使用的Volumn必须使用PV或者管理员事先创建准备好
-
【注意事项】为了保证数据安全 , 删除StatefulSet时不会删除Volume
-
【注意事项】statefulSet需要一个headless Service来定义DNS domain , 需要在statefulSet创建之前准备好
DaemonSet
-
Pod的控制器之一 , 适用于部署每一个Node上都需要部署该容器的的环境
-
典型的应用比如:
-
日志收集: fluents 、 logstash ...
-
系统监控: 普罗米修斯 ...
-
系统程序: kube-proxy 、 kube-dns ...
-
Job
-
Pod的控制器之一 , 适用于一次性任务 , 运行完成后Pod销毁 , 不会在重新启动容易;
CronJob
-
Pod的控制器之一 , 在Job的基础上加了定时的功能;
SVC(Service)
-
服务发现组件之一 , 用于服务暴露 , 一般作用于K8S集群内部的服务暴露 , 东西流量的实现;
-
Pod不能直接提供给外网访问,而是应该使用Service做为该Pod对外暴露的代理;
-
Service对外表现为一个访问入口 , 从Service进来的请求会经过负载均衡转发到Pod中的容器里;
Ingress
-
服务发现组件之一 , 用于服务暴露 , 一般作用于Service暴露给公网 , 南北流量的实现;
-
Ingress可以把某个请求地址映射 、 路由到特定的Service上 , Service再分发到Pod中的容器里;
-
Ingress只是相当于路由规则的集合,真正实现路由功能的是Ingress Controller;
Volume
-
数据卷 , 用于存放需要持久化的数据 , 共享Pod中容器使用的数据 , 比如数据库的数据;
ConfigMap
-
特殊类型配置实现之一 , 用于存放配置数据 , 明文储存;
Secret
-
特殊类型配置实现之一 , 用于存放配置数据 , 密文储存
-
Secret避免了密码 、 Token 、密钥等敏感数据直接暴露在镜像的配置文件或者Pod的资源清单中
-
Secret可以以Volume或者环境变量的方式进行使用
-
Secret有三种类型
-
Service Account: 用来访问Kubernetes的API,由Kubernetes自动创建;
-
Opaque: base64编码格式的Secret , 用来存储密码、密钥等;
-
kubernetes.io/dockerconfigjson: 用来存储私有docker registry的认证信息;
-
DownwardAPI
-
downwardAPI这个模式和其他模式不一样的地方在于:
-
它不是为了存放容器的数据 , 也不是用来进行容器和宿主机的数据交换的;
-
而是让Pod里的容器能够直接获取到这个Pod对象本身的一些信息;
-
-
downwardAPI提供了两种方式用于将Pod的信息注入到容器内部:
-
环境变量: 用于单个变量 , 可以将Pod信息和容器信息直接注入容器内部;
-
volume挂载: 将Pod信息生成为文件,直接挂载到容器内部中去;
-
Role
-
Role是一组权限的集合 , 列如可以包含列出Pod权限以及列出Deployment权限 , Role用于给某个Namespace中的资源进行鉴权
Role Binding
-
将Subject绑定到Role , RoleBinding使规则在命名空间内生效
-