云原生简介
一、什么是云原生
云原生是一种提供了可应用于生产环境的方法论,方便企业快速运行应用程序,企业不需要将人效用于底层运行环境,而是主要聚焦在业务功能开发,从而实现产品的快速交付、迭代及稳定运行,从而整体降低成本支出并提高交付效率。


二、云原生技术栈
容器化:以docker、containerd为代表的容器运行技术。
服务网格:比如Service Mesh等。
微服务:在微服务体系结构中,一个项目是由多个松耦合且可独立部署的较小组件或服务组成。
不可变基础设施:不可变基础设施可以理解为一个应用运行所需要的基本运行需求,不可变最基本的就是指运行服务的服务器在完成部署后,就不再进行更改,比如镜像等。
声明式API:描述应用程序的运行状态,并且由系统来决定如何来创建这个环境,例如声明一个pod,会有k8s执行创建并维持副本。

Kubernetes简介
Kubernetes最初源于谷歌内部的Borg,Borg是谷歌内部的大规模集群管理系统,负责对谷歌内部很多核心服务的调度和管理,Borg的目的是让用户能够不必操心资源管理的问题,让他们专注于自己的核心业务,并且做到跨多个数据中心的资源利用率最大化。
Borg主要由BorgMaster、Borglet、Borgcfg和Scheduler组成:

Kubernetes组件简介
1.kube-apiserver:
Kubernetes API Server提供了k8s各类资源对象的增删改查及watch等HTTP REST接口,提供鉴权、准入,这些对象包括,pods、services、replicasets等,API Server为REST操作提供认证、授权等服务,并为集群的共享状态提供前端,所有其他组件都通过该前端进行交互。
RESTful API:是REST风格的网络接口,REST描述的是在网络中client和server的一种交互形式。
REST:是一种软件架构风格,或者说是一种规范,其强调HTTP应当以资源为中心,并且规范了URI的风格,规范了HTTP请求动作(GET、PUT、POST、DELETE、HEAD、OPTIONS)的使用,具有对应的语义。

2.运行时简介:
OCI(Open Container Initiative):2015年Google、Docker、Redhat、IBM共同成立,定义了运行标准和镜像标准。
CRI(Container Runtime Interface):2016年12月Kubernetes发布CRI(容器运行时接口),可以支持RKT等不同的运行时。
CRI-O:由Redhat发起并开源,用于替代Docker成为Kubernetes的运行时,2016年开发,2019年4月8日进入CNCF孵化。
K8S版本大于1.23 containerd或cri-docker
K8S版本小于等于1.23 docker
对于kubectl的管理和使用无区别,主要是安装部署K8S的时候有区别。

3.kube-scheduler:
Kubernetes调度器是一个控制面进程,负责将Pods指派到节点上。
通过调度算法为待调度Pod列表的每个Pod从可用Node列表中选择一个最适合的Node,并将信息写入etcd中。
node节点上的kubelet通过API Server监听到Kubernetes Scheduler产生的Pod绑定信息,然后获取对应的Pod清单,下载Image,并启动容器。
策略
LeastRequestedPriority:优先从备选节点列表中选择资源消耗最小的节点(CPU+内存)。
CalculateNodeLabelPriority:优先选择含有指定label的节点。
BalancedResourceAllocation:优先从备选节点列表中选择各项资源使用率最均衡的节点。
4.kube-controller-manager:
Controller Manager还包括一些子控制器(副本控制器、节点控制器、命名空间控制器和服务账号控制器等),控制器作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群中的Pod副本始终处于预期的工作状态。
controller-manager控制器每间隔5秒检查一次节点的状态。
如果controller-manager控制器没有收到来自Node节点的心跳,则将该节点标记为不可达。
controller-manager将在标记为无法访问之前等待40秒。
如果该Node节点被标记为无法访问后5分钟还没有恢复,controller-manager会删除当前Node节点的所有Pod并在其他可用节点重建这些Pod。
pod高可用机制
node monitor period:节点监视周期,5s。
node monitor grace period:节点监视器宽限期,40s。
pod eviction timeout:pod驱逐超时时间,5m。
5.kube-proxy:
Kubernetes运行在Node上的网络代理,反映了Node上Kubernetes API中定义的服务,并可以通过一组后端进行简单的TCP、UDP和SCTP流转发或者在一组后端进行循环TCP、UDP和SCTP转发,用户必须使用apiserver API创建一个服务来配置代理,其实就是kube-proxy通过在主机上维护网络规则并执行连接转发来实现Kubernetes服务访问。
kube-proxy运行在每一个节点上,监听API Server中服务对象的变化,再通过管理iptables或者ipvs规则来实现网络的转发。
三种网络
node网络:服务器宿主机的网络。
pod网络:容器的网络,容器创建好之后会使用pod网络的IP。
service网络:是为了实现从node访问到pod的转发,通过label匹配pod。
IPVS
ipvs相对于iptables效率会更高一些,使用ipvs模式需要在运行kube-proxy的节点上安装ipvsadm、ipset工具包和加载ip_vs内核模块,当kube-proxy以ipvs代理模式启动时,kube-proxy将验证节点上是否安装ipvs模块,如果未安装,kube-proxy将返回到iptables代理模式。
使用ipvs模式,kube-proxy会监视Kubernetes Service对象和Endpoints,调用宿主机内核Netlink接口以相应地创建ipvs规则,并定期与Kubernetes Service对象和Endpoints对象同步ipvs规则,以确保ipvs状态与期望一致,访问服务时,流量将被重定向到其中一个后端pod,ipvs使用哈希表作为底层数据结构并在内核空间中工作,这意味着ipvs可以更快的重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs为负载均衡算法提供了更多选项,例如:rr(轮询调度)、lc(最小连接数)、dh(目标哈希)、sh(源哈希)、sed(最短期望延迟)、nq(不排队调度等)。
6.kubelet:
kubelet是运行在每个worker节点的代理组件,它会监视已分配给节点的pod,具体功能如下:
向master汇报node节点的状态信息;
接受指令并在pod中创建docker容器;
准备pod所需的数据卷;
返回pod的运行状态;
在node节点执行容器健康检查。
7.kubectl:
是一个通过命令行对Kubernetes集群进行管理的客户端工具。

8.etcd:
由CoreOS公司开发,目前是Kubernetes默认使用的key-value数据存储系统,用于保存Kubernetes的所有集群数据,etcd支持分布式集群功能,生产环境使用时需要为etcd数据提供定期备份机制。

9.DNS:
负责为整个集群提供DNS服务,从而实现服务之间的访问。
10.Dashboard:
Dashboard是基于网页的Kubernetes用户界面,可以使用Dashboard获取运行在集群中的应用的概览信息,也可以创建或者修改Kubernetes资源(Deployment、Job、DaemonSet等等),也可以对Deployment实现弹性伸缩、发起滚动升级、重启pod或者使用向导创建新的应用。