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 | Kubernetes简介 Kubernetes API 服务器验证并配置 API 对象的数据, 这些对象包括 pods、services、replicationcontrollers 等。 API 服务器为 REST 操作提供服务,并为集群的共享状态提供前端, 所有其他组件都通过该前端进行交互。kube-apiserver [flags] 选项 --admission-control-config-file string 包含准入控制配置的文件。--advertise-address string 向集群成员通知 apiserver 消息的 IP 地址。 这个地址必须能够被集群中其他成员访问。 如果 IP 地址为空,将会使用 --bind-address, 如果未指定 --bind-address,将会使用主机的默认接口地址。 --aggregator-reject-forwarding-redirect 默认值:true 聚合器拒绝将重定向响应转发回客户端。--allow-metric-labels stringToString 默认值:[] 允许使用的指标标签到指标值的映射列表。键的格式为 ,. 值的格式为 ,...。 例如:metric1,label1='v1,v2,v3', metric1,label2='v1,v2,v3' metric2,label1='v1,v2,v3'。 --allow-metric-labels-manifest string 包含允许列表映射的清单文件的路径。此文件的格式与 --allow-metric-labels 相同。 请注意,--allow-metric-labels 标志将覆盖清单文件。 --allow-privileged 如果为 true,将允许特权容器。[默认值=false] --anonymous-auth 默认值:true 启用针对 API 服务器的安全端口的匿名请求。 未被其他身份认证方法拒绝的请求被当做匿名请求。 匿名请求的用户名为 system:anonymous, 用户组名为 system:unauthenticated。 --api-audiences strings API 的标识符。 服务帐户令牌验证者将验证针对 API 使用的令牌是否已绑定到这些受众中的至少一个。 如果配置了 --service-account-issuer 标志,但未配置此标志, 则此字段默认为包含发布者 URL 的单个元素列表。 --audit-log-batch-buffer-size int 默认值:10000 批处理和写入事件之前用于缓存事件的缓冲区大小。 仅在批处理模式下使用。 --audit-log-batch-max-size int 默认值:1 每个批次的最大大小。仅在批处理模式下使用。 --audit-log-batch-max-wait duration 强制写入尚未达到最大大小的批次之前要等待的时间。 仅在批处理模式下使用。 --audit-log-batch-throttle-burst int 如果之前未使用 ThrottleQPS,则为同时发送的最大请求数。 仅在批处理模式下使用。 --audit-log-batch-throttle-enable 是否启用了批量限制。仅在批处理模式下使用。 --audit-log-batch-throttle-qps float 每秒的最大平均批次数。仅在批处理模式下使用。 --audit-log-compress 若设置了此标志,则被轮换的日志文件会使用 gzip 压缩。 --audit-log-format string 默认值:"https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-apiserver/
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简介
kube-scheduler | Kubernetes简介 Kubernetes 调度器是一个控制面进程,负责将 Pods 指派到节点上。 调度器基于约束和可用资源为调度队列中每个 Pod 确定其可合法放置的节点。 调度器之后对所有合法的节点进行排序,将 Pod 绑定到一个合适的节点。 在同一个集群中可以使用多个不同的调度器;kube-scheduler 是其参考实现。 参阅调度以获得关于调度和 kube-scheduler 组件的更多信息。kube-scheduler [flags] 选项 --allow-metric-labels stringToString 默认值:[] 这个键值映射表设置度量标签所允许设置的值。 其中键的格式是 ,。 值的格式是 ,。 例如:metric1,label1='v1,v2,v3', metric1,label2='v1,v2,v3' metric2,label1='v1,v2,v3'。 --allow-metric-labels-manifest string 包含允许列表映射的清单文件的路径。此文件的格式与 --allow-metric-labels 标志相同。 请注意,--allow-metric-labels 标志将覆盖此清单文件。 --authentication-kubeconfig string 指向具有足够权限以创建 tokenaccessreviews.authentication.k8s.io 的 Kubernetes 核心服务器的 kubeconfig 文件。 这是可选的。如果为空,则所有令牌请求均被视为匿名请求,并且不会在集群中查找任何客户端 CA。 --authentication-skip-lookup 如果为 false,则 authentication-kubeconfig 将用于从集群中查找缺少的身份验证配置。 --authentication-token-webhook-cache-ttl duration 默认值:10s 缓存来自 Webhook 令牌身份验证器的响应的持续时间。 --authentication-tolerate-lookup-failure 默认值:true 如果为 true,则无法从集群中查找缺少的身份验证配置是致命的。 请注意,这可能导致身份验证将所有请求视为匿名。 --authorization-always-allow-paths strings 默认值:"/healthz,/readyz,/livez" 在授权过程中跳过的 HTTP 路径列表,即在不联系 “core” kubernetes 服务器的情况下被授权的 HTTP 路径。 --authorization-kubeconfig string 指向具有足够权限以创建 subjectaccessreviews.https://kubernetes.io/zh/docs/reference/command-line-tools-reference/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简介
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-controller-manager/https://kubernetes.io/zh/docs/reference/command-line-tools-reference/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简介
https://kubernetes.io/zh/docs/tasks/administer-cluster/configure-upgrade-etcd/https://kubernetes.io/zh/docs/tasks/administer-cluster/configure-upgrade-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简介
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-proxy/https://kubernetes.io/zh/docs/reference/command-line-tools-reference/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简介
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet/https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet/
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/command-line-tools-reference/kubelet/https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet/
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组件
https://kubernetes.io/zh/docs/tasks/access-application-cluster/web-ui-dashboard/https://kubernetes.io/zh/docs/tasks/access-application-cluster/web-ui-dashboard/
Dashboard:
https://kubernetes.io/zh/docs/tasks/access-application-cluster/web-ui-dashboard/
Dashboard是基于网页的Kubernetes用户界面,可以使用Dashboard获取运行在集群中的应用的概览信息,也可以创建或者修改
Kubernetes资源(如 Deployment,Job,DaemonSet 等等),也可以对Deployment实现弹性伸缩、发起滚动升级、删除 Pod 或
者使用向导创建新的应用。