k8s:
kubernetes:八个字母省略,就是k8s
自动部署,自动扩展和管理容器化部署的应用程序的一个开源系统
k8s是负责自动化运维管理多个容器化程序的集群,是一个功能强大得容器编排工具
分布式和集群化的方式进行容器管理
市面上常用的版本:
1.15 1.18 1.20(常用) 1.28
k8s是谷歌的borg系统作为原型,后期由go语言编写开源软件
k8s网址:Kubernetes
源码包:
GitHub – kubernetes/kubernetes: Production-Grade Container Scheduling and Management
Docker微服务,可以满足微服务使用,那么为什么还要使用k8s
- 传统的部署方式:一般意义上的额二进制部署,安装运行-运行维护,需要专业的人员,如果出了故障还需要人工去重新拉起来,而且如果业务量增大,只能水平的推展,再部署一个
- 容器化,我们可以用dockerfile编写好的自定义的容器,随时基于镜像都可以运行,数量少还可以管理,数量多了管理起来太复杂。而且docker一般都是单机部署运行,没有高可用
k8s的作用:
简单,高效的部署容器化的应用
- 解决了docker的单机部署和无法集群化的特点
- 解决了随着容器数量的额增加,对应增加的管理成本
- 容器的高可用,提供了一种容器的自愈机制
- 解决了容器没有预设模板,以及无法快速,大规模部署,以及大规模的容器调度
- k8s提供了集中化配置管理的中心
- 解决了容器的生命周期的管理工具
- 提供了图形化工具,可以用图形化工具来对容器进行管理
k8s是一个基于开源的容器集群管理系统,在docker容器技术的基础之上
为容器化的应用提供部署,运行,资源调度,服务发现,动态伸缩等一系列完整的功能
大规模容器管理:
- 对docker等容器技术从应用的包—部署—运行—停止—销毁,全生命周期管理
- 集群方式运行,跨机器的容器管理
- 解决docker的跨机器运行的网络问题
- k8s可以自动修复,使得整个容器集群可以在用户期待的状态下运行
k8s的特性:
- 弹性伸缩,基于命令,或者图形化界面基于CPU的使用情况,自动对部署程序进行扩容和缩容,以最小的成本运行服务
- 自我修复:节点故障时,重新启动失败的容器,替换和重新部署
- 服务发现和负载均衡:k8s为多个容器提供一个同一的访问入口(内部地址和内部的DNS名称),自动负载均衡关联的所有容器
- 自动发布和回滚:k8s采用滚动的策略更新应用,先更新一部分,在更新所有,可以更新回滚点来进行回滚
Nginx-1 先更新1 最新的版本
Nginx-2 更新2
- 集中化的配置管理和密钥管理
k8s集群内部的各个组件都是要进行密钥队验证的,但是k8s的安全性不够,核心就是不建议部署在k8s上,例如MySQL,nginx
- 可以实现存储编排
- 可以自动化的把容器部署在节点上
- 也可以通过命令行或者yml文件(自定义pod)实现指定节点部署
- 也可以通过网络存储,NFS,GFS
- 任务进行批次处理,通过一次性的任务,也可以提供定时任务。满足需要批量处理和分析的场景
k8s的核心组件:
kube-apiserver:
k8s集群的之中的每个组价都要靠密钥队来进行验证,组件之间的通信靠apiserver来实现。API是应用接口服务,k8s的所有资源请求和调用操作都是kube-abserver来完成
所有对象资源的增删改查和监听的操作都是kube-apiserver处理完之后交给etcd来进行
api-server是k8s所有请求的入口服务,api-server接收k8s的所有请求(命令行和图形化界面),然后根据用户的具体请求通知对用的组件展示或者运行指定结果运行命令,api-server相当于整个集群的大脑
kube-controller-manager:
- 运行管理控制器,是k8s集群当中处理常规任务的后台线程,是集群当中所有资源对象的自动化控制中心,一个资源对应一个控制器,controller-manager负责管理这些控制器
- node controller(节点控制器):负责节点控制器,负责节点发现故障的发现和响应
- Replication controller(副本控制器):控制关联pod的副本数,可以随时扩缩容
- Endpoints controller(端点控制器):监听service和对应的副本变化,端点就是服务暴露出的访问点,要访问这个服务,必须要知道他的endpoints,就是内部每个服务的IP+端口
- Server account和roken controllers(服务账户和令牌控制)
为命名空间创建默认账户和api访问的令牌
Namespace,访问不同的命名空间
- resourcequota controller(资源控制器):既可以对命名空间的资源使用进行限制,也可以对pot的资源进行限制
- Namespace controller(命名空间的控制器):管理命名空间的生命周期
- Service controller(服务节点控制器):k8s集群和外部的主机之间的接口控制器
kube-scheduler:资源调度组件,
根据调度算法为新创建的pod选择一台合适的node节点
可以理解为k8s的所有node节点调度器,部署和调度node
预先策略:人工定制,指定node节点上部署
优先策略:限制条件
根据调度算法选择一个合适的node,node的节点资源情况,node的资源控制的情况等等,选一个资源最富裕,负载最小的node来部署
ETCD:k8s的存储服务,
etcd分布式键值存储系统(key:value),k8s的关键配置和用户配置,先通过apiserver调用etcd当中的存储信息,然后在实施(这个集群当中,能对etcd存储进行读写权限的,只有apiserver)
Node组件:
kublet:
node节点的监控器,以及于MASTER节点的通信器,也可以理解为master在node节点上的眼线(相当于特务组织)
Kublet会定时向api server汇报自己的node运行服务的状态,API-server会把节点上的状态保存ETCD存储当中。
接受来自master节点的调度命令,
如果发现自己的状态和master节点的状态不一致,调用docker的接口,同步数据
对节点上的生命周期进行管理,保证节点上的镜像不会占满磁盘空间,退出的容器的资源,进行回收
kube-proxy:
实现每个node节点上的pod网络代理,负责节点上的网络规划和四层负载均衡的实现,负责写入iptables(快被淘汰) IPVS(实现服务映射)
注意:Pod不是容器,是一个资源整合的节点
kube-proxy:本身不直接给pod提供网络代理,proxy只是service资源的载体
docker:
容器引擎,运行容器,负责本机容器创建和管理,基于容器创建的,但是它不是容器
k8s要创建pod时,kube-schedule调度到节点上(node节点),节点上的kubelet只是docker启动特定的容器,kubelet把容器的信息收集,发送给主节点,主需要在主节点上发布指令,节点上kubelet就会指示docker拉取镜像,启动或者停止容器
pod
也是运行在节点上的,是k8s当中创建或者最小,最简单的基本单位,一个pod代表着集群上正在运行的一个进程,类似于一个豌豆,里面的颗粒就是容器,同一个pod内每个容器就是一颗豌豆
Pod是由一个或多个组成,pod中的容器共享网络,存储和计算资源,可以部署在不同的主机上
一个pot里面可以运行多个容器,也可以是一个容器,在生产环境中,一般都是单个容器或者关联具有关联关系的多个容器组成的一个pod
Deployment:无状态应用部署,作用就是管理和控制pod,以及replicaset(运行多个容器),管控他的运行状态
Replicaset:保证pod的副本数量,受控于deployment
在k8s当中,部署服务,实际上就是pod,deployment部署的服务就是pod,replicase的就是来定义pod的容器数量
可以保证pod的不可重复性,在当前命名空间不能重复,不同命名空间名称可以重复
官方推荐使用的就是deployment进行服务部署
Daemonset:确保所有节点运行同一类的pod
Statuefulset:有状态部署
Job:可以给pod中设置一次性的任务,运行玩即退出
Cronjob:一直运行的周期性任务
Service:
又叫CLUSTER-IP
在k8s整个集群当中,每创建一个pod,都会会其中运行的容器分配一个集群内的IP地址,由于业务的变更,容器可能会发生变化,IP地址也会发生变化,service的作用就是提供整个pod对外的整个IP地址
Service就是一个网关,就是一个路由器,通过访问service就可以访问pod内部的容器集群
Service能实现负载均衡和代理—–kube-proxy(载体)—-来实现负载均衡
Service是k8s微服务的核心,屏蔽了服务的细节,统一的对外暴露的端口,真正实现了”微服务”
Service的流量调度:userspace(用户空间,已经被废弃),iptables(即将废弃),IPVS(目前1.20都用IPVS)
Label:标签,k8s的特色管理方式,用于分类管理资源对象
Node pod service等等,都可以起标签
Label标签可以自定义
Lable选择器:等于,不等于,使用定义的标签名
Ingress:
k8s集群对外暴露提供访问的接口,属于应用层,七层代理,转发的是http请求,访问的是http/https
面试题:service是四层转发,转发的是流量
对外访问暴露的流程:
Namespace
k8s上可以通过namespace来实现资源隔离,项目隔离
通过namespace可以把集群划分为多个资源不可共享的虚拟的集群组
不同命名空间里面的资源名称可以重复的
k8s核心图:
在k8s之中是不和容器打交道的,和容器打交道的是pod