k8s 初体验

K8S的特性,来介绍一下K8S(资源管理器)

① 轻量级 
一些解释性语言:例如Python/JavaScript / Perl /Shell,效率较低,占用内存资源较多
使用go语言编译型语言,语言级别支持进程管理,不需要人为控制,所以以go开发的资源消耗占用资源小
② 开源
③ 自我修复(控制器控制pod,保证pod可以维持我们所期望的副本数量3)在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
对异常状态的容器进行重启或重建(再创建、再删除),目的是保证业务线不中断
④ 弹性伸缩
手动弹性伸缩,当nginx读、磁盘、内存的压力(单个pod)>80%,修改replicasets:3->4 更新一下nginx
Yml 阈值 cpu使用率 > 80% 触发扩容pod (CPU使用上限,docker-cgroup k8s 1、limit  2、configmap-配置文件  )
使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
伸缩:扩容和缩容(节点 应用类型nginx)
弹性:人为只要指定规则,满足条件时,就会自动触发 扩容或缩容的操作
⑤ 自动部署和回滚
K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。
⑥ 服务发现()和负载均衡
K8S为多个pod(容器)提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
使用IPVS(章文嵩)框架“替代”iptables
kube-proxy 3种模式:①userspace、②iptables、③ipvs
⑦ 机密和配置管理(secret——》安全/认证加密性的数据 )
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。
⑧ 存储编排(静态、动态)
挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
⑨ 批处理
提供一次性任务(job),定时任务(crontab);满足批量数据处理和分析的场景

目的:

K8S 目标是为了让部署容器化应用、管理容器集群资源更加简单高效

基本组件

1、pod(最小的资源的单位)
一个pod 会封装多个容器组成一个子节点的运行环境 (最小单元,容器的数量2+)
最小部署单元
一组容器的集合(基础容器+ 主应用容器+挂斗/副容器)
一个Pod中的容器共享网络命名空间(基础容器提供的pause)
Pod是短暂的 (叙述的是其生命周期)

1、pod中跑几个容器:3个(pod中基础容器+运维容器+主应用)
2、pod中多个容器之间怎么通讯:localhost
3、相同node节点中pod之间怎么通讯:docker 0
4、不同node节点pod之间怎么通讯:借助于cni 插件,我们使用的是flannel

不同节点直接pod通讯

首先,定义两个节点 主机A POD-A  主机B  POD-B
① POD-A首先会发送给docker 0 网桥
② docker 0会转发给flannel0网桥 
PS:详细话术docker 0(网桥会被flannel 0 网桥以钩子函数的方式获取到转发信息)
③ flannel 0 会转发给flanneld (后台进程),flanned会到ETCD中查看ETCD维护的路由表条目/信息,确认往哪去发送
ETCD-路由表有哪些flanneld需要知道的信息
获取到pod-b所在的node节点 ——》主机B
获取到主机A如何到主机B,从哪个物理网卡通过 (宿主机)
④ flanned 会在转发给宿主机的物理网卡
⑤ 物理网卡会以UDP的方式转发数据包
(数据包中除了主机A和主机B的源IP和目标IP之外,还会将POD-A和POD-B的源/目标IP封装在UDP协议中)

主机B接收到

① 首先解封装,发现源IP地址是找自己的(主机IP地址)
② UDP 转发过来,解封装之后,发现了封装在UDP内部的 POD-IP(源/目标)
③ 主机B的物理网卡就会发送给flanned进行处理
④ 而flanned会查询ETCD中维护的路由表信息,发现是自己的pod(需要确认找的是哪个docker网桥)
⑤ flanned 会发送给自己的flannel0网桥,flannel网桥再发送给对应的docker (0)网桥
⑥ docker 网桥(网关),会把这个数据包发送给对应的POD-B

node中跑多少pod

pod不仅仅是tomcat或nginx或者其他的应用服务
还可以是services:L4pod形式表现的
ingress-nginx:L7层的代理 管理的是http流量,使用控制器管理一组pod资源来进行的

pod中的运行环境如何提供出来供给客户访问?

pod如何通过网络交互,如何暴露出去
管理pod的方法(控制器)
服务发现如何实现(service)

什么是Pod, 控制器类型

pod:首先,最小组成单元,是一组容器的集合,应用容器跑在pod资源中的

##1、资源清单:
① K8S中资源的概念
② 资源清单格式(资源清单/配置文件):Yaml/语法
③ Pod 生命周期()
InitC
Pod phase
容器探针---》 liveness Probe 、readnessProbe
Pod hook
重启策略
2、Pod 控制器(维护Pod状态,期望值)
什么是控制器 对不同的对象及其特性使用不同的方式控制管理
控制器说明: 
ReplicaSet  	确保预期的Pod副本数量
**Deployment  	无状态应用部署
**StatefulSet     有状态应用部署
DaemonSet  		确保所有Node运行同一种Pod
Job  			一次性任务
Cronjob         定时任务
有状态应用:有特殊状态:需要存储--->Apache,MySQL 
无状态应用:无特殊状态:不需要存储--->Tomcat,Nginx

Pod怎么对外暴露服务

通过service这个统一入口/定义的访问策略对外暴露服务
K8S内部的Pod 通讯是以一组私有地址进行通讯的,所以默认情况下无法直接为客户端(服务、用户)提供访问
可以通过Service服务发现,把我们内部的pod资源暴露给客户端访问(以暴露一个ip:端口的方式),让客户端可以通过这个IP:端口的形式访问到K8S内部的多个pod(通常意义上是一个应用的副本集)

存储

服务分类:
① 无状态服务:LVS 
服务不依赖自身的状态,实例的状态数据可以维护在内存中。
任何一个请求都可以被任意一个实例处理。不存储状态数据,实例可以水平拓展,通过负载均衡将请求分发到各个节点。在一个封闭的系统中,只存在一个数据闭环。通常存在于单体架构的集群中。
② 有状态服务:例如数据库(需要持久化)
服务本身依赖或者存在局部的状态数据,这些数据需要自身持久化或者可以通过其他节点恢复。一个请求只能被某个节点(或者同等状态下的节点)处理。存储状态数据,实例的拓展需要整个系统参与状态的迁移。
在一个封闭的系统中,存在多个数据闭环,需要考虑这些闭环的数据一致性问题。通常存在于分布式架构中。

简化:

无状态服务:就是没有特殊状态的服务,各个请求对于服务器来说统一无差别处理,请求自身携带了所有服务端所需要的所有参数(服务端自身不存储跟请求相关的任何数据,不包括数据库存储信息。
有状态服务:与之相反,有状态服务在服务端保留之前请求的信息,用以处理当前请求,比如session等

简化2

有状态:需要持久化,多次请求之间需要共享一些信息
无状态:一次性,不需要持久化,每次请求都是一条新的数据

对于 docker 来说,更适合应用无状态服务,而kubernetes,提供了一种解决方案

多种存储类型:
configmap(配置管理中心),主要存储配置文件
Secret:用户密码、需要加密的文件
volume:基本数据(网页文件)
⭐⭐PV,PVC:动态创建过程

K8S存储类型,知道哪些,你们的配置文件放哪

configmap
k8s 期望的是 所有应用均可跑在POD里面
虚拟化——》不适合跑极度吃资源的(对于资源的使用要求特别高的)

调度器的使用方面,如何指定节点调度,调度器的工作流程是什么?

调度器(Scheduler)
K8S会自动完成把一个新的pod 调度到对应的节点(预选/优选算法)
对于生产环境上,我们往往会需要将pod创建的过程(比如创建到的节点位置)进行管理,
例如:
  指定节点位置创建Pod(指定调度)
  将不同的Pod创建在一个节点上(亲和)
  将不同的Pod 创建在不同的节点上(反亲和)
  根据自己的需要,对pod进行节点组装等

⭐⭐Label : 标签,附加到某个资源上,用于关联对象、查询和筛选label

创建一个POD 
1、编写pod yml文件(nginx资源怎么跑,用什么环境变量,需不需要资源限制,要调度到哪个节点) label:nginx 
2、把pod 暴露出去,Service——》通过yml文件定义 label:nginx 
通过同一个label标签,进行关联,组合在一起

你可能感兴趣的:(docker,k8s,初体验)