Kubernetes入门学习
k8s是什么
- 全称:Kubernetes,意为“舵手”或“飞行员”
- Kubernetes 的前身是Borg,Borg是谷歌内容使用的大规模集群管理系统,基于容器技术,目的是实现资源管理的自动化,以及跨多个数据中心的资源利用率最大化。
- Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。
演进过程
说明:
- 传统部署时代:各个组织是在物理服务器上运行应用程序,由于无法限制在物理服务器中运行的应用程序使用,因此会导致资源分配问题。
- 虚拟化部署时代虚拟化技术允许你在单个物理服务器的cpu上运行多台虚拟机,虚拟机能使应用程序在不同vm之间彼此隔离,能够提供一定程序的安全虚拟化技术能够更好地利用物理服务器资源,并且因为可轻松地添加或者更新应用程序,而因此可以具有更高的可扩缩性,以降低硬件成本的好处。
- 容器部署时代容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统。每个容器都具有自己的文件系统、CPU、内存、进程空间等。
为什么需要
- Docker容器技术当前已经被很多公司所采用,从单机走向集群成为必然。
- k8s全部拥抱微服务架构,微服务架构的核心是将一个巨大的单体应用分解为多个互相连接的微服务。
Kubernetes 特点
可移植: 支持公有云,私有云,混合云,多重云(multi-cloud) 可扩展: 模块化, 插件化, 可挂载, 可组合 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
名词解释
- Master:是集群控制节点,每个K8S集群里需要有一个Master节点来负责整个集群的管理和控制,基本上K8S所有的控制命令都有发给它,它来负责具体的执行过程
- Node:除了Master,K8S集群中的其他机器被称为Node节点,Node节点可以是一台物理机、也可以是一台虚拟机,Node节点才是K8S集群中的工作负载节点,每个Node都会被Master分配一些工作负载,Node的基本信息:名称标签创建时间
- Pod:K8S的最重要也是最基本的概念K8S为每个Pod分配了唯一的IP地址,称之为PodIp,一个Pod里的多个容器共享Pod Ip地址。K8S要求底层网络支持集群内任意两个Pod之间的TCP/IP直接通信,这通常采用虚拟二层网络技术来实现,例如Flannel、Openvswitch等Pod有两种类型:普通的Pod静态的Pod:不存放在K8S的etcd存储里面,而是存放在某个具体的Node上的一个具体文件中。
- Lab标签是K8S系统中另外一个核心概念,一个Label是一个Key=value的键值对,其中Key和Value由用户自己指定。Label可以附加到各种资源对象上,例如Node、Pod、Service、Rc。一个资源对象可以定义任意数据量的Label
- Replication ControllerRC是K8S系统中的核心概念之一,简单来说,他其实是定义了一个期望的场景,即声明某种Pod的副本数量在任意时刻都符合某个预期值,包括以下几部分:Pod期望的副本数用于筛选目标Pod的lable selector当Pod的副本数量小于预期数量的时间,用户创建新Pod的Pod模版
- Horizontal Pod Autoscaler(HPA)根据负载变化情况自动触发水平扩展或者缩容的能力
- Service是K8S最核心的资源对象之一,每个Service其实就是我们经常提到微服务架构中的一个微服务
- Volume 存储卷是Pod中能够被多个容器访问的共享目录K8S中的Volume定义在Pod上,然后被一个Pod里面的多个容器挂载到具体文件目录下,K8S的Volume与Pod的生命周期相同,但是与容器的生命周期不相关,当容器终止或重启时候,Volume中的数据不会丢失。
- Namespace在很多情况下用于实现多租户的资源隔离,将集群内部的资源对象 分配到不同的namespace中,形成逻辑上分组的不同项目、小组或者用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理
提供的功能
- 多个进程(作为容器运行)协同工作。(Pod)
- 存储系统挂载
- Distributing secrets
- 应用健康检测
- 应用实例的复制
- Pod自动伸缩/扩展
- Naming and discovering
- 负载均衡
- 滚动更新
- 资源监控
- 日志访问
- 调试应用程序
- 提供认证和授权
组件
控制平面组件
- 控制平面组件会为集群做出全局决策,比如资源的调度。 以及检测和响应集群事件,例如当不满足部署的 replicas 字段时, 要启动新的 pod
- 控制平面组件可以在集群中的任何节点上运行。 然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件
kube-apiserver
- API 服务器是 Kubernetes 控制平面的组件, 该组件负责公开了 Kubernetes API,负责处理接受请求的工作。 API 服务器是 Kubernetes 控制平面的前端。
etcd
- 一致且高可用的键值存储,用作 Kubernetes 所有集群数据的后台数据库。
kube-scheduler
- kube-scheduler 是控制平面的组件, 负责监视新创建的、未指定运行节点(node)的 Pods, 并选择节点来让 Pod 在上面运行
kube-controller-manager
- 是控制平面的组件, 负责运行控制器进程。
从逻辑上讲, 每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在同一个进程中运行。
这些控制器包括:
- 节点控制器(Node Controller):负责在节点出现故障时进行通知和响应
- 任务控制器(Job Controller):监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
- 端点分片控制器(EndpointSlice controller):填充端点分片(EndpointSlice)对象(以提供 Service 和 Pod 之间的链接)。
- 服务账号控制器(ServiceAccount controller):为新的命名空间创建默认的服务账号(ServiceAccount)。
Node组件
kubelet
- 会在集群中每个节点(node)上运行。 它保证容器(containers都运行在 Pod 中。
kube-proxy
- 集群中每个节点(node)上所运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分
容器运行时
- 容器运行环境是负责运行容器的软件
插件
- 插件使用 Kubernetes 资源(DaemonSet、 Deployment 等)实现集群功能。 因为这些插件提供集群级别的功能,插件中命名空间域的资源属于 kube-system 命名空间。
DNS
- 集群 DNS 是一个 DNS 服务器,和环境中的其他 DNS 服务器一起工作,它为 Kubernetes 服务提供 DNS 记录。
Kubernetes 启动的容器自动将此 DNS 服务器包含在其 DNS 搜索列表中。
Web 界面
- 集群 DNS 是一个 DNS 服务器,和环境中的其他 DNS 服务器一起工作,它为 Kubernetes 服务提供 DNS 记录。
容器资源监控
- 将关于容器的一些常见的时间序列度量值保存到一个集中的数据库中, 并提供浏览这些数据的界面。
集群层面日志
- 负责将容器的日志数据保存到一个集中的日志存储中, 这种集中日志存储提供搜索和浏览接口
参考
https://kubernetes.io/zh-cn