kubernetes 基本介绍
kubernetes 组件简介
- master:
主人,并不部署服务,而是管理salve节点。
后期更名为: controll plane,控制面板。
etcd:
2379(客户端通信)、2380(集群内部通信)
KEY-VALUE键值对数据库,基于Go语言开发。并不是K8S官方的组件,而是使用了开源项目etcd数据库。
主要作用为K8S存储数据,支持以集群的方式部署。
默认监听的端口: 2379~2380
api-server:
是K8S集群控制的访问入口,说白了,维护者用于控制K8S的入口。
默认监听的端口: 8080(http) | 6443(https,默认)
scheduler:
默认端口:10251
负责容器调度到哪些worker node节点。
controller manager:
默认端口:10252
控制器管理者,维护集群状态。
- slave:
奴隶。部署实际的服务,以供客户端访问。
后期更名为:worker node, 工作节点
kubelet:
端口(10248)
10250(kubelet API)、10255(只读端口,用于获取节点信息)
负责K8S的容器的生命周期(包括但不限于创建,删除,修改,监控),并监控容器上报给api-server。
kube-proxy:
默认端口:10256(通常用于NodePort服务的端口映射)
负责为找到容器的IP提供负载均衡,可以理解为用于为容器提供统一的访问入口,优点类似于负载均衡器的效果。
底层支持: iptables和ipvs工作模式,生产环境中推荐大家使用ipvs模式。
- CNI:
为容器提供跨主机节点通信的网络。
kubernetes API Server简介
kube-apiserver:
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-apiserver/
Kubernetes API server 提供了k8s各类资源对象的增删改查及watch等HTTP Rest接口,这些对象包括pods、services、
replicationcontrollers等,API Server为REST操作提供服务,并为集群的共享状态提供前端,所有其他组件都通过该前端进行交互。
RESTful API: 是REST风格的网络接口,REST描述的是在网络中client和server的一种交互形式
REST:是一种软件架构风格,或者说是一种规范,其强调HTTP应当以资源为中心,并且规范了URI的风格,规范了HTTP请求动作
(GET/PUT/POST/DELETE/HEAD/OPTIONS)的使用,具有对应的语义。
https://github.com/Arachni/arachni/wiki/REST-API
该端口默认值为6443,可通过启动参数"-- secure-port"的值来修改默认值。
默认监听IP为0.0.0.0及本机所有IP,可以通过
启动参数"--bind-address"设置监听指定的
内网IP。
该端口用于接收客户端、dashboard等外部
HTTPS请求。
实现基于Tocken文件或客户端证书及HTTP
Base的认证。
实现基于策略的账户鉴权及准入。
客户端通过API Server实现对kubernetes的API
远程以实现对kubernetes内部资源的增删改查
等管理任务的分发
#API的版本:
Alpha:预览版,可能包含bug或错误,后期版本会修复且不兼容之前的版本,不建议使用。
Beta:测试版,如storage.k8s.io/v1beta1,该版本可能存在不稳定或者潜在的bug,不建议生产使用
v1/v2/vX: 稳定版,如apps/v1,经过验证的stable版本,可以生产环境使用
kubernetes API测试
# curl --cacert /etc/kubernetes/ssl/ca.pem -H "Authorization: Bearer ${TOKEN}" https://172.31.7.101:6443
# curl 127.0.0.1:6443/ #返回所有的API列表
# curl 127.0.0.1:6443/apis #分组API
# curl 127.0.0.1:6443/api/v1 #带具体版本号的API
# curl 127.0.0.1:6443/version #API版本信息
# curl 127.0.0.1:6443/healthz/etcd #与etcd的心跳监测
# curl 127.0.0.1:6443/apis/autoscaling/v1 #指定API的详细信息
# curl 127.0.0.1:6443/metrics #指标数据
kube-scheduler简介
通过调度算法为待调度Pod列表的每个Pod从可用Node列表中选择一个最适合的Node,并将信息写入etcd中。
node节点上的kubelet通过API Server监听到kubernetes Scheduler产生的Pod绑定信息,然后获取对应的Pod清单,下载Image,
并启动容器。
kube-scheduler:
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-scheduler/
kube-scheduler是一个控制面(管理)进程,负责将 Pods 按照一定的调度策略指派到目的节点上。
阶段一:预选策略
NoDiskConflict:
Pod所需的卷是否和节点已存在的卷冲突。
PodFitsResources:
判断备选节点的资源是否满足备选Pod的需求。
PodSelectorMatches:
判断备选节点是否包含备选pod的标签选择器指定的标签
MatchInterPodAffinity:
节点亲和性筛选
PodToleratesNodeTaints
根据 taints 和 toleration 的关系判断Pod是否可以调度到节点上Pod是否
满足节点容忍的一些条件。
阶段二:优选策略
LeastRequestedPriority
优先从备选节点列表中选择资源消耗最小的节点(CPU+内存)。
CalculateNodeLabelPriority
优先选择含有指定Label的节点。
BalancedResourceAllocation
优先从备选节点列表中选择各项资源使用率最均衡的节点。
TaintTolerationPriority
使用 Pod 中 tolerationList 与 节点 Taint 进行匹配并实现pod调度
kube-controller-manager简介
kube-controller-manager:
kube-controller-manager:Controller Manager还包括一些子控制器(副本控制器、节点控制器、命名空间控制器和服务账号控制器等),
控制器作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号
(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复
流程,确保集群中的pod副本始终处于预期的工作状态。
controller-manager控制器每间隔5秒检查一次节点的状态。
如果controller-manager控制器没有收到自节点的心跳,则将该node节点被标记为不可达。
controller-manager将在标记为无法访问之前等待40秒。
如果该node节点被标记为无法访问后5分钟还没有恢复,controller-manager会删除当前node节点的所有pod并在其它可用节点重建这些
pod。
kube-controller-manager基于--leader-elect=true 启动参数实现多节点高可用,会自动选举leader,
原理是有一把分布式锁,哪个节点先抢到锁谁就是leader(基于hostname设置为锁的持有者),leader需要定
期更新自己持有的锁状态,如超时未更新则会触发新的leader选举。
pod 高可用机制:
node monitor period: 节点监视周期,5s
node monitor grace period: 节点监视器宽限
期,40s
pod eviction timeout: pod驱逐超时时间,5m
etcd简介
etcd:
https://kubernetes.io/zh/docs/tasks/administer-cluster/configure-upgrade-etcd/
etcd 是CoreOS公司开发目前是Kubernetes默认使用的key-value数据存储系统,用于保存kubernetes的所有集群数据,etcd支持
分布式集群功能,生产环境使用时需要为etcd数据提供定期备份机制。
https://etcd.io/ #官网
https://github.com/etcd-io/etcd #github
kube-proxy简介
kube-proxy:
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-proxy/
kube-proxy:Kubernetes 网络代理运行在 node 上,它反映了 node 上 Kubernetes API 中定义的服务,并可以通过一组后端进行简单的 TCP、UDP
和 SCTP 流转发或者在一组后端进行循环 TCP、UDP 和 SCTP 转发,用户必须使用 apiserver API 创建一个服务来配置代理,其实就是kube-proxy通过
在主机上维护网络规则并执行连接转发来实现Kubernetes服务访问。
kube-proxy 运行在每个节点上,监听 API Server 中服务对象的变化,再通过管理 IPtables或者IPVS规则 来实现网络的转发。
Kube-Proxy 不同的版本可支持三种工作模式:
UserSpace:k8s v1.1之前使用,k8s 1.2及以后就已经淘汰
IPtables : k8s 1.1版本开始支持,1.2开始为默认
IPVS: k8s 1.9引入到1.11为正式版本,需要安装ipvsadm、ipset 工具包和加载 ip_vs 内核模块
IPVS 相对 IPtables 效率会更高一些,使用 IPVS 模式需要在运行 Kube-Proxy 的节点上安装 ipvsadm、ipset 工具包和加载 ip_vs 内
核模块,当 Kube-Proxy 以 IPVS 代理模式启动时,Kube-Proxy 将验证节点上是否安装了 IPVS 模块,如果未安装,则 Kube-Proxy
将回退到 IPtables 代理模式。
使用IPVS模式,Kube-Proxy会监视Kubernetes Service对象和Endpoints,调用宿主机内核Netlink接口以相应地创建IPVS规则并定
期与Kubernetes Service对象 Endpoints对象同步IPVS规则,以确保IPVS状态与期望一致,访问服务时,流量将被重定向到其中一
个后端 Pod,IPVS使用哈希表作为底层数据结构并在内核空间中工作,这意味着IPVS可以更快地重定向流量,并且在同步代理规则时
具有更好的性能,此外,IPVS 为负载均衡算法提供了更多选项,例如:rr (轮询调度)、lc (最小连接数)、dh (目标哈希)、sh (源哈希)、
sed (最短期望延迟)、nq(不排队调度)等。
kubernetes v1.11之后默认使用IPVS,默认调度算法为rr。
kubelet简介
kubelet:
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet/
kubelet是运行在每个worker节点的代理组件,
它会监视已分配给节点的pod,具体功能如下:
向master汇报node节点的状态信息
接受指令并在Pod中创建 docker容器
准备Pod所需的数据卷
返回pod的运行状态
在node节点执行容器健康检查
kubectl简介
kubelet:
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet/
kubelet是运行在每个worker节点的代理组件,
它会监视已分配给节点的pod,具体功能如下:
向master汇报node节点的状态信息
接受指令并在Pod中创建 docker容器
准备Pod所需的数据卷
返回pod的运行状态
在node节点执行容器健康检查
kubectl:
https://kubernetes.io/zh/docs/reference/kubectl/kubectl/
是一个通过命令行对kubernetes集群
进行管理的客户端工具。
kubectl 在 $HOME/.kube 目录中查
找一个名为 config 的配置文件。 你
可以通过设置 KUBECONFIG 环境变
量或设置 --kubeconfig参数来指定其
它 kubeconfig 文件。
DNS组件
https://kubernetes.io/zh/docs/tasks/administer-cluster/dns-custom-nameservers/
DNS:
https://kubernetes.io/zh/docs/tasks/administer-cluster/dns-custom-nameservers/
DNS负责为整个集群提供DNS服务,从而实现服务之间的访问。
coredns
kube-dns: 1.18
sky-dns
Dashboard组件
Dashboard:
https://kubernetes.io/zh/docs/tasks/access-application-cluster/web-ui-dashboard/
Dashboard是基于网页的Kubernetes用户界面,可以使用Dashboard获取运行在集群中的应用的概览信息,也可以创建或者修改
Kubernetes资源(如 Deployment,Job,DaemonSet 等等),也可以对Deployment实现弹性伸缩、发起滚动升级、删除 Pod 或
者使用向导创建新的应用。