K8s的集群组件有哪些?功能是什么?
kubernetes组件
etcd
etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。在二进制部署etcd集群的时候,必须要考虑到高可用方案,一般部署三个或者三个以上的奇数个节点,因为当master宕机时,是通过选举制度来选择master的。
master组件
master和node是两个逻辑上节点,当服务器资源充足时,可以将其分开在不同的机器上部署,当服务器资源不足时,也可以放到同一台机器上部署。master节点在部署的时候必须要考虑高可用方案,至少部署两个master。
apiserver
主节点上负责提供 Kubernetes API 服务的组件;它是 Kubernetes 控制面的前端。是整个集群中资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。apiserver提供了集群管理的restful api接口(鉴权、数据校验、集群变更等),负责和其它模块之间进行数据交互,承担了通信枢纽功能。通过kubectl操作集群资源时需要登陆到master节点之上,而跨主机调用apiserver时,直接通过master前端的负载均衡来实现
controller manager
controller manager 译为“控制器管理器”,k8s内部有很多资源控制器,比如:Node Controller、Replication Controller、Deployment Controller、Job Controller、Endpoints Controller等等,为了降低复杂度,将这些控制切都编译成了一个可执行文件,并且在同一个进程中运行。controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新
scheduler
调度器组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。
当前各个node节点资源会通过kubelet汇总到etcd中,当用户提交创建pod请求时,apiserver将请求交给controller manager处理,controller manager通知scheduler进行筛选合适的node。此时scheduler通过etcd中存储的node信息进行预选(predict),将符合要求的node选出来。再根据优选(priorities)策略,选择最合适的node用于创建pod
node组件
kubelet
kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。kubelet 不会管理不是由 Kubernetes 创建的容器
功能:
1、接收pod的期望状态(副本数、镜像、网络等),并调用容器运行环境(container runtime)来实现预期状态,目前container runtime基本都是docker ce。需要注意的是,pod网络是由kubelet管理的,而不是kube-proxy。
2、定时汇报节点的状态给 apiserver,作为scheduler调度的基础
3、对镜像和容器的清理工作,避免不必要的文件资源占用磁盘空间
kube-porxy
kube-proxy 是集群中每个节点上运行的网络代理,是实现service资源功能组件之一。kube-proxy 建立了pod网络和集群网络之间的关系,即 cluster ip 和 pod ip 中间的关系。不同node上的service流量转发规则会通过kube-proxy进行更新,其实是调用apiserver访问etcd进行规则更新。
service流量调度方式有三种方式: userspace(废弃,性能很差)、iptables(性能差,复杂)、ipvs(性能好,转发方式清晰)。
container runtime
kube-proxy 是集群中每个节点上运行的网络代理,是实现service资源功能组件之一。kube-proxy 建立了pod网络和集群网络之间的关系,即 cluster ip 和 pod ip 中间的关系。不同node上的service流量转发规则会通过kube-proxy进行更新,其实是调用apiserver访问etcd进行规则更新。
service流量调度方式有三种方式: userspace(废弃,性能很差)、iptables(性能差,复杂)、ipvs(性能好,转发方式清晰)。
Ingress
Ingress: 是用于将外部 HTTP(S)流量路由到服务(Service)的规则集合。
如何修改副本数,如何滚动更新和回滚,如何查看pod的详细信息,如何进入pod交互?
如何修改副本数,如何滚动更新和回滚
直接更改yaml 文件的Replicas 字段
回滚:
假设你在更新 Deployment 时犯了一个拼写错误,将镜像名称命名设置为 nginx:1.161 而不是 nginx:1.16.1:(回滚命令如下)
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.161 --record=true
回滚到之前修订版本:
检查修订版本:
kubectl rollout history deployment.v1.apps/nginx-deployment
回滚到上次修订版本:
kubectl rollout undo deployment.v1.apps/nginx-deployment
回滚到特定修改版本:
kubectl rollout undo deployment.v1.apps/nginx-deployment --to-revision=2(2是指第几次修定的版本)
就绪探针和判活探针的区别和作用?
kubelet 使用存活探测器来知道什么时候要重启容器。 例如,存活探测器可以捕捉到死锁(应用程序在运行,但是无法继续执行后面的步骤)
kubelet 使用就绪探测器可以知道容器什么时候准备好了并可以开始接受请求流量, 当一个 Pod 内的所有容器都准备好了,才能把这个 Pod 看作就绪了。 这种信号的一个用途就是控制哪个 Pod 作为 Service 的后端。 在 Pod 还没有准备好的时候,会从 Service 的负载均衡器中被剔除的。
如何修改Pod的时间,且不会影响其他Pod,只作用于修改的那个Pod?
部署应用时,单独读取主机的“/etc/localtime”文件,即创建pod时同步时区,无需修改镜像,但是每个应用都要单独设置。
PV和PVC的关系,StorageClass是什么?
PV:PV描述的是持久化存储卷,主要定义的是一个持久化存储在宿主机上的目录,比如一个NFS的挂载目录。
PVC:PVC描述的是Pod所希望使用的持久化存储的属性,比如,Volume存储的大小、可读写权限等等。
Kubernetes管理员设置好网络存储的类型,提供对应的PV描述符配置到Kubernetes,使用者需要存储的时候只需要创建PVC,然后在Pod中使用Volume关联PVC,即可让Pod使用到存储资源,它们之间的关系如下图所示。
StorageClass:
Kubernetes提供了CSI接口(Container Storage Interface,容器存储接口),基于CSI这套接口,可以开发定制出CSI插件,从而支持特定的存储,达到解耦的目的。例如在Namespace:资源分组中看到的kube-system命名空间下everest-csi-controller和everest-csi-driver就是华为云CCE开发存储控制器和驱动。有了这些驱动就可以使用华为云上的EVS、SFS、OBS存储。
kube-proxy工作原理
1、kube-proxy其实就是管理service的访问入口,包括集群内Pod到Service的访问和集群外访问service
2、kube-proxy管理sevice的Endpoints,该service对外暴露一个Virtual IP,也成为Cluster IP, 集群内通过访问这个Cluster IP:Port就能访问到集群内对应的serivce下的Pod。
3、service是通过Selector选择的一组Pods的服务抽象,其实就是一个微服务,提供了服务的LB和反向代理的能力,而kube-proxy的主要作用就是负责service的实现。
4、service另外一个重要作用是,一个服务后端的Pods可能会随着生存灭亡而发生IP的改变,service的出现,给服务提供了一个固定的IP,而无视后端Endpoint的变化。
kube-proxy内部原理
通过kube-proxy来实现service的代理服务
iptables模式:
节点NotReady是什么导致的?NotReady会发生什么?
节点的几种状态:
如果您的节点处于 MemoryPressure、DiskPressure 或 PIDPressure 状态,则必须管理您的资源,以允许在该节点上计划额外的 Pod。如果您的节点处于 NetworkUnavailable 状态,则必须在该节点上正确地配置网络
NotReady
NotReady 状态的节点不可用于在其上计划 Pod。
托管节点组已停止将容器网络接口 (CNI) 策略附加到节点角色的 Amazon 资源名称 (ARN) 以改善安全状况。由于缺少 CNI 策略,这将导致节点更改为 NotReady 状态。(缺少网络插件)
rc/rs功能是怎么实现的
RC :Replication Controller(RC)应用托管在K8S后,K8S需要保证应用能够持续运行,这是RC的工作内容。
RS: ReplicaSet(RS)
两者之间的唯一区别是对选择器的支持。
大多数kubectl 支持Replication Controller 命令的也支持ReplicaSets。
ReplicaSets可以独立使用,但它主要被 Deployments用作pod 机制的创建、删除和更新。
使用Deployment时,你不必担心创建pod的ReplicaSets,因为可以通过Deployment实现管理ReplicaSets。
ReplicaSet能确保运行指定数量的pod。
Deployment 是一个更高层次的概念,它能管理ReplicaSets,并提供对pod的更新等功能。
建议使用Deployment来管理ReplicaSets,除非你需要自定义更新编排。
ReplicaSet也可以作为 Horizontal Pod Autoscalers (HPA)的目标 。
一个ReplicaSet可以由一个HPA来自动伸缩。