k8s架构

核心组件

  • etcd保存整个集群的状态
  • apiserver提供资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
  • controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
  • scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
  • kubelet负责维护容器的生命周期,同时也负责Volume(CSI)和网络(CNI)的管理
  • container runtime负责镜像管理以及Pod和容器的真正运行(CRI)
  • kube-proxy负责为Service提供cluster内部的服务发现和负载均衡

常用插件

  • CoreDNS负责为整个集群提供DNS服务
  • Ingress Controller 为服务提供外网入口
  • Prometheus 提供资源监控
  • Dashboard 提供GUI
  • Federation 提供跨可用区的集群

整体架构

image-20230201112155429

image-20230201113359142

Master架构

image-20230201113952695

Node架构

image-20230201114016194

分层架构

image-20230201114039143
  • 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
  • 应用层:部署(有、无状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)、Service(部分位于应用层)
  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)、Service Mesh(部分位于管理层)
  • 借口层:kubectl命令行工具、客户端SDK以及集群联邦
  • 生态系统:在借口层之上的庞大容器集群管理调度的生态系统,可以话费为两个范畴
    • Kubernetes外部:日志、监控、配置管理、CI/CD、Workflow、FaaS、OTS应用、ChatOps、GitOps、SecOps等
    • Kubernetes内部:CRI、CNI、CSI、镜像仓库、Cloud Provide、集群自身的配置和管理等

Kubernetes 的核心技术概念和API对象

API对象是Kubernetes集群中的管理操作单元。

Kubernetes集群系统每支持一项新功能,引入一项新技术,一定会引入对应的API对象。

API对象的三大类属性:

  • 元数据metadata:用来标识API对象,每个对象至少有3个元数据
    • namespace
    • name
    • uid
  • 规范spec:描述用户期望Kubernetes集群中的分布式系统达到的理想状态
  • 状态status:系统实际当前达到的状态

Kubernetes中所有的配置都是通过API对象的spec去设置的,也就是用户通过配置系统的理想状态来改变系统

即所有的操作都是声明式而不是命令式

Pod

Pod 是 Kubernetes 集群中所有业务类型的基础,可以看作运行在 Kubernetes 集群中的小机器人,不同类型的业务就需要不同类型的小机器人去执行。目前 Kubernetes 中的业务主要可以分为长期伺服型(long-running)、批处理型(batch)、节点后台支撑型(node-daemon)和有状态应用型(stateful application);分别对应的小机器人控制器为 Deployment、Job、DaemonSet 和 StatefulSet。

Pod 是在 Kubernetes 集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod 的设计理念是支持多个容器在一个 Pod 中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务

RC:副本控制器

RS:副本集

Node:节点

是所有Pod运行所在的工作主机,上面要运行kubelet管理节点上运行的容器

密钥对象(Secret)

明文信息存储为Secret对象,在配置文件中通过Secret对象引用敏感信息

用户账户和服务账户

用户帐户对应的是人的身份,人的身份与服务的 namespace 无关,所以用户账户是跨 namespace 的;

而服务帐户对应的是一个运行中程序的身份,与特定 namespace 是相关的。

namespace

docker中的namespace

在容器内运行ps,默认会显示pid为1,从操作上来说,我们并没有脱离本身的系统,只是运行了一个名为docker的软件,为什么在软件中执行ps命令会显示进程pid为1,而不是这个docker软件本身的pid,比如100

主要是因为Linux的Namespace机制,在Linux中创建线程的系统调用是clone()

这个系统调用会创建一个新进程,并返回它的PID,其中的可选参数CLONE_NEWPID参数如果使用,则心创建的这个进程会认为自己在一个新的进程空间,也就是认为自己的pid为1

通过这种方式从挂载、网络、用户、设备之类的方向让这个进程认为自己在一个全新的空间中,从而实现与宿主机隔离

所以,Docker项目帮助用户启动的还是原来的应用进程,不过在创建这些进程时,Docker为他们加上了各种Namespace参数,让它们以为自己是一个独立的网络设备,也就是容器。

命名空间为 Kubernetes 集群提供虚拟的隔离作用。

Kubernetes 集群初始有两个命名空间,分别是默认命名空间 default 和系统命名空间 kube-system。

除此以外,管理员可以可以创建新的命名空间满足需要。

RBAC授权(Role-based Access Control)

posted @ 2023-07-24 17:23  pr1s0n  阅读(29)  评论(0编辑  收藏  举报