云原生的问答
1、什么是Kubernetes
Kubernetes是一个全新的基于容器技术的分布式系统支撑平台,在Docker技术的基础上,为容器化的应用提供部署运行,资源调度,服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。并且具有完备的集群管理功能,多层次的安全防护和准入机制、多租户应用支撑能力,透明的服务注册和发现机制,内建智能负载均衡、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制及多粒度的资源配额管理能力。
是一个开源的容器管理工具;
负责容器部署,容器扩容,以及负载均衡;
是一个多容器管理解决方案。
2、Kubernetes和Docker的关系
Docker提供容器的生命周期和管理,Docker构建运行时容器。它的主要优点是将软件/应用程序所需的舌战和依赖打包到一个容器中,从而实现了可移植性。
Kubernetes用于关联和编排在多个主机上运行的容器。
3、kubectl和kubelet的区别
Kubectl是一个命令工具,可以使用该工具控制Kubernetes集群管理器,如检查集群资源,创建、删除和更新组件,查看应用程序。
Kubelet是一个代理服务,它在每个节点上运行,并使从服务器与主服务器通信。
Kubelet运行在每一个计算节点上;
kubelet接收分配该节点的Pods任务及管理容器;
Kubelet周期性获取容器的状态,反馈给api-apiserver;
负责节点资源管理;
接收来自kube-apiserver创建pods任务,并分配到某个节点;
是集群中每个节点的网路哦代理;
4、Kubernetes如何实现集群管理
在集群管理方面,Kubernetes分为Master节点和Node节点,在Master节点上运行集群管理相关的一组进程,kube-apiserver、kube-controller-manager和kube-scheduler,这些进程实现了整个集群的资源管理,Pod调度,弹性伸缩,安全控制,系统监控和纠错等管理能力,并且都能自动完成。
5、Kubernetes的优势、适应场景及特点
优势:
- 容器编排
- 轻量级
- 开源
- 弹性伸缩
- 负载均衡
Kubernetes常见场景
- 快速部署应用
- 快速扩展应用
- 无缝对接新的应用功能
- 节省资源、优化硬件资源的使用
Kuberentes相关特点:
可移植:支持公有云、私有云、混合云、多重云
可扩展:模块化、插件化、可挂载、可组合
自动化:自动部署、自动重启、自动复制、自动伸缩/扩展
6、Kubernetes集群相关组件
6.1、Kubernetes API Server
作为Kubernetes系统的入口,其封装了核心对象的增删改查操作,以RESTful API接口方式提供给外部客户和内部组件调用,集群内各个功能模块之间数据交换和通信的中心枢纽。
6.2 Kubernetes Scheduler:
为新建立的Pod进行节点(node)选择(即分配机器),负责集群的资源调度。
6.3 Kubernetes Controller:
负责执行各种控制器,目前已经提供了很多控制器来保证Kubernetes的正常运行。
6.4 Replication Controller
管理维护Replication Controller,关联Replication Controller和Pod,保证Replication Controller定义的副本数量与实际运行Pod数量一致。
6.5 Node Controller
管理维护Node,定期检查Node的健康状态,标识出(失效|未失效)的Node节点。
6.6、Namespace Controller:
管理维护Namespace, 定期清理无效的Namespace,包括Namespace下的API对象,比如Pod,Service等。
6.7、Service Controller
管理维护Service,提供负载及服务代理。
6.8、 EndPoints Controller
管理维护Endpoints,关联Service和Pod,创建EndPoints为Service的后端,当Pod发生变化时,实时更新Endpoints
7、Kube-proxy作用
kube-proxy运行在所有节点上,它监听apiservice中service和endpoint的变化情况,创建路由规则提供服务IP和负载均衡功能;简单理解此进程是Service的透明代理件负载均衡器,其核心共呢个将某个Service的请求转发到后端的多个Pod实例上。
负责Pod网络代理;
定时从etcd获取到service信息来做响应的策略;
8、Kubernetes中的静态Pod
静态pod是由kubelet进行管理的仅存在于特定Node的pod,他们不能通过API Server进行管理,无法与ReplicationController、Deployment或者DaemonSet进行关联,并且kubelet无法对他们进行健康检查。静态Pod总由kubelet进行创建,并且总是在kubelet所在的Node上运行。
9、Kubernetes中的Pod可能位于什么状态
Pending:API Server已经创建该Pod,且Pod内还有一个或者多个容器的镜像没有创建,包括正在下载镜像的过程;
Running: Pod内所有容器均已经创建,且至少有一个容器处于运行状态,正在启动或者重启状态;
Succeeded: Pod内所有容器均成功执行退出,成功终止,且不会重启;
Failed:Pod内所有的容器均已经退出,至少有一个容器退出状态为失败状态;
Unknow:由于某种原因到时无法获取POD状态,可能由于网络通信不畅。
10、创建POD的流程
11、Kubernetes中POD的重启策略
Always:当容器失效时候,自动重启;
OnFailure:当容器终止运行且退出码不为0的时候,由kubelet自动重启该容器;
Never:当容器状态如何,kubelet都不会重启容器;
不同控制器策略不同:
RC和DaemonSet必须设置为Always,保证该容器持续运行;
Job:Onfailure或者Never确保容器执行完成后不在启动;
12、Pod的健康检查
Pod的健康检查可以通过两类探针来检查:LivenessProbe和ReadinessProbe。
LivenessProbe探针:用于判断容器是否存活(running状态),如果LivenessProbe探针探测到容器不健康,则kubelet将杀掉容器,并根据容器的重启策略做响应处理,若一个容器不半汉LivenessProbe探针,kubelet认为该容器的LivenessProbe探针返回值是“Success”。
ReadineeProbe探针:用于判断容器是否启动完成(read状态)。如果ReadinessProbe探针探测到失败,则Pod的状态将被修改。Endpoint Controller将从Service的Endpoint中删除包含容器所在的Endpoint。
startupProbe探针:启动检查机制,应用一些启动缓慢的业务,避免业务长时间启动二倍上面的两类探针kill掉。
LivenessProbe探针常见的方式:
ExecAction:在容器内执行一个命令,若返回码为0,则表明容器健康。
TCPSocketAction:通过容器IP地址和端口好执行TCP检查,若能建立TCP连接,则表明容器健康。
HTTPGetAction:通过容器的IP地址、端口号及路径调用HTTP Get方法,若响应的状态码大于等于200且小于400,则表明容器健康。
13、kubernetes Pod的常见调度方式
Deployment或RC;
NodeSelector;
NodeAffinity亲和性调度;
requiredDuringSchedulingIgnoredDruingExection:硬规则
preferredDuringSchedulingIgnoredDuringExecttion:软规则
Taints和Tolerations(污点和容忍)
Taint:是Node拒绝特定的Pod运行;
Toleration: 为Pod的属性,表示Pod能容忍(运行)标注了Taint的Node。
14、Init Container
init Container的运行方式和应用容器不同,他们必须先于应用容器执行完成,当设置了多个init Container时候,将按顺序逐个运行,并且只有当前一个init container运行成功后,才可以运行后一个init container,当所有的init container都运行成功后,Kubernetes才会初始化Pod的各种信息,并开始创建和运行应用容器。
15、Kubernetes deployment的升级过程
- 初始创建Deployment时候,系统创建了一个ReplicaSet,并按用户需求创建了对应的Pod副本;
- 当更新Deployment时候,系统创近啊了一个新的ReplicaSet,并将其副本数量扩展到1,然后将旧RepliaSet缩减为2;
- 之后,系统安装相同的策略对新旧两个ReplicaSet镜像逐个调整;
- 最后,新的ReplicaSet运行了对应新版本Pod副本,旧的ReplicaSet副本数量缩减为0.
16、Kubernetes deployment升级策略
在Deployment的定义中,可以通过spec.strategy指定pod的更新策略,目前支持两种策略,Recreate(重建)和RollingUpdate(滚动更新),默认为RollingUpdate。
17、Kubernetes DaemonSet类型的资源特性
DaemonSet资源对象会在每个Kubernetes集群中的节点上运行,并且每个节点只能运行一个Pod,这是他和Deployment资源对象的最大也是唯一的区别,因此在定义yaml文件中,不支持定义replicas;
它的一般使用场景如下:
- 每个节点日志收集工作;
- 监控每个检点的运行状态;
18、Kubernetes Service类型
可以为一组具有相同功能的容器应用提供统一的入口地址,并且将请求负载分发到后端的各个容器应用上,其主要类型有:
ClusterIP:虚拟机的服务IP地址,该地址用于Kubernetes集群内部的Pod访问,在Node上kube-proxy通过设置的iptables规则进行转发;
NodePort:使用宿主机的端口,能够访问个Node的外部客户端通过Node的IP地址和端口号就能访问服务;
LoadBalancer:使用外接负载均衡器完成到服务的负载分发。
19、Kubernetes ingress
Kubernetes的Ingress资源对象,用于将不同URL的访问请求转发到后端不同的Service,以实现HTTP层的业务路由机制;
Kubernetes使用了Ingress策略和Ingress Controller,两者结合实现了一个完整的Ingress负载均衡器,使用Ingress镜像负载分发时候,Ingress Controller基于Ingress规则将客户请求转发到Service对应的后端Endppint(Pod)上,从而跳过kube-proxy的转发功能,kube-proxy不在起作用,全程为:ingress controller+ingress规则--------> services。
同时当Ingress Contrller提供对外服务,则实际上实现的是边缘路由器的功能。
20、 Kubernetes镜像下载策略
Always: 总是从仓库中下载策略;
Never:禁止从仓库下载镜像,也就是说只能使用本地镜像;
IfNotPresent:仅当地没有镜像时候,才从仓库下载。
21、Kubernetees个模块如何与API Server通信
Kubernetes API Server作为集群核心,负责各模块之间的通信,集群内的各个功能模块通过API Server将信息存入etcd,当需要获取和操作这些数据时候,则通过API Server提供的REST接口(用GET、LIST或WATCH方法) 来实现,从而实现各模块之间的信息交互;
如kubelet进程与API Server的交互:每个Node上的kubelet每隔一个时间周期,就会调用一次API Server的REST接口报告自身状态,API Server在接收到这些信息后,会将节点状态更新到etcd中。
22、Kubernetes kubelet的作用
在Kubernetes集群中,在每个Node(Worker) 上都会启动一个kubelet服务进程,该进程用户处理Master下发到本节点的任务,管理Pod及Pod中的容器,每个kubelet进程都会在API Server上注册节点自身的信息,定期向Master汇报节点资源的使用情况,并通过监控容器和节点资源。
23、Kubernetes kubelet 监控work节点的资源使用是用什么组件来实现的
kubelet使用 cAdvisor对work节点资源进行监控。
24、Kubernetes 数据持久化的方式有那些
EmptyDir:没有指定要挂载宿主机的某个目录,直接有Pod内部映射到宿主机上;
场景: 临时数据保存到宿主机上;
两个容器的共享存储;
特性: 同个pod里面的不同容器,共享同一个持久化目录,当pod节点删除时候,volume的数据也会被删除;
emptyDir的持久化的生命周期和使用的pod一致,一般是作为临时存储使用。
Hostpath:将宿主机上已存在的目录或文件挂载到容器内部;
特性:增加了pod节点之间的耦合
PersistentVolume(简称PV):持久化目录,方便管理;
25、简述PV和PVC
PV是对底层网络共享存储的抽象,将共享存储定义为一种“资源”。
PVC则是用户对存储资源的一个“申请”。
26、Kubernetes PV生命周期的几个阶段
Available:可用状态,还没有与某个PVC绑定;
Bound:已与某个PVC绑定;
Released:绑定的PVC已经删除,资源已是否,单没有被集群回收;
Failed:自动资源回收失败。
27、Kubernetes所支持的存储供应模式
静态模式:集群管理员手工创建许多PV,砸定义PV时需要将后端存储的特性镜像设置;
动态模式:集群管理员无需手动创建PV,二是通过StorageClass的设置对后端存储进行描述,标记为某种类型,此时要求PVC对存储的类型进行声明,系统将自动完成PV的创建及PVC的绑定。
28、Kubernetes CSI模型
Kubernetes CSI是Kubernetes退出与容器对接的存储接口标准,存储提供方只需要基于标准几口进行存储插件的实现,就能使用Kubernetes的原生存储机制为容器提供存储服务。CSI是的存储提供的代码能和Kubernnetes代码彻底解耦,部署也与Kubernetes核心组件分离。显然,存储插件的开发有提供方自行维护,就能为Kubernetes用户提供更多的存储功能,也更加安全可靠
CSI包括CSI Controller和CSI Node:
CSI Controller的主要功能是提供存储服务视角对存储资源和存储卷镜像管理和操作;
CSI Node的主要功能对主机(Node)生的Volume镜像管理和操作;
29、Kubernetes中,如何使用EFK实现日志的统一管理
EFK是Elasticsearch、Fluentd、和Kibana的组合
Elasticsearch:是一个搜索引擎,负责存储日志并提供查询接口;
Fluentd:负责Kubernetes搜索日志,每个几点上的Fluentd监控并收集该节点上面的系统日志,并经过处理后的日志信息发送给Elasticsearch;
Kibana:提供了一个Web GUI,用户可以浏览饿搜索在Elasticsearch中的日志
通过每台node上部署一个以DaemonSet方式运行的fluentd来收集每台node上的日志,Fluentd将docker日志目录/var/lib/docker/contaiers和/var/log目录挂载到Pod中,然后,Pod会在node节点的/var/log/[pods目录中创建新的目录,可以区别不同的容器日志输出,该目录下有一个日志文件连接到/var/lib/docker/containers目录下的容器日志输出。
30、Helm及优势
Helm是Kubernetes的软件包管理工具,类似Ubuntu中使用的apt,Centos中使用的yum或者Python中的pip一样
Helm能够将一组K8S资源打包统一管理,是查找,共享和使用为Kubernetes构建的软件的最佳方式。
31、CNI网络插件
calico根据iptables规则进行路由转发,并没有进行封包,解包的过程,这和flannel比起来效率会快多;
32、Controller控制器
Headless service无头服务,不需要cluster-IP,直接绑定具体的Pod的IP,无头服务经常用于部署statefulset有状态服务,
Ingress Controller:
NodePort虽然提供了对外的方式,但是也有很大弊端:由于service的实现方式:user_space、iptables、ipvs方式,这三种方式只支持在4层协议通信,不支持7层协议,因此NodePort不能代理https服务。
NodePort需要暴露service所属每个node节点上端口,当需求越来越多,端口梳理过多,导致维护成本过高,并且集群不好管理。
33、kube-proxy的三种工作模式和原理
userspace模式;
iptables模式:kube-proxy为service后端的每个Pod创建对应的iptables规则,直接将发向Cluster IP的请求重定向到一个Pod IP;
ipvs:该模式和iptables类似,kube-proxy监控Pod的变化,并创建响应的ipvs rules,ipvs也是在kernel模式下通过netfilter实现的,但采用了hash table 来存储规则,因此在规则较多的情况下,Ipvs相对iptables转发效率更高,除此之外,ipvs支持更多的LB算法,入股哦设置kube-proxy为ipvs,必须在操作系统中安装IPVS内核模块。
34、K8s每个Pod中有一个特殊的Pause容器
pause container作为pod里其他所有container的parent container,主要有两个职责:
是pod里其他容器共享Linux namespace 的基础;
扮演PID 1的角色,负责处理僵尸进程。
35、pod中readness和liveness的区别和各自应用场景
存活性探针(liveness probes) 和就绪性探针(readiness probes)
用户通过Liveness探测可以告诉Kubernetes什么时候通过重启实现自愈;
Readiness探测则是告诉Kubernetes什么时候可以将容器加入到Service负载均衡池中,对外提供服务。
主要探测方式支持http探测、执行命令探测、以及TCP探测;
1、执行命令探测,kubelet是根据执行命令的退出码来决定探测是否成功,当执行命令退出码为0时候,任务执行成功,否则执行是吧,如果执行超时,则状态为Unknown;
2、http探测:通过kubelet请求容器的指定url,并根据response来进行判读,当返回码在200到400之间,也就是2XX和3XX,认为探测成功,否则失败;
3、tcp探测:指定的端口,如果可以连接,则认为探测成功,否则失败;
36、Docker网络通信模式
1、host模式
使用 --net=host,和宿主机公用一个Network Namespace,容器将不会虚拟出自己的网卡,配置自己的IP等,二是使用宿主机的IP和端口;
2、container模式
使用 --net=container:NAMEorID指定; 指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享;
3、none模式
使用 --net=none指定,告诉docker将新容器放到自己的网络堆栈中,但是不要配置它的网络;
4、bridge模式
使用 --net=bridge指定,默认设置;bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接 到一个虚拟机网桥上。
37、Kubernetes架构
38、ETCD及特点
etcd是CoreOS团队发起的开源项目,是一个管理配置信息和服务发现(Service discovery)的项目,他的目标是构建一个高可用的分布式键值(key-value)数据库,基于Go语言实现;
特点:简单(支持REST风格的HTTP+JSON API);安全(支持HTTPS方式的访问);快速(支持分布式结构);可靠(支持分布式结构)
39、负载均衡四层和七层的区别
四层负载均衡:也称为4层交换机,主要通过分析IP层及TCP/UDP层的流量实现基于IP加端口的负载均衡,常见的LVS、F5等;
七层负载均衡:7层交换机,位于OSI的最高层,即应用层,此负载均衡器支持多种协议,如HTTP、FTP、SMTP等,7层负载均衡可根据报文内容,配合一定的负载均衡算法来选择后端服务器,即“内容交换机”,常见的HAProxy、Nginx。
40、ACID理论
原子性(Atomicity):整体不可分割性,要么全做,要么全不做;
一致性(Consistency):事务执行前、后数据库状态一致;
隔离性(Isolation):在事务 未提交前,它操作的数据,对其他用户不可见;
持久性(Durable):一旦事务成功,将镜像永久的变更,记录与redo日志。