kubernetes是什么?
2014年,Google以Borg为基础,开源了kubernetes,简称k8s,一个当前最火的容器集群管理系统就此诞生。
kubernetes三个核心功能
Kubernetes - 调度
kubernetes可以将容器放入集群中进行调度,比如有一个容器,需要2C2G的资源,kubernetes就会将这个容器自动的调度到集群空闲或者有足够资源的节点上
Kubernetes - 自动恢复
kubernetes会对集群内的宿主机进行状态检查,如出现故障,kubernetes会把运行在失败节点上的容器进行自动迁移,迁移到健康的资源节点上面
Kubernetes - 水平伸缩
kubernetes有应用负载检查的能力,可以检测业务上所承担的负载,如果一个业务响应时长过高,或者负载很高,可以对该业务进行扩容
kubernetes特性
自我修复
在节点发生故障时,重启失败的容器,保证预期的副本数,并确保优雅上下线(容器启动中时不对外提供服务)
弹性伸缩
根据一些指标(CPU、内存、负载等)配置自动扩容和缩容应用容器,保证在不同业务压力下的集群规模
自动部署和回滚
k8s默认先部署新的容器,部署完成后,再替换老的容器,如果发布过程中发生故障,则回滚操作
服务发现和负载均衡
k8s为多个容器提供统一入口(内部ip地址和一个dns名称),并负载关联所有容器,使得用户无需考虑容器ip地址
机密和配置管理
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性,并可以将常用的配置存储在k8s中,方便程序使用
存储编排
挂载外部存储系统,无论来自本地存储、公有云(如oss)、还是网络存储,都可以作为集群资源的一部分使用,极大的提高存储使用的灵活性
定时任务
提供一次性任务、定时任务,类似Linux服务器的crontab
kubernetes架构
kubernetes是一个比较典型的二层架构, Master作为中央的管控节点,所有的UI、CLI、Node节点跟Master通信。UI CLI把想要的命令发给Master,Master将命令下发给Node节点进行最终的执行
kubernetes中所有的组件都会和API Server连接,组件与组件之间,一般不进行独立的连接,都依赖于API Server进行消息的传送
官网参考:https://kubernetes.io/docs/concepts/overview/components/
Master组件
Master是集群的控制平台
- master组件负责集群中的全局决策(如调度)
- master组件探测并响应集群事件(当 Deployment 的实际 Pod 副本数未达到 replicas 字段的规定时,启动一个新的 Pod)
Master组件可以运行在集群中的任何机器上,但为了简洁,通常会运行所有的master组件,且不在此机器上运行容器
kube-apiserver
提供kubernetes的api,可以水平扩展以提高性能和高可用,kubctl等管理工具就是通过apiserver实现对kubernetes的管理
etcd
分布式高可用的键值对存储组件,API server中所需要的元信息都被放置在etcd,通过etcd保障kubernetes组件的高可用
kube-scheduler
资源调度组件,监控所有新创建尚未分配到节点上的Pod,并且自动为Pod选择一个合适的节点去运行
调度的因素包括:
- 单个或多个pod的资源请求
- 硬件、软件、策略的限制
- 亲和性和反亲和性规范(affinity and anti-affinity specifications)
- 数据本地化要求
- 工作负载间相互作用
kube-controller-manager
控制器进程组件,逻辑上来说,每个控制器是一个独立的进程,但为了降低复杂度,它们都被编译成一个二进制文件并在单个进程中运行
这些组件包括:
- 节点(Node)控制器:监听所有节点停机事件并作出响应
- 副本(Replication)控制器:维护集群中的副本控制器对象所期望的Pod副本数
- 端点(Endpoints)控制器:为端点对象(joins Services & Pods)赋值
- Service Account & Token控制器: 负责为新的名称空间创建 default Service Account 以及 API Access Token
cloud-controller-manager
该组件运行了与具体云基础设施供应商互动的控制器,通过 cloud-controller-manager,Kubernetes可以更好地与云供应商结合,例如,在阿里云的 Kubernetes 在云控制台界面上轻松点击鼠标,即可完成 Kubernetes 集群的创建和管理
Node组件
Node是真正运行业务负载的,以Pod的方式运行,一个Pod中运行一个或者多个容器
Node并不会和User进行直接的通信,它只会和Master通信
kubelet
Kubelet是真正去运行pod的组件,是Node上最为关键的组件,它通过apiserver接受到Pod运行的状态,然后提交到最底层的四个组件(Container Runtime、Storage Plugin、Network Plugin、Kube-proxy),创建容器所需要的运行环境,将容器运行起来
主要包括:
- 创建容器
- 下载secret
- Pod挂载数据卷
- 获取节点和容器状态
注意:kubelet只管理Kubernetes创建的容器
kube-proxy
Kube-proxy完成service组网,为Node节点上实现Pod网络代理,运行在集群中的每一个节点上,维护网络规则和实现四层负载均衡,是实现 Kubernetes Service 概念的重要部分
kube-proxy在节点上维护网络规则,使集群内、集群外正确地与 Pod 进行网络通信。如果操作系统中存在 packet filtering layer,kube-proxy 将使用这一特性(iptables代理模式),否则,kube-proxy将自行转发网络请求(User space代理模式
容器运行引擎
容器引擎负责运行容器。Kubernetes支持多种容器引擎:Docker、containerd、cri-o、rktlet 以及任何实现了 Kubernetes容器引擎接口的容器引擎
Kubernetes 核心概念
核心概念 - Pod
一个逻辑单位,多个容器的组合,kubernetes的原子调度单位
Google工程师们发现,在Borg项目部署的应用,往往都存在着类似于“进程和进程组”的关系,更具体的说,就是这些应用之间有着密切的协作关系,使得它们必须部署在同一台机器上并且共享某些信息,因此每个容器相当于一个进程,Pod相当于进程组,使得这些容器可以更高的协作
- 最小的调度以及资源单位
- 由一个或者多个容器组成
- 定义容器运行的方式(Command、环境变量等)
- 提供给容器共享的运行环境(网络、进程空间)
- pod与pod之间是互相隔离的
- Pod共享网络和存储
- Pod是短暂的(随着服务停止,Pod也将销毁)
核心概念 - Volume
用于管理kuberntes中的存储
- 声明在Pod中的容器可访问的文件目录
- 可以被挂载在Pod中一个(或者多个)容器的指定路径下
- 支持多种后端存储的抽象(本地存储、分布式存储、云存储)
Pod - > Volume -> Remote Block Device
核心概念 - Deployment
这是一个在Pod之上的抽象概念,比如一组Pod构成的一个应用,pod是组成Deployment最小的单元
- 定义一组Pod的副本数目、版本等
- 通过控制器(Controller)维持Pod的数目(自动恢复失败的Pod)
- 通过控制器以指定的策略控制版本(滚动升级、重新生成、回滚等)
核心概念 - Service
其实就是一个VIP提供给外部访问
- 提供访问一个或多个Pod实例的稳定访问地址
- 支持多种访问方式实现(ClusterIP、NodePort、LoadBalancer)
核心概念 - Namespaces
- 一个集群内部的逻辑隔离机制(鉴权、资源额度)
- 每个资源都属于一个Namespace
- 同一个Namespace中的资源命名唯一
- 不同Namespace中的资源可重名
参考
https://kubernetes.io/zh/docs...
https://kuboard.cn/learning/