一、Kubernetes特性1、服务发现和负载均衡kubernetes可以使用DNS名称或自己的IP地址来暴露容器,CoreDNS为系统内置了服务发现功能,它为每个Service配置DNS名称,并允许集群内的客户端直接使用此名称发出访问请求,而Service则通过iptables或ipvs内建了负载均衡机制。如果进入容器的流量很大,可以通过负载均衡并分配网络流量,从而使部署稳定。2、存储编排允许你自动挂载你选择的存储系统,可以是本地存储,云存储或网络存储系统(NFS,Ceph,Cinder)。3、自动部署和回滚你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。4、自动完成装箱计算你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。5、自我修复Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。支持容器故障后自动重启、节点故障后重新调度容器,以及其他可用节点,健康状态检查失败后关闭容器并重新创建。6、密钥和配置管理Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。ConfigMap实现了配置数据与Docker镜像解耦,需要时,仅对配置做出变更而无需重新构建Docker镜像,这为开发部署提供了很大的灵活性。对于一些敏感数据,可用使用Secret对象为其解耦,即便利了应用的快速开发和交付,又提供了一定程度上的安全保障。二、Kubernetes架构
注:图片来自网络
Kubernetes是一个容器编排平台,它使用共享网络将多个主机构成集群。集群由两大部分组成:master节点和worker节点,master节点负责管理整个集群,worker节点接受请求并以pod形式运行工作负载。
master是集群的中枢大脑,负责为客户端提供API调用,确保各资源对象不断接近用户期望的状态,以最优的方式调度Pod到指定的worker节点,以及编排其他组件之间的通信等任务。它是客户端访问集群的唯一入口。
worker节点负责接受来自master节点下发的指令并相应创建或销毁Pod对象,以及路由,流量转发等任务。
Kubernetes是构建在底层主机集群之上的“云原生应用操作系统”,而容器是应用在该“操作系统”上的进程。
组件说明:一、控制平面组件(master)1、Kube-apiserver它是kubernetes集群的访问入口,所有的访问请求都需要经过apiserver才能进入集群内部,相当于kubernetes的前端。当我们使用kubectl管理集群时,实际上是通过REST API与API服务器进行通信。2、kube-scheduler它是集群的调度器,给新创建的Pod,未指定运行节点的Pod,根据调度策略来给Pod寻找适合的运行节点。调度时会考虑nodeSelector,podAffinty,taints和tolaration,亲和性和反亲和性等因素。当我们创建一个 pod 并将其提交到 API 服务器时,调度器会自动获取 pod,根据可用资源和调度规则评估节点,并将 pod 分配给适当的节点。3、etcd它是一个键值对存储k8s状态的数据库,相当于后端数据库,记录集群的配置数据和资源的期望状态。还引入的监听机制(watch),当etcd中的键值发生变化,会通知到API Server,并由其通过watch API向客户端输出,各组件就形成了高效协同。Kube-API 服务器使用 etcd 的观察功能来跟踪对象状态的更改。它是控制平面中的唯一有状态组件。4、kube-controller-manager它是集群的控制器,负责控制器进程。运行着负责维护集群的期望状态和管理系统不同方面的各种控制器。每个控制器关注于集群管理的特定领域,自动化任务,确保资源的实际状态与期望状态相匹配。Kubernetes 提供了驱动 Node、Pod 、 Service、Endpoint、ServiceAccount 和 deployment等数十种类型对象的控制器。二、worker节点组件1、kubeletkubelet是kubernetes控制平面和节点上运行的容器之间的关键桥梁,负责管理容器的生命周期,定时向控制平面报告Pod状态,确保集群的期望状态得以实现和维护。kubelet 充当每个节点上的代理,将节点的状态和容器的健康状况报告给 Kubernetes 控制平面。,但不会管理不由Kubernetes创建的Pod。kubelet不以容器方式运行,而是使用systemd管理的守护进程。2、kube-proxy它是集群上的网络代理,主要管理Pod和Service之间的网络通信。它能够为Service资源对象生成iptables或ipvs规则,从而捕获访问当前Service的Cluster IP的流量并将其转发到正确的后端Pod对象。kube-proxy为具有多个副本或实例的服务实施负载均衡。它将传入请求分发给与服务的选择条件相匹配的可用 pod。3、容器运行时容器运行时环境负责根据pod规范创建、启动、停止和管理容器。它根据 pod 定义中指定的镜像引用从容器仓库拉去容器镜像,运行时环境还会监视容器的健康状况,并可以自动重启崩溃或变得不健康的容器。一些常用的 Kubernetes 容器运行时包括 Docker、containerd、CRI-O、rkt。