k8S组件运行机制研究

74 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天

随着云原生技术的快速发展,很多系统框架是基于k8s的,所以熟悉和掌握K8s相关知识是非常重要的,今天就来研究一番。

  1. k8s-master

(1)kube-apiserver

api server提供了k8s中各类资源对象例如pod、rc、service的增删改查以及监视watch等http rest接口,是整个系统中的数据中心和数据总线,apiserver在master监听两个端口:一个是通过insercure port监听非安全的本地127.0.01的8080端口,用于接受http请求,可以通过参数insecure-port以及insecure-bind-adress的值来修改默认的ip和端口。另一个是监听一个对外访问的安全端口,默认6443,默认非本地ip,用于接受客户端、面板展示等外部https的请求,基于token文件或客户端证书以及http base认证,基于策略的授权。

功能:提供集群管理的REST API接口,包括认证授权、数据校验以及集群状态的变更,是其他模块之间数据交互和通信的枢纽,其他模块通过api server查询或者修改数据,只有api server才直接操作etcd数据库,是资源配额控制的入口,下面可以看看对应接口,启动脚本/etc/systemd/system/kube-apiserver.service

curl 127.0.0.1:8080/apis #分组api

curl 127.0.0.1:8080/api/v1 #带具体版本号的api

curl 127.0.0.1:8080/ #返回核心api列表 curl 127.0.0.1:8080/version #api 版本信息

curl 127.0.0.1:8080/healthz/etcd #与etcd的心跳监测

curl 127.0.0.1:8080/apis/autoscaling/v1 #api的详细信息

curl 127.0.0.1:8080/metrics #指标数据

(2)kube-controller-manager

这个个组件是作为集群内部的管理控制中心,非安全默认端口是10252,负责集群内的node、pod副本,服务端点endpoint、命名空间namespace,服务账号serviceacount、资源定额resourcequota管理,当node节点宕机时,controller-manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。启动脚本为/etc/systemd/system/kube-controller-manager.service

(3)kube-scheduler

scheduler负责pod调度,整个系统中起到承上启下的作用,承上就是接受controller manager创建的新pod,为其选择一个合适的node,启下就是node上的kubelet接管pod的生命周期。启动脚本/etc/systemd/system/kube-scheduler.service,具体的调度算法还需要咱们去研究一下,通过内置的调度算法为待调度的pod列表中的每个pod从可用node列表中选择一个最合适的node,将信息写入etcd中,node节点上的kublet通过apiserver监听到kubernetets scheduler产生的pod绑定信息,然后获取对应的pod清单,下载镜像并启动容器。

优选策略:1.LeastRequestedPriority

优先从备选节点列表中选择资源消耗最小的节点(CPU+内存)。

2.CalculateNodeLabelPriority

优先选择含有指定Label的节点。

3.BalancedResourceAllocation

优先从备选节点列表中选择各项资源使用率最均衡的节点。

2、k8s-node

(1)kubelet

在k8s集群中,每个node节点都会启动kubelet’进程、用来处理master节点下发到本节点的任务,管理pod和其中的容器,kubelet会在api server上注册节点信息,定期向master汇报节点资源使用情况,并通过cadvisor监控容器和节点资源,可以理解为sever、agent架构中的agent,是node节点上的pod管家

启动脚本/etc/systemd/system/kubelet.service(2)kube-proxy

运行在每个节点上,监听api-server中服务对象的变化,通过管理iptables实现网络转发,kube-proxy支持三种模式userspace(已淘汰)、iptables、ipvs,启动脚本/etc/systemd/system/kube-proxy.service。Iptables原理就是kube-proxy监听master节点service、endpoint的增加以及删除消息,对每一个service,proxy创建对应的iptable规则,将发送到service cluster ip的流量转发到service后端提供服务的pod相应端口上。ipvs对比iptables的效率会更高一些。

3、etcd

etcd是coreos团队2013发起的开源项目,基于狗眼,是一个高可用的分布式键值数据库。

特性:

完全复制:集群中的每个节点都可以使用完整的存档

高可用性:Etcd可用于避免硬件的单点故障或网络问题

一致性:每次读取都会返回跨多主机的最新写入

简单:包括一个定义良好、面向用户的API(gRPC)

安全:实现了带有可选的客户端证书身份验证的自动化TLS

快速:每秒10000次写入的基准速度

可靠:使用Raft算法实现了存储的合理分布Etcd的工作原理

(1)验证etcd成员状态:

export NODE_IPS="192.168.1.101 192.168.1.102 192.168.1.103"

for ip in NODEIPS;doETCDCTLAPI=3/usr/bin/etcdctlendpointhealthendpoints=https://{NODE_IPS}; do ETCDCTL_API=3 /usr/bin/etcdctl endpoint health --endpoints=https://{ip}:2379 --cacert=/etc/kubernetes/ssl/ca.pem -- cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem ; done

(2)数据备份恢复

etcdctl snapshot save snapshot.db

etcdctl snapshot restore snapshot.db --datadir=/opt/etcd-testdir #将数据恢复到一个新的不存在的目录中

到这里对于k8s集群的组件有一个初步了解了,赶快去实践吧,祝学习顺利!