k8s组件

k8s组件:

集群组件调用逻辑:

image-20220726153546168

无标题


master节点组件:

kube-apiserver:

官方文档:https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-apiserver/

用于对pod进行操作、下发指令,所有操作都要到apiserver
Kubernetes-API服务器验证并配置API对象的数据,这些对象包括pods、services、deployment(pod控制器)等
API服务器为REST操作提供服务,并为集群的共享状态提供前端,所有其他组件都通过该前端进行交互

非安全端口:

默认监听127.0.0.1:8080,有NodeLocal DNSCache的时候是监听169.254.20.10:8080
通过--insecure-bind-address、--insecure-port 修改地址和端口
非认证或未授权的http请求通过此端口访问api-server

安全端口:

默认监听127.0.0.1:6443。通过--bing-address=ip、 --secure-port=端口 修改
接收https请求,tonken文件、客户端证书、http base认证、策略的授权

API访问:

官方文档: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/

127.0.0.1:8080			#http请求地址和端口

/apis						#分组api
/api/v1					#带具体版本号的api
/							#返回核心列表
/version					#api版本
/healthz/etcd			#与etcd的心跳检测
/autoacaling/v1		#api的详细信息
/metrics					#指标数据

kube-controller-manager:

通过给定一个期望值,控制器通过监控集群的公共状态,将现有状态转为期望值
每个控制器都是一个单独的进程,但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行

端口: 10252

功能:

​ 作为集群内部的管理控制中心,负责集群内的node、pod副本、服务端点(EndPoint访问端口)、命名空间(NamesSpace)服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个node意外宕机时,管理控制器会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态

控制器类型:
  • 节点(Node)控制器
  • Pod控制器:创建pod以及维护pod后续状态
  • 副本(Replication)控制器: 负责维护系统中每个副本中的pod
  • 端点(Endpoints)控制器: 填充Endpoints对象(连接Services&Pods)
  • Service Account和Token控制器: 为新的Namespace创建默认帐户访问API Token
  • 任务(Job)控制器: 监测代表一次性任务的Job对象,然后创建Pods来运行这些任务直至完成
管理命令:

kube-controller-manager [flags]

常用控制器:

​ Deployment
​ DaemonSet


kube-scheduler:

后面单独写此调度器

功能:
  • 调度器,对pod的创建的调度,根据一些列规则调度
  • 拥有丰富策略,能够感知拓扑变化、支持特定负载的功能组件。对集群的高可用、性能表现、容量的影响都巨大
  • scheduler要考虑独立的和集体的资源需求、服务质量需求、硬件/软件的策略限制、亲和与反亲和规范(使用优先级)、数据位置、内部负载接口、截止时间等等(特定的负载需求可通过api暴露出来)
工作原理:
  • 调度是指将Pod放置到合适的Node上,然后对应Node上的Kubelet才能够运行这些pod
  • 调度器通过watch机制来发现集群中新创建的pod,调度器会将未调度的pod分配到一个合适的node上运行,如果没有一个node能满足pod的运行要求,那么此pod会一直标记在未调度状态,直到调度器找到合适node
调度流程:
  1. 过滤: 根据pod的运行要求,在所以node上过滤一遍,满足要求的为可调度节点
  2. 打分: 调度器使用一系列函数对可调度节点打分,得分最高的node来运行pod(有多个最高分node则随机选),之后,调度器将这个调度决定通知给kube-apiserver,这个过程叫做绑定
调度策略:
  • 过滤的断言(Predicates)
  • 打分的优先级(Priorities)
调度配置:
  • 不同调度阶段的插件,包括:QueueSort,Filter, Score, Bind, Reserve, Permit 等等
  • 也可以配置kube-scheduler运行不同的配置文件

etcd:

githubhttps://github.com/etcd-io/etcd

k8s默认使用的key:value数据存储系统,保存所有集群数据,支持分布式集群功能,生产环境中需要为etcd数据提供备份计划
数据完全复制,集群中每个节点可作为完整的存档
用于共享配置和服务发现
在用kubeadm部署k8s集群的时候,会默认做etcd集群,每个master运行一个etcd;kubeadz则单独指定
监控数据变化,会主动通知客户端(api-server);可以监控一个指定key,也可以监控一个范围

端口:

  • 2379 客户端访问端口,客户端消息通告
  • 2380 集群间数据同步、消息通告
客户端命令etcdctl:

etcdctl 子命令

member list	-w table				#查看集群列表
get  / --prefix --keys-only			#显示所有key的名称
put /hj "123456"					#写入数据
del /hj								#删除数据
数据备份与恢复:

备份的目录必须是空的
如果ectd集群挂掉,需要先停掉k8s集群的所有组件,恢复etcd的数据,再启动所有组件
WAL日志: 执行写操作之前,先记录到日志中

例1:etcdctl工具备份
#备份数据
etcdctl snapshot save bak.db
				
#恢复数据,指定的恢复目录/opt/etcd 必须为空
etcdctl snapshot restore bak.db --data-dir=/opt/etcd
例2: ezctl工具备份
#虽然是部署的工具,但备份是备份的etcd数据
./ezctl backup k8s-01
./ezctl restore k8s-01

node节点组件:

kubelet:

功能:
  • 一个在集群中每个节点(node)上运行的代理。它保证容器(containers)都运行在Pod中

  • 向master汇报node节点的状态信息

  • 接收指令并在pod中创建docker容器

  • 准备pod所需的数据卷

  • 返回pod的运行状态

  • 在node节点执行容器监控检查

工作原理:
  • kubelet接收一组通过各类机制提供给它的PodSpecs,确保这些PodSpecs中描述的容器处于运行状态且健康。kubelet不会管理不是由Kubernetes创建的容器
  • 在api-server中注册节点信息,定期汇报节点资源使用,并通过cadvisor(顾问)监控容器和节点资源

kube-proxy:

维护node节点上的网络规则,监听api-server中svc对象的变化,若变动kube-proxy就会使用控制器调整
通过ipvs和iptables来实现网络转发、隔离。管理员需要指定service和node主机port的对应关系
使用iptables时,ping不通clusterIP,但ipvs可以

功能:

  • 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与Pod进行网络通信
  • 如果操作系统提供了数据包过滤层并可用的话,kube-proxy会通过它来实现网络规则。否则,kube-proxy仅转发流量本身
  • 网络代理运行在node上,反应了node上的kubernetesAPI中定义的服务,并可以对一组后端pod进行简单的tcp、udp流转或转发或循环模式(round robin)
  • 用户必须使用apiserverAPI创建一个服务来配置代理,也就是kube-proxy通过在主机上维护网络规则并执行连接转发来实现Kubernetes服务访问
三种工作模式:
userspace:

客户端pod请求服务端pod,先经过本地iptables,再发给本地的kube-proxy,再通过serviceIP(iptables规则),调度到远端pod

iptables:

客户端pod请求服务端pod时,先经过本地的iptables,通过后直接到达服务端pod

ipta

ipvs:

客户端pod请求服务端pod时,先经过内核空间的ipvs(内核netlink接口),调度后直接到远端node的ipvs,再交给服务端pod
定期与svc和endpoints对象同步ipvs规则
使用ipvs模式时,由ipvs调度,由iptables进行网络隔离(不同ns间不可访问)

ipv

修改调度算法:

vim /etc/systemd/system/kube-proxy.service
ExecStart=/opt/kube/bin/kube-proxy \
	--ipvs-scheduler=算法					#常用的rr、lc、sh都可以

systemctl daemon-reload && systemctl restart kube-proxy

CRI:

容器运行时,在k8s中运行pod的程序

常见容器运行时:
docker
rkt
containerd

posted @ 2022-09-02 15:08  suyanhj  阅读(90)  评论(0编辑  收藏  举报