Kubernetes的缩写为:K8S,这个缩写是因为k和s之间有八个字符的关系。
Kubernetes是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes拥有一个庞大且快速增长的生态系统。Kubernetesd的服务、支持和工具广泛可用
轻量级
开源
自我修复
弹性伸缩
手动弹性伸缩(针对于pod),当I/O读/写、磁盘、内存的压力(单个pod) > 80% , 修改replicasets :3->4 更新一下nginx.yml
自动:Yml --> 阈值 cpu使用率 > 80% ——》触发扩容pod (CPU使用上限,docker-cgroup k8s ---> 1、limit
伸缩:扩容和缩容
弹性:人为只要指定规则,满足条件时,就会自动触发扩容或缩容的操作
自动部署和回滚
服务发现和负载均衡
机密(加密配置)和(普通)配置管理
存储编排(静态、动态)
批处理
init容器:初始化容器环境
pause容器:在pod内提供network namespace和存储卷支持
业务容器/应用容器,提供业务运行(跑业务的)
Pod内容器网络使用什么模式
K8S资源管理器中资源的“配置文件”
什么是控制器?
对不同的对象及其特性使用不同的方式控制管理
控制器说明:
例如数据库(需要持久化)
服务本身依赖或者存在局部的状态数据,这些数据需要自身持久化或者可以通过其他节点恢复。
一个请求只能被某个节点(或者同等状态下的节点)处理。
存储状态数据,实例的拓展需要整个系统参与状态的迁移。
在一个封闭的系统中,存在多个数据闭环,需要考虑这些闭环的数据一致性问题。
通常存在于分布式架构中
简化:
无状态服务:就是没有特殊状态的服务,各个请求对于服务器来说统一无差别处理,请求自身携带了所有服务端所需要的所有参数(服务端自身不存储跟请求相关的任何数据,不包括数据库存储信息
有状态服务:与之相反,有状态服务在服务端保留之前请求的信息,用以处理当前请求,比如session等
超简化:
有状态服务:需要持久化,多次请求之间需要共享一些信息
无状态服务:一次性,不需要持久化,每次请求都是一条新的数据
有点像docker -p -P
K8S内部的Pod 通讯是以一组私有地址进行通讯的,所以默认情况下无法直接为客户端(服务、用户)提供访问,可以通过Service服务发现,把我们内部的pod资源暴露给客户端访问(以暴露一个ip:端口的方式),让客户端可以通过这个IP:端口的形式访问到K8S内部的多个pod(通常意义上是一个应用的副本集)
通过service这个统一入口/定义的访问策略对外暴露服务,Service 作为一组Pod 的统一访问出入口(定义一组Pod的访问策略),以RR分流算法进行负载均衡,把Pod中的应用服务暴露出来给客户端访问service ——》暴露方式是四层的
访问的方式是通过kube-proxy 匹配iptables功能进行转发的(四层)
k8s官方默认提供了四层的代理/负载均衡方式,而我们可以借助于官方后续支持的ingres-nginx 提供七层转发/负载均衡
service有几种模式
把pod映射出去,使用的ip是node节点的IP和端口范围
先经过servicce,会端口和IP映射为节点的端口和IP,然后在过网关防火墙LB出去
k8s内部默认的一种扁平化通讯的一种方式
无头服务,直接把pod暴露出来,不会使用service的IP和端口,一般用于内部
给pod做负载均衡 是L4(节点)/L7(集群) 软件/硬件
不经过servicer 直接出网关防火墙LB,外面访问也是直接访问pod
服务之间对接:通过service
为了让Pod之间可以进行通讯(不同节点之间)
CNI主要类型
flannel的几种模式
vxlan(默认)
geteway(网关)
UDP模式(不用了)
面试题:flannel的几种模式,有什么区别,udp和vxlan有何区别
用于不同节点之间Pod通讯
pod的ip是怎么被分配的
k8s集群中有一个核心组件ETCD核心数据库,存储集群中所有的资源信息,包括pod——ip的分配
假设node1节点上的pod1和node2节点上的pod3进行通讯
pod1发送来过,通过veth对,经过docker0,被flannel 0的钩子函数勾过去,flannel 0查看路由信息,根据路由信息确定pod3在node2节点(读取etcd中的路由信息知道opd3在哪个节点),然后将这个信息给予到flannel守护进程,守护进程会发送给网卡,并且对数据进行重新封装.将pod的源IP和目标ip封装到正常数据包的协议之后,通过网卡进行UDP的传输。
到node2的网卡接收到后,解封装解封到协议后,发现元pod1的IP和目标pod的IP.目标pod IP是pod3的在自己节点上,然后将数据包给予到flannel守护进程,守护进程会给予到自己的alannel 0,然后在给到对应的docker 0 ,最后docker 0给到pod3
主控的角度是路由策略
BGP(动态路由) IP——IP(隧道模式 稍多)
canal
策略和传输、转发封装 (两手抓)
创建service需要servicecontroller,EndpointController,kube-proxy,三大模块同时协作
当一个service对象状态发生变化的时候,Informer都会通知serviceController,创建对应的服务
功能:定义后端位置和自动发现、自动更新
kube-proxy负责service实现,实现了k8s内部service和外部node port到service的访问
kube-proxy采用iptables的方式配置负载均衡,基于iptables的kube-proxy的主要职责包括两大块:一块是侦听service更新事件,并更新service相关的iptables规则;一块是侦听endpoint更新事件,更新endpoint相关的iptables规则(如KUBE-SVC-链中的规则),然后将包请求转入endpoint对应的Pod
小结:
serviceController:是控制service来创建对应的Pod关联的规则的
endpointController:是定义后端pod的具体位置,也就是endpoint (upstream +consul的自动发现和更新)
kube-proxy:是用来定义具体的后端转发和分流规则的
以上组成了一个service所必要的功能
volumes
简单来说就是确定pod要跑在哪个节点的组件
K8S会自动完成把一个新的pod 调度到对应的节点(预选/优选算法)对于生产环境上,我们往往会需要将pod创建的过程(比如创建到的节点位置)进行管理
例如:
预选:排除基础条件不符合的节点,例如 资源不够,节点有污点,节点禁止调度,节点做了反亲和
优选:在预选后,根据更加精细化的算法来打分+权重值最后得出总分,并择优选择
Label : 标签,附加到某个资源上,用于关联对象、查询和筛选
创建一个Pod
1、编写pod yml文件(nginx资源怎么跑,用什么环境变量,需不需要资源限制,要调度到哪个节点) label:nginx
2、把pod 暴露出去,Service——》通过yml文件定义 label:nginx
将对象逻辑上隔离,主要为了方便管理
资源名称空间:网络、user、pid
在同一个名称空间的pod可以通信(创建pod不指定默认在default里)
名称空间限制pod数量
生产环境:一般会新建一个namespace,专门放置一些项目/服务使用的pod资源
Annotations :注释(描述性信息)
K8S集群中所有的资源,组件包括外部向内部访问,服务运行等等,均需要安全
认证、鉴权、访问控制、原理及流程
从搭建集群,就需要用到加密,CA认证
管理和控制,必须先通过认证/授权,才能进行管理
跑的一些应用,nginx、squid ——》需要一些访问控制策略
类似linux里面yum
helm 安装 magodb
helm 模板、自定义