什么是k8s,解决什么问题
纯容器的部署问题
纯docker的运行模式,是一个docker主机,单独管理一堆容器应用,但是发现数量多了之后,配置复杂之后,难以维护管理多个容器,并且跨主机下的容器集群,更是维护复杂。
- 业务容器数量庞大,哪些容器部署在哪些节点,使用了哪些端口,如何记录、管理、需要登录到每台机器去管理?
- 跨主机通信,多个机器中的容器之间相互调用如何做,iptables规则手动维护?
- 跨主机容器间相互调用,配置如何写?写死固定ip+端口?
- 如何实现业务高可用?多个容器对外提供服务如何实现负载均衡?
- 容器的业务中断了,如何可以感知到,感知到以后,如何自动启动新的容器?
- 如何实现滚动升级保证业务的连续性?
K8S是什么
Kubernetes是用于自动部署,扩缩和管理容器化应用程序的开源系统
它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现
Kubernetes 源自Google15年生产环境的运维经验,
Google每周运行数十亿个容器,
本质上就是一个工具,一个平台,维护docker容器的
部署时代架构
v1 物理机
v2 虚拟化,vmware商业版为代表,出现开源版的openstack
v3 容器化部署,容器化大规模应用后,难以维护,出现了
K8S
为什么会出现k8s
容器是打包和运行应用程序的好方式
在生产环境下,需要管理运行着应用程序的容器,并确保服务不会下线
例如,如果一个容器发生故障,需要启动另一个容器。
如果这个过程,是自动创建容器,自动生成新容器,保证业务高可用,k8s就是实现容器自动化管理的一个框架系统。
K8S是一个平台框架
k8s提供了很多的功能,简化了对容器的部署管理
基于容器对应用的发布管理、更新、升级、降级
负载均衡、服务发现
跨机器、跨地区的网络模式
自动扩缩容功能
针对如nginx无状态服务的运行组件,如mysql等有状态服务的运行组件
支持丰富的插件
k8s并不是包括所有,它本身只有自己的一些组件,而其他功能,如消息队列,数据库,存储都需要额外安装在k8s上。
K8S是一个平台框架
本质:大而全的平台,组件很多,提供了很多功能组件,目的是为了让你更好的去管理容器。
k8s核心概念组件
提供了很多组件,方便从各个角度,更好的去维护,管理容器。
- 容器运行高可用,数量保障,版本升级、扩容、缩容
- 容器之间的网络关系
- 容器之间的数据共享关系
- 容器内的配置文件加密
- 以上都是k8s提供的各个组件的作用
如何设计一个容器管理平台
1、集群架构,至少2台机器,master主节点,node工作节点
master根据维护者,写的yaml,对容器的运行描述,创建具体的容器,到node工作节点
2、该容器管理平台,应该自动识别,目标节点的,状态,选择最合适的节点部署新容器
3、容器管理平台,能实现确保,应用的副本数是健康,正确的,后端的容器数量
4、容器内的负载均衡,反向代理,如何配置(k8s的组件就可以实现)
K8S核心组件
安装启动好之后,至少看到的几个组件以及后续,部署你的应用,再用其他的组件。
1、etcd保存了整个集群的状态,分布式高性能数据库。
2、api-server提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。
K8S作为一个高级的容器管理平台,对每一个发来的请求,都要进行校验,该请求是否被集群允许,删除集群中的一个容器组,是否被允许,k8s默认运行后,6个组件,每一个组件的请求,与相应的,都要经过这个api-server组件校验。
3、controller manager负责维护集群的状态、比如故障检测、自动扩展、滚动更新等
具体部署容器,到目标节点,使用的控制器,容器负载均衡部署,Deployment控制器就是之一。
Replication Controller
Node controller
ResourceQuota Controller
Namespace Controller
ServiceAccount Controller
Token Controller
Service Controller
Endpoints Controller
4、scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的Node机器上
scheduler 决定容器部署到哪个节点上的组件。
5、kubelet负责维护容器的生命周期,同时也负责Volume 和网络 的管理
拉去镜像,运行容器
运行在每一个node节点上的代理软件:
pod管理
容器健康检查
容器监控
Container runtime 负责镜像管理及Pod和容器的真正运行
kube-proxy负责为Service提供cluster内部的服务发现和负载均衡,主要提供iptables、ipvs规则
6、kubecli 命令行接口,用于对Kubernetes集群运行命令
在master节点上敲打的命令,就docker命令一样,客户端命令和api-server交互
以上为六大组件
组件通信架构图
k8s里面不再直接去操作容器,而是k8s提供了一个组件,叫pod,封装了一组容器,容器都是被pod管理,根容器,创建隔绝的网络,文件系统,用户,进程空间。
k8s集群是被一组称为Node的节点机器组成,这些节点上运行k8s管理的容器进程
具体Node节点机器上运行的容器被一个叫作Pod的组件管理
在安装完毕k8s后,就得到一个集群环境
集群是指有一堆Node节点机器,并且这些节点运行Pod,也就是容器了
k8s组件工作流程图
pod是如何被创建到目标机器的,原理流程
创建一个无状态的nginx应用,部署一个pod(nginx)即可。
1、在master节点,写yaml描述你对容器的运行要求,创建pod的要求,
2、使用kubectl命令去创建,应用这个资源描述文件,才设计k8s组件交互发出请求,我要创建一个pod去运行nginx了,请求发给谁?
kubectl create -f install-nginx.yml
api-server
3、验证Kubectl命令发来的请求是否被允许利用本地https证书,直接写入Kubectl配置文件的该请求被允许后,才会执行。
4、api-server将nginx-pod创建的信息,记录到etcd数据库中(数据库记录了一些信息,nginx镜像版本,容器名,是否要端口暴漏)
5、api-server会通知下一个组件,调度器组件,scheduler准备pod调度
6、scheduler调度,会去etcd里面查询,部署的pod信息到底是如何,scheduler,调度,判定出一个合适的node节点去部署pod(选择好了具体的机器,还未执行)。
7、scheduler调度器,会告诉api-server自己决定pod要部署到哪台node节点上
8、api-server会将这个信息,再写入etcd中,数据更新了(nginx本身的容器信息+绑定关系,部署到哪个机器上)
9、此时api-server会通知远程具体机器,如k8s-node2上的工作进程kubelet,去读取etcd里面的信息,根据这些信息,创建nginx镜像,以及创建POD(nginx容器)
Node概念
ECS机器,k8s运行的一个环境
pod等资源,属于k8s安装好后的,集群内的一个资源信息。
1、k8s工作节点,node运行环境可以是::::vmware创建的一个虚拟机,k8s-node-11 k8s-node-12
2、node上具体运行啥,运行容器,k8s部署的应用,都是跑在容器里,还得装docker
3、初始化,运行工作节点,或者主节点,背后逻辑是
3.1下载k8s自身的一些组件的镜像
3.2 运行镜像,创建对应的容器,到对应的目标机器上(k8s-master、k8s-node)
以上就是部署架构逻辑。
Pod图解作用
Kubernetes使用Pod来管理容器,每个Pod可以包含一个或多个紧密关联的容器。
Pod是一组紧密关联的容器集合,他们共享进程间通信和Network namespace,是Kubernetes调度的基本单位。
Pod内的多个容器共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。
Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。
Pod是K8s集群中所有业务类型的基础,可以看作运行在k8s集群中的小机器人,不同类型的业务就需要不同类型的小机器人去执行。
目前K8s中的业务主要可以分为长期伺服型、批处理型、节点后台支撑型和有状态应用型
分别对应的小机器人控制器为Deployment、Job、DaemonSet和StatefulSet
- Pod是k8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的。
- Pod的IP是随机变化的,删除pod、ip变化
- pod内部都有一个根容器
- 一个pod内可以有一个,多个容器
- 一个pod内的所有容器,共享根容器的网络名称空间,文件系统,进程资源
- 一个pod内的容器网络地址,由根容器提供。
图解K8s概念作用
- pod运行状态概念
- label标签概念
node打标签,作用用于部署pod
- Namespace,资源组,名称空间,k8s再创建资源的时候,可以单独创建一个资源。
k8s里可以基于创建namespce,管理不同环境下的资源,也是一个重要资源,
先了解Pod
再学控制器,去维护你的pod
pod要对外提供访问服务,就得再学service等资源
k8s-Master部署
k8s-Node部署
k8s-网络插件部署与pod实践。