?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
?传统的后端部署办法:把程序包(包括可执行二进制文件、配置文件等)放到服务器上,接着运行启动脚本把程序跑起来,同时启动守护脚本定期检查程序运行状态、必要的话重新拉起程序。
此时一旦服务的请求量上来,已部署的服务响应不过来,传统的做法往往是,如果请求量、内存、CPU超过阈值做了告警,运维人员马上再加几台服务器,部署好服务之后,接入负载均衡来分担已有服务的压力。这样问题就出现了:从监控告警到部署服务,中间需要人力介入! 没有办法自动完成服务的部署、更新、卸载和扩容、缩容
? 上述传统后端部署的问题,就是k8s所要解决的问题。自动化运维管理容器化(Docker)程序。K8S是Google开源的容器集群管理系统,在Docker等容器技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。?
k8s最主要的作用就是简单,高效的部署容器化的应用。
k8s是基于开源的容器集群管理系统,在docker容器技术的基础之上。
为容器化应用提供部署,运行,资源调度,服务发现,动态伸缩等一系列完整的功能
k8s的核心组件
K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责集群的调度、管理和运维,Slave 节点是集群中的运算工作负载节点。
在 K8S 中,主节点一般被称为 Master 节点,而从节点则被称为 Worker Node 节点,每个 Node 都会被 Master 分配一些工作负载。
Master 组件可以在群集中的任何计算机上运行,但建议 Master 节点占据一个独立的服务器。因为 Master 是整个集群的大脑,如果 Master 所在节点宕机或不可用,那么所有的控制命令都将失效。除了 Master,在 K8S 集群中的其他机器被称为 Worker Node 节点,当某个 Node 宕机时,其上的工作负载会被 Master 自动转移到其他节点上去。
?
k8s集群之中每个组件都要靠密钥对来进行验证,组件之间的通信aplserver。
API是应用接口服务,k8s的所有资源请求和调用操作都是kube-aplserver来完成。
所有对象的增,删,改,查和监听的操作都是kube-aplserver处理完之后交给etcd来进行。
apl-server是k8s所有请求的入口服务,apl-server接收k8s的所有请求(包括命令行和图形化界面),然后根据用户的具体请求通知对应的组件展示或者运行命令。
Apl-server相当于整个集群的大脑。
运行管理控制器。是k8s集群中处理常规任务的后台线程。是集群中所有资源对象的自动化控制中心。一个资源对应一个控制器,controller-manager负责管理这些控制器。
根据调度算法为新创建的pod选择一个合适的node节点。
可以理解为k8s的所有node节点的调度器,部署和调度node。
根据调度算法选择一个合适的node,node的节点的资源情况,node的资源控制的情况等等,选一个资源最富裕,负载最小的node来部署。
?etcd是k8s的存储服务中心
?etcd 是分布式键值存储系统,存储了 K8S 的关键配置和用户配置,K8S 中仅 API Server 才具备读写权限,其他组件必须通过 API Server 的接口才能读写数据。
Node 节点的监视器,以及与 Master 节点的通讯器。Kubelet 是 Master 节点安插在 Node 节点上的“眼线”,它会定时向 API Server 汇报自己 Node 节点上运行的服务的状态,并接受来自 Master 节点的指示采取调整措施。
实现每个节点上的pod网络代理。负责节点上的网络规划,实现四层负载工作。负载写入(ipatables(快淘汰))ipvs实现服务映射
k8s创建pod时,kube-scheduler调度到节点上(node节点),节点上的监控器kubeelet只是docker启动特点的容器。
kubelet把容器的信息收集,发送给主节点。只需要在主节点发布指令,节点上的kubelet就会指示docker对容器拉取镜像,启动或者停止容器。
k8s的核心概念
Kubernetes 包含多种类型的资源对象:Pod、Label、Service、Replication Controller 等。
所有的资源对象都可以通过 Kubernetes 提供的 kubectl 工具进行增、删、改、查等操作,并将其保存在 etcd 中持久化存储。
Kubernets其实是一个高度自动化的资源控制系统,通过跟踪对比etcd存储里保存的资源期望状态与当前环境中的实际资源状态的差异,来实现自动控制和自动纠错等高级功能。
pod运行在节点上,是k8s当中创建或者部署的最小/最简单的基本单位,一个pod代表集群上正在运行的一个进程。
可以把 Pod 理解成豌豆荚,而同一 Pod 内的每个容器是一颗颗豌豆。一个 Pod 由一个或多个容器组成,Pod 中容器共享网络、存储和计算资源,在同一台 Docker 主机上运行。
(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的服务发现和负载均衡
http和nginx是pod
http和nginx所指向的一共6个都是容器。
Pod 控制器是 Pod 启动的一种模版,用来保证在K8S里启动的 Pod 应始终按照用户的预期运行(副本数、生命周期、健康状态检查等)。
??
K8S 内提供了众多的 Pod 控制器,常用的有以下几种:
在k8s中,部署服务,实际上就是pod,deloyment部署就是pod,replicaset的就是来定义pod的容器数量。
可以保证pod的不可重复性。在当前命名空间不能重复。不同命名空间名称可以重复。
官方推荐使用deployment进行服务部署。
k8s集群当中,创建一个pod之后,都会给其中运行的容器分配一个集群内的ip地址,由于业务的变更,容器可能会发生变化,IP地址也会发生变化。service的作用就是提供整个pod对外统一的IP地址。
service就是一个网关(路由器),通过访问service就可以访问pod内部的容器集群。
service能实现负载均衡和代理---kube-proxy----来实现负载均衡
service是k8s微服务的核心,屏蔽了服务的细节,统一的对外暴露的端口,真正实现了”微服务“。
service的流量调度:userspace(用户空间,已经废弃),iptables(即将废弃)。ipvs(目前1.20都用)
k8s的特色管理方式,分类管理资源对象。
NODE pod service
label标签可以自定义
label选择器:等于,不等于。使用定义的标签名
k8s集群对外暴露提供访问的接口,属于应用层,七层代理,转发的是http请求,http/https。
service是四层转发,转发的是流量。
https://www.zzr.com:80------>ingress------>service-------pod--------容器
在k8s上可以通过namespace来实现资源隔离,项目隔离。
通过namespace可以把集群划分为多个资源部共享的虚拟机群组。
不同命名空间里面的资源名称可以重复的。