k8s初识kubernebets
Posted 遙遙背影暖暖流星
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s初识kubernebets相关的知识,希望对你有一定的参考价值。
前言:
当docker集群到达一定规模时,需要docker管理工具,有以下几种:
swarm是docker官方的集群管理工具
Mesos+马拉松管理
kubernetes 占用当前市场78% 云原生环境 CKA认证(主流)
kubernetes就是对pod的资源管理
中间涉及到知识点:
linux
docker基本管理
ssl证书工作原理
负载均衡4/7原理
集群分布式概念
DNS域名解析原理
网络协议
1、kubernetes是什么
2、kubernetes特性
3、kubernetes集群架构与组件
4、kubernetes核心概念
5、负载均衡,kube-proxy的三种模式
usersproxy
iptables
ipvs(默认)
一、kubernetes的概述
1、简介
kubernetes是google在2014年开源的一个容器集群管理系统,kubernetes简称k8s
kubernetes用于对容器化的应用程序的部署,扩展和管理
k8s提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能
k8s的目标是让部署容器化应用简单高效
官方网站:http://www.kubernetes.io
备注:docker的默认容器编排工具是compose
资源调度:可以手动指定,也可以根据算法自动指定
部署管理:用到中间的核心组件 api server,它是k8s管理的唯一入口
2、K8S的特性
2.1 自我修复
在节点故障时可以删除失效容器,重新创建新的容器,替换和重新部署,保证预期的副本数量,kill掉健康检查失败的容器,并且在容器未准备好之前不会处理客户端情况,确保线上服务不会中断
2.2 弹性伸缩
使用命令、UI或者k8s基于cpu使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性,业务低峰时回收资源,以最小成本运行服务
2.3 自动部署和回滚
k8s采用滚动更新策略更新应用,一次更新一个pod,而不是同时删除所有pod,如果更新过程中出现问题,将回滚恢复,确保升级不影响业务
(模式:list-watch机制》rollbake回滚)
2.4 服务发现和负载均衡
k8s为多个容器提供一个统一访问入口(内部IP地址和一个dns名称)并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题
2.5 机密和配置管理
管理机密数据和应用程序配置,而不需要把敏感数据暴露在径向力,提高敏感数据安全性,并可以将一些常用的配置存储在k8s中,方便应用程序调用
( secret——》安全/认证加密性的数据—----->RBAC)
2.6 存储编排
挂载外部存储系统,无论时来自本地存储、公有云(aws)、还是网络存储(nfs、GFS、ceph),都作为集群资源的一部分使用,极大提高存储使用灵活性
2.7 批处理
提供一次性任务,定时任务:满足批量数据处理和分析的场景
总结:
k8s 特性
1、轻量级:重点在于开发的语言(解释性语言go,系统资源消耗较少)
2、开源
3、自我修复——》控制器
4、弹性伸缩—》yml定义的阙值(cgroups控制的limit资源上限)和伸缩方式(水平)
5、自动部署、回滚—》yml定义的(部署方式list-watch机制,rollback回滚)
6、服务发现、负载均衡——》services +kube-proxy
机密和配置管理——》RBAC + configmap(配置中心)
7、存储编排—》静态+动态:NFs gfs等网络存储+本地存储+云存储
二、k8s集群架构与组件
1、master节点组件
①kube-apiserver
Kubernetes API,调度、统筹k8s集群,各组件协调者,以RESTful API提供接口服务
所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给 Etcd存储,从而隔离其他组件与etcd直接交互
② kube-controller-manager(控制器管理中心-定义资源类型)
处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager 就是负责管理这些控制器的。
③ kube-scheduler:集群调度器;通过调度算法策略决定最终任务在哪个node节点上
根据调度算法(预选/优选的策略)为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。
④ etcd
分布式键值存储系统(特性:服务自动发现)。用于保存集群状态数据,比如Pod、Service等对象信息
⑤ AUTH :认证模块
K8S 内部支持使用RBAC认证的方式进行认证
2、node节点组件
①Kubelet
-运行在Node节点上的Agent
-处理Master节点下发到本节点的任务,管理Pod和其中的容器,定期向Master汇报节点资源使用情况
②Kube-Proxy
-运行在Node节点上的Agent
-实现Service的抽象,为一组Pod抽象的服务( Service)提供统一接口并提供负载均衡功能
(四层) ————》对于七层的负载,k8s官方提供了一种解决方案————》ingress-nginx
在Node节点上实现Pod网络代理,维护网络规则、pod之间通信和四层负载均衡工作
③pod
- Docker
kube-scheduler
主要的控制器(资源)说明:
①:ReplicaSet(rc) 确保预期的Pod副本数量;无法独立存在,需要以来已deployment挥着statefulset
②:Deployment 无状态应用部署
③:StatefulSet 有状态应用部署;指的就是mysql
④:DaemonSet 确保所有Node运行同一种Pod;无须借助于replicaset
⑤:Job 一次性任务
⑥:Cronjob 定时任务
⑦:HPA 元数据型资源;弹性伸缩(Pod水平扩展)
pod的创建过程
1、客户端提交创建请求,可以通过API Server的Restful API,也可以使用kubectl命令行工具。支持的数据类型包括JSON和YAML。
2、API Server处理用户请求,存储Pod数据到etcd。
3、调度器通过API Server查看未绑定的Pod。尝试为Pod分配主机。
4、scheduler调度预选:调度器用一组规则过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉。
5、scheduler调度优选:对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把容一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等。
6、选择主机:选择打分最高的主机,进行binding操作,结果存储到etcd中。
7、kubelet根据调度结果执行Pod创建操作
一、pod资源对象
pod资源对象是一种集合了一到多个应用容器、存储资源、专用IP及支撑容器运行的其他选项的逻辑组件。各pod之间可使用其IP地址直接通信,无论pod运行于集群内的任何一个节点上,这些pod对象都像是运行于同一局域网中的多个主机。
pod对象中的各进程运行于彼此隔离的容器中,并于各容器间共享两种关键资源:网络和存储卷。
1、网络:每个pod对象都会被分配一个集群内专用的IP地址,也称为pod IP,同一pod内部的所有容器共享pod对象的network和uts名称空间,其中包括主机名、IP地址和端口等。因此,这些容器间的通信可基于本地回环接口lo进行,而pod外的其他组件的通信则需要使用service资源对象的cluster IP及其相应的端口完成。
2、存储卷:用户可以为pod对象配置一组“存储卷”资源,这些资源可以共享给内部的所有容器使用,从而完成容器间数据的共享。存储卷还可以确保在容器终止后被重启,甚至是被删除后也能确保数据不会丢失,从而保证了生命周期内的pod对象数据的持久化存储。
一个pod对象代表某个应用程序的一个特定实例,如果需要扩展应用程序,则意味着为此应用程序同时创建多个pod实例,每个实例均代表应用程序的一个运行的副本。这些副本化的pod对象的创建和管理通常由控制器的对象实现。
创建pod时,还可以使用pod preset对象为pod注入特定的信息,如configmap、secret、存储卷、卷挂载和环境变量等。有了pod preset对象,pod模板的创建者就无需为每个模板显式提供所有信息,因此,也就无须事先了解需要配置的每个应用的细节即可完成模板定义。
基于期望的目标状态和各节点的资源可用性,master会将pod对象调度至某选定的工作节点运行,工作节点于指向的镜像仓库下载镜像,并于本地的容器运行时环境中启动容器。master会将整个集群的状态保存于etcd中,并通过apiserver共享给集群的各组件及客户端。
二、controller
k8s集群的设计中,pod是由生命周期的对象。pod对象本身并不具有自愈功能,若是因为工作节点甚至是调度器自身导致了运行失败,那么它将会被删除;同样,资源耗尽或节点故障导致的回收操作也会删除相关的pod对象。k8s使用控制器实现对一次性的pod对象的管理操作。控制器本身也是一种资源类型,有着多种实现,其中与工作负载相关的实现如replication controller(控制副本级数量)、deployment(支持无状态应用,滚动升级)、statefulset(有状态应用)、daemonset、和jobs等,也可统称为pod控制器。
pod控制器的定义通常由期望的副本数量、pod模板和标签选择器组成。pod控制器会根据标签选择器对pod对象的标签进行匹配检查,所有满足条件的pod对象都将受控于当前控制器并计入其副本总数,并确保此数目能够精确反映期望的副本数。
k8s集群中的每个节点都运行这cadvisor以收集容器及节点的cpu、内存、及磁盘资源的利用率指标数据,这些统计数据由heapster聚合后可通过apiserver访问。
三、service
service资源被用于在被访问的pod对象中添加一个有着固定IP地址的中间层,客户端向此地址发起访问请求后由相关的service资源调度并代理至后端的pod对象。
service是微服务的一种实现,事实上它是一种抽象:通过规则定义出由多个pod对象组合而成的逻辑集合,并附带访问这组pod对象的策略。service对象挑选关联pod对象的方式同控制器一样,都是要基于label selector进行定义。
serviceIP是一种虚拟IP,也成为cluster IP,它专用于集群内通信,通常使用专用的地址段,各service对象的IP地址在此范围内由系统动态分配。集群内的pod对象可直接请求此类的cluster IP,但集群网络属于私有私有网络地址,它们仅可在集群内部可达。
将集群外部的访问流量引入集群内部的常用方法是通过节点网络进行,实现方法是通过工作节点的IP地址和某端口(nodeport)接入请求并将其代理至相应的service对象的clusterIP上的服务端口,而后由service对象将请求代理至后端的pod对象的podIP及应用程序监听的端口。
事实上,nodeport会部署于集群中的每一个节点,这就意味着,集群外部的客户端通过任何一个工作节点的IP地址来访问定义好的nodeport都可以到达相应的service对象。如果存在集群外部的一个负载均衡器,即可将用户请求负载均衡至集群中的部分或所有节点,这是一种称为“loadbalancer”类型的service,它通常是由cloud provider自动创建并提供的软件负载均衡器。也可以是手工配置的诸如F5一类的硬件设备。
service主要有三种常用类型:第一种是仅用于集群内部通信的cluster IP类型;第二种是接入集群外部请求的node port类型,它工作于每个节点的主机IP之上;第三种是loadbalancer类型,它可以把外部请求负载均衡至多个node的主机IP的nodeport之上。此三种类型中,每一种都以前一种为基础才能实现,而且第三种类型中的loadbalancer需要协同集群外部的组件才能实现,并且此外部组件并不接收k8s管理。
以上是关于k8s初识kubernebets的主要内容,如果未能解决你的问题,请参考以下文章
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段