容器云发展及主要内容 1、云计算,交付标准(iaas--openstack) 国内:阿里云一华为云(振兴杯)百度云(私有云) 国外:AWS 2、平台即服务(PAAS) 例如:新浪云(号称免运维) 用户下单一>下单到sina运维,进行环境构建,平台级的运维 迭代:产生出来很多运维工具,例如ansible,这些运维工具可以帮我自动化创建一些环境但是,不同环境的要求不一样,需要考虑、解决各种环境匹配、兼容问题 docker统一了运行环境、发布方式、 同时,docker一》自动构建运行环境封装体-》docker成为这一代PAAS的运行环境标准 问题:若将容器集群化,要如何管理? 一》资源管理器/资源管理框架(管理工具): 早期是mesos(Apache基金会)早期只作为资源管理平台,开源、分布式的管理框架,后来被推特看上,做为基础平台,大规模盛行 2019年推特宣布不用mesos、而全部使用kubernetes mesos官方公布,可以在我的平台上管理k8s 但是k8s与底层虚拟化相性很简单,未必需要多一步使用mesos docker swarm :docker父公司的产品,他也是一种docker集群化管理的解决方案, 优势:轻量 但是相对于K8S而言,实现的功能还是比较少,例如k8s的 滚动更新、回滚,可以实现,但是很复杂,除此之外大规模集群的使用和管理还是很强大的 kubernetes稳定、适合生产、全面,成为了主要的解决方案》谷歌 kubernetes的名字来自希腊语,意思是“舵手”或“领航员",K8s是将8个字母"ubernete"替换为“8"的缩写。 mesos + zk+ marathon 》资源管理的架构 3、软件及服务(SAAS ) 直接使用成品(直接访问服务端) 小结: MESOS APACHE分布式资源管理框架2019-5 rwitter 》 Kubernetes Docker Swarm 2019-07阿里云宣布 Docker Swarm剔除Kubernetes Google 10年容器化基础架构一》borg架构(内部资源管理器)随着docker 流行,Borg 派出几个内部工程师,使用go语言以Borg系统设计思路设计了一款新的资源管理系统—》kubernetes ,并且开源贡献给了容器基金会—》当前的标准。 K8S的特性,来介绍一下K8S(资源管理器) 轻量级 一些解释性语言:例如Python/JavaScript/ Perl/Shell,效率较低,占用内存资源较多 使用go语言一》编译型语言,语言级别支持进程管理,不需要人为控制,所以以qo开发的资源消耗占用资源小 开源 自我修复(控制器控制pod,保证pod可以维持我们所期望的副本数量3) 在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。 对异常状态的容器进行重启或重建(先创建、再删除),目的是保证业务线不中断 弹性仲缩(自动) 手动弹性伸缩,当NG读、磁盘、内存的压力(单个pod)>808,修改replicasets :3->4更新一下nginx.yml Ym1-->阈值cpu使用率>808一》触发扩容pod(CPU使用上限,docker-cgroup k8s--->1、limit---> 2、configmap-配置文件)使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。 弹性一》人为只要指定规则,满足条件时,就会自动触发扩容或缩容的操作 伸缩》扩容和缩容(节点应用类型nginx) 自动部署和回滚 K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不会影响业务。 kubectl apply kubectl create + expose 服务发现()和负载均衡 [kube-proxy3种模式] userspaces iptables ipvs(默认) K8S为多个pod(容器)提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题使用IPVS(章文嵩)框架--->"替代"iptables 机密和配置管理(secret-》安全/认证加密性的数据->RBAC) 管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。 存储编排(静态、动态) 挂载外部存储系统,无论是来自本地存储,公有云(如Aws),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。 批处理 提供一次性任务(job),定时任务(crontab) ;满足批量数据处理和分析的场景 目的: K8S目标是为了让部署容器化应用、管理容器集群资源更加简单高效 小结: k8s特性 轻量级: 重点在于开发的语言(解释性语言go,系统资源消耗较少) 开源 自我修复一》控制器 @弹性仲缩》yml定义的阈值(cgroup:控制的1imit资源上限)和伸缩方式(水平) 自动部署、回滚》ym1定义的(部署方式list-watch机制,rollback回滚) 服务发现、负载均衡-》services +kube-proxy 机密和配置管理-》RBAC +configmap(配置中心) 存储编排一》静态+动态:NFSgfs等网络存储+本地存储+云存储(以上是静态),pv+pv动态G批处理》一次性任务和周期性任务 二、主要学习内容 介绍说明:发展Kubernetes 组件/框架 Kubernetes关键字含义 基础概念:什么是 Pod控制器类型K8S网络通讯模式 Kubernetes:构建K8S 集群三(四)种构建方式 minikube kubeadm 二进制(手工编译安装) kubesphere rancher k8s-disploy其他的第三方工具(开源/收费版工具)基于云: 阿里云:ACK 微软云 AKS 华为云 ces 资源清单:资源掌握资源清单的语法 ( yml)编写Pod ( yml) 掌握Pod 的生命周期 Pod控制器:掌握各种控制器的特点以及使用定义方式 服务发现:掌握SVC (service)原理及 其构建方式(service的yml ) 存储:掌握多种存储类型的特点并且能够在不同环境中选择合适的存储方案(有自己的理解,有状态服务和无状态服务) 调度器(Scheduler):掌握调度器原理(预选和优选)能够根据要求把Pod 定义到想要的节点运行(selector) 安全:集群的认证鉴权访问控制原理及其流程 kubernetes集群架构与组件 一、基本组件 1、Pod(最小的资源单位) 个pod会封装多个容器组成一个子节点的运行环境(最小单元,容器的数量2+) 最小部署单元 一组容器的集合(基础容器+初始化容器+(主应用容器+挂斗/副容器) PS:1,基础容器 维护整个Pod网络和存储空间 node节点中操作 启动一个实例时,k8s会自动启动一个基础容器 2、初始化容器(initcontainers) Init容器必须在应用程序容器启动之前运行完成,而应用程序容器是并行运行的,所以Init容器能够提供了种简单的阻塞或延迟应用容器的启动的方法。 Init容器与普通的容器非常像,除了以下两点 Init容器总是运行到成功完成为止 每个Init容器都必须在下一个Init容器启动之前成功完成 如果Pod的Init容器失败,k8s会不断地重启该Pod, 直到Init 容器成功为止。然而,如果Pod对应的重启策略( restartPolicy) 为Never, 它不会重新启动。 3、业务容器 (Maincontainer> 并行启动 一个Pod中的容器共享网络命名空间(基础容器提供的pause) Pod是短暂的 (叙述的是其生命周期) 面试题 1.你们Pod中跑几个容器:一般10-20个 2.pod中多个容器之间怎么通讯:localhost 3.相同node节点中pod之间怎么通讯]:docker 0 4.不同node节点pod之间怎么通讯:借助于cni插件,我们使用的是flannel calico cannel 5.flannel是如何转发数据:节点之间用udp,container之间先用vxlan封装再udp封装再udp封装再udp传输(读取etcd数据库获取路由链路+主机信息) 6.不同的K8S集群,Pod之间如何通讯: 7.不同节点直接pod通讯: 首先,定义两个节点主机APOD-A主机BPOD-B 1.POD-A首先会发送给docker0网桥 2.docker 0会转发给flanne10网桥 PS:详细话术docker0(网桥会被flanne10网桥以钩子函数的方式获取到转发信息) 3.flannel0会转发给flanneld (后台进程),flanned会到ETCD中查看ETCD维护的路由表条目/信息,确认往哪去发送 ETCD-路由表有哪些flanneld需要知道的信息 获取到pod-b所在的node节点一》主机B 获取到主机A如何到主机B,从哪个物理网卡通过(宿主机) 4.flanned会在转发给宿主机的物理网卡 5.物理网卡会以UDP的方式转发数据包 (数据包中除了主机A和主机B的源IP和目标IP之外,还会将POD-A和POD-B的源/目标IP封装在UDP协议中) 主机B接收到 1.首先解封装,发现源IP地址是我自己的(主机IP地址) 2.UDP转发过来,解封装之后,发现了封装在UDP内部的POD-IP(源/目标) 3.主机B的物理网卡就会发送给flanned进行处理 4.而flanned会查询ETCD中维护的路由表信息,发现是自己的pod(需要确认找的是哪个docker网桥) 5.flanned 会发送给自己的flannel0网桥,flannel网桥再发送给对应的docker(0)网桥 6.docker网桥(网关),会把这个数据包发送给对应的POD-B UDP封装 VXLAN封装方式一》资源消耗较少(基本上使用的是内核的态的封装方式) 你们一个node中跑多少pod]一》15-50合理(K8s集群3master 4-8个node)pod不仅仅是tomcat或者ng或者其他的应用服务还可以是services:L4pod形式表现的 ingress [nginx]:L7层的代理管理的是http流量,使用控制器管理一组pod资源来进行的 pod中的运行环境如何提供出来供给客户访问? pod如何通过网络交互,如何暴露出去 》管理pod的方法(控制器) 》服务发现如何实现(service) 基本概念:什么是Pod,控制器类型 pod:首先,最小组成单元,是一组容器的集合,应用容器跑在pod资源中的 2、资源清单(YML) : ①K8S中资源的概念 ②资源清单格式(资源清单/配置文件) : Yaml/语法 ③Pod生命周期() InitC Pod phase 容器探针---》liveness Probe 、readness Probe Pod hook 重启策略 容器探针你有没有了解: liveness Probe 、readnessProbe, 存活性探针和就绪性探针 K8S 重启策略,如何设置,有哪些重启策略,always 3、Pod控制器(维护Pod状态,期望值) 什么是控制器--》对不同的对象及其特性使用不同的方式控制管理一》 控制器说明: ReplicaSet 确保预期的Pod副本数量 Deployment无状态应用控制器(部署) StatefulSet有状态应用部署 DaemonSet 确保所有Node运行同一种Pod Job -次性任务 Cronjob 定时任务 ingress包含:nginx.Haproxy、traffic. istio. kong 控制器有哪些类型,可以举几个控制器来介绍一下是干嘛的么/或者直接问指定的几个控制器是做什么的] 更高级层次对象,部署和管理Pod 4、服务发现(8erv1ce同一个访问入口) Pod怎么对外暴露服务]1、通过service这个统一入口/定义的访问策略对外暴露服务 K8S内部的Pod 通讯是以一组私有地址进行通讯的,所以默认情况下无法直接为客户端(服务、用户)提供访问 可以通过Service服务发现,把我们内部的pod资源暴露给客户端访问(以暴露一个ip:端口的方式),让客户端可以通过这个IP:端口的形式访问到K8s内部的多个pod(通常意义上是一个应用的副本集)