k8s组件
k8s组件:
集群组件调用逻辑:
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
调度流程:
- 过滤: 根据pod的运行要求,在所以node上过滤一遍,满足要求的为可调度节点
- 打分: 调度器使用一系列函数对可调度节点打分,得分最高的node来运行pod(有多个最高分node则随机选),之后,调度器将这个调度决定通知给kube-apiserver,这个过程叫做绑定
调度策略:
- 过滤的断言(Predicates)
- 打分的优先级(Priorities)
调度配置:
- 不同调度阶段的插件,包括:QueueSort,Filter, Score, Bind, Reserve, Permit 等等
- 也可以配置kube-scheduler运行不同的配置文件
etcd:
github: https://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
ipvs:
客户端pod请求服务端pod时,先经过内核空间的ipvs(内核netlink接口),调度后直接到远端node的ipvs,再交给服务端pod
定期与svc和endpoints对象同步ipvs规则
使用ipvs模式时,由ipvs调度,由iptables进行网络隔离(不同ns间不可访问)
修改调度算法:
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