初识Kubernetes的理论基础
?1.k8s的由来及其技术运用
k8s的简介?
? Kubernetes,词根源于希腊语的 舵手、飞行员。在国内又称k8s(因为k和s之间有8个字母,所以得名。“国内程序员的幽默”)。用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如 Docker)的集群,是一个生态极其丰富的容器编排框架工具。
K8S由google的Borg系统(博格系统,google内部使用的大规模容器编排工具)作为原型,后经GO语言延用Borg的思路重写并捐献给CNCF基金会开源。
云原生基金会(CNCF)于2015年12月成立,隶属于Linux基金会。CNCF孵化的第一个项目就是Kubernetes,随着容器的广泛使用,Kubernetes已经成为容器编排工具的事实标准。
?官网:
https://kubernetes.io
GitHub:
https://github.com/kubernetes/kubernetes
传统后端部署与k8s 的对比
?传统部署
?传统的后端部署办法:把程序包(包括可执行二进制文件、配置文件等)放到服务器上,接着运行启动脚本把程序跑起来,同时启动守护脚本定期检查程序运行状态、必要的话重新拉起程序。
此时一旦服务的请求量上来,已部署的服务响应不过来,传统的做法往往是,如果请求量、内存、CPU超过阈值做了告警,运维人员马上再加几台服务器,部署好服务之后,接入负载均衡来分担已有服务的压力。这样问题就出现了:从监控告警到部署服务,中间需要人力介入! 没有办法自动完成服务的部署、更新、卸载和扩容、缩容
k8s的部署?
? 上述传统后端部署的问题,就是k8s所要解决的问题。自动化运维管理容器化(Docker)程序。K8S是Google开源的容器集群管理系统,在Docker等容器技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。?
k8s的作用
k8s最主要的作用就是简单,高效的部署容器化的应用。
- 1.解决了docker的单机部署和无法集群化的特点
- 2.解决了随着容器数量的增加,对应增加的管理成本。
- 3.容器的高可用,提供了容器的自愈机制。
- 4.解决了容器没有预设模板以及无法快速,大规模部署。以及大规模的容器调度。
- 5.k8s提供了集中化配置管理的中心。
- 6.解决了容器的生命周期的管理工具。
- 7.提供了图形化工具对容器进行管理
k8s是基于开源的容器集群管理系统,在docker容器技术的基础之上。
为容器化应用提供部署,运行,资源调度,服务发现,动态伸缩等一系列完整的功能
k8s的特性
1.弹性伸缩:
- 可以基于命令,或者图形化界面,以及cpu的使用情况,自动的对部署的程序进行扩容和缩容。以最小的成本运行服务
2.自我修复:
- 如果出现节点故障时,可以自动重新启动失败的容器,替换和重新部署。
3.服务发现和负载均衡:
- k8s为多个容器提供一个统一的访问入口(内部地址和一个内部的dns名称),自动负载均衡关联的所有容器。
4.自动发布和回滚:
- k8s采用滚动的策略更新应用。如果更新过程中出现,可以根据回滚点来进行回滚。
5.集中化配置管理和密钥管理。
- k8s集群内各个组件都是要进行密钥对验证的。(k8s安全性还是不够,核心组件不建议部署。自定义应用可以部署)
6.存储编排:
- 1.可以自动化的把容器部署在节点上。
- 2.也可以通过命令行或者yml文件(自定义pod)实现指定节点部署。
- 3.也可以通过网络存储,NFS,GFS
7.任务进行批次处理。提供一次性的任务,定时任务,满足需要批量处理和分析的场景。
k8s的核心组件
K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责集群的调度、管理和运维,Slave 节点是集群中的运算工作负载节点。
在 K8S 中,主节点一般被称为 Master 节点,而从节点则被称为 Worker Node 节点,每个 Node 都会被 Master 分配一些工作负载。
Master 组件可以在群集中的任何计算机上运行,但建议 Master 节点占据一个独立的服务器。因为 Master 是整个集群的大脑,如果 Master 所在节点宕机或不可用,那么所有的控制命令都将失效。除了 Master,在 K8S 集群中的其他机器被称为 Worker Node 节点,当某个 Node 宕机时,其上的工作负载会被 Master 自动转移到其他节点上去。
?
k8s--master的核心组件
1.1.kuber-aplserver
k8s集群之中每个组件都要靠密钥对来进行验证,组件之间的通信aplserver。
API是应用接口服务,k8s的所有资源请求和调用操作都是kube-aplserver来完成。
所有对象的增,删,改,查和监听的操作都是kube-aplserver处理完之后交给etcd来进行。
apl-server是k8s所有请求的入口服务,apl-server接收k8s的所有请求(包括命令行和图形化界面),然后根据用户的具体请求通知对应的组件展示或者运行命令。
Apl-server相当于整个集群的大脑。
1.2.kube-controller-manager:
运行管理控制器。是k8s集群中处理常规任务的后台线程。是集群中所有资源对象的自动化控制中心。一个资源对应一个控制器,controller-manager负责管理这些控制器。
1.2.1.node controller(节点控制器):
- 负责节点的发现以及节点故障时的发现和响应。
1.2.2replication controller(副本控制器):
- 控制关联的pod副本数。可以随时扩缩容。
1.2.3.Endpoints controller(端点控制器),
- 监听service和对应pod的副本变化。端点就是服务暴露出的访问点。要访问这个服务,必须要知道他的endpoint。就是内部每个服务的ip地址+端口
1.2.4.service account和roken controllers(服务控制和令牌控制):
- namespace,为命名空间创建默认账户和API访问令牌。
1.2.5.resourcequota controller(资源控制器)
- 可以对命名空间进行限制,也可以对pod的资源进行控制。
1.2.6.namespace controller(命名空间控制器)
- 管理命名空间的生命周期。
1.2.7.service controller(服务节点控制器):
- k8s集群和外部主机的接口控制器
1.3.kube-scheduler:资源调度组件
根据调度算法为新创建的pod选择一个合适的node节点。
可以理解为k8s的所有node节点的调度器,部署和调度node。
- 预先策略:人工定制,指定的node节点上部署
- 优先策略:限制条件
根据调度算法选择一个合适的node,node的节点的资源情况,node的资源控制的情况等等,选一个资源最富裕,负载最小的node来部署。
2.k8s的配置存储中心----ETCD:
?etcd是k8s的存储服务中心
?etcd 是分布式键值存储系统,存储了 K8S 的关键配置和用户配置,K8S 中仅 API Server 才具备读写权限,其他组件必须通过 API Server 的接口才能读写数据。
3.k8s中node的组件
1.kubelet:node节点的监视器,
Node 节点的监视器,以及与 Master 节点的通讯器。Kubelet 是 Master 节点安插在 Node 节点上的“眼线”,它会定时向 API Server 汇报自己 Node 节点上运行的服务的状态,并接受来自 Master 节点的指示采取调整措施。
- kubelet会定时向APIserver汇报自己的node上的运行服务的状态,APIserver会把节点状态保存到etcd存储当中。
- 从 Master 节点获取自己节点上 Pod 的期望状态(比如运行什么容器、运行的副本数量、网络或者存储如何配置等), 直接跟容器引擎交互实现容器的生命周期管理,如果自己节点上 Pod 的状态与期望状态不一致,则调用对应的容器平台接口(即 docker 的接口)达到这个状态。
- 管理镜像和容器的清理工作,保证节点上镜像不会占满磁盘空间,退出的容器不会占用太多资源。
?
2.kube-proxy
实现每个节点上的pod网络代理。负责节点上的网络规划,实现四层负载工作。负载写入(ipatables(快淘汰))ipvs实现服务映射
3.docker:容器引擎,运行容器,负载本机的容器创建和管理
k8s创建pod时,kube-scheduler调度到节点上(node节点),节点上的监控器kubeelet只是docker启动特点的容器。
kubelet把容器的信息收集,发送给主节点。只需要在主节点发布指令,节点上的kubelet就会指示docker对容器拉取镜像,启动或者停止容器。
k8s的核心概念
Kubernetes 包含多种类型的资源对象:Pod、Label、Service、Replication Controller 等。
所有的资源对象都可以通过 Kubernetes 提供的 kubectl 工具进行增、删、改、查等操作,并将其保存在 etcd 中持久化存储。
Kubernets其实是一个高度自动化的资源控制系统,通过跟踪对比etcd存储里保存的资源期望状态与当前环境中的实际资源状态的差异,来实现自动控制和自动纠错等高级功能。
pod的理解
pod运行在节点上,是k8s当中创建或者部署的最小/最简单的基本单位,一个pod代表集群上正在运行的一个进程。
可以把 Pod 理解成豌豆荚,而同一 Pod 内的每个容器是一颗颗豌豆。一个 Pod 由一个或多个容器组成,Pod 中容器共享网络、存储和计算资源,在同一台 Docker 主机上运行。
k8s创建pod的流程
(1)用户通过客户端发送创建pod的请求到master节点上的apiserver
?(2)apiserver会先把相关的请求信息写入到etcd中,再找controller-manager
? ? ? ? ? 根据预设的资源模板创建pod清单
(3)然后controller-manager会通过apiserver去找scheduler
? ? ? ? ? 为新创建的pod选择最适合的Node节点
(4)scheduler会通过调度算法的预选策略和优选策略筛选出最适合的Node节点
(5)然后再通过apiserver找到对应的Node节点上的kubelet去创建和管理pod
(6)kubelet会直接跟容器引擎交互来管理容器的生命周期
(7)用户通过创建承载在kube-proxy上的service资源,写入相关的网络规则,
? ? ? ? ? ?实现对pod的服务发现和负载均衡
如上图所示,谁是pod,谁是容器呢?
http和nginx是pod
http和nginx所指向的一共6个都是容器。
pod控制器
Pod 控制器是 Pod 启动的一种模版,用来保证在K8S里启动的 Pod 应始终按照用户的预期运行(副本数、生命周期、健康状态检查等)。
??
K8S 内提供了众多的 Pod 控制器,常用的有以下几种:
- deployment:无状态应用部署,作用就是管理和控制pod,以及replcaset(运行几个容器)。管控他的运行状态
- replcaset:保证pod的副本数了,受控于deloyment。
在k8s中,部署服务,实际上就是pod,deloyment部署就是pod,replicaset的就是来定义pod的容器数量。
可以保证pod的不可重复性。在当前命名空间不能重复。不同命名空间名称可以重复。
官方推荐使用deployment进行服务部署。
- daemonset:确保所有节点运行同一类的pod。
- statefulset:有状态应用部署。
- job:可以在pod设置一次性任务,运行完即退出。
- cronjod:一直在运行的周期性任务。
service(可以理解为网关)
k8s集群当中,创建一个pod之后,都会给其中运行的容器分配一个集群内的ip地址,由于业务的变更,容器可能会发生变化,IP地址也会发生变化。service的作用就是提供整个pod对外统一的IP地址。
service就是一个网关(路由器),通过访问service就可以访问pod内部的容器集群。
service能实现负载均衡和代理---kube-proxy----来实现负载均衡
service是k8s微服务的核心,屏蔽了服务的细节,统一的对外暴露的端口,真正实现了”微服务“。
service的流量调度:userspace(用户空间,已经废弃),iptables(即将废弃)。ipvs(目前1.20都用)
label:标签
k8s的特色管理方式,分类管理资源对象。
NODE pod service
label标签可以自定义
label选择器:等于,不等于。使用定义的标签名
ingress(重点!!区别七层和四层)
k8s集群对外暴露提供访问的接口,属于应用层,七层代理,转发的是http请求,http/https。
service是四层转发,转发的是流量。
https://www.zzr.com:80------>ingress------>service-------pod--------容器
namespace
在k8s上可以通过namespace来实现资源隔离,项目隔离。
通过namespace可以把集群划分为多个资源部共享的虚拟机群组。
不同命名空间里面的资源名称可以重复的。
总结
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!