kubernetes笔记
来源:互联网 发布:js 设置高度 编辑:程序博客网 时间:2024/05/19 17:52
PVC
1.创建pvc时,会去查找最合适的pv(volumesize最接近,>=)跟pvc绑定,如果没有找到合适的pv,并且enableDynamicProvisioning为true,将会调用storageclass创建一个pv跟它绑定。
如果enableDynamicProvisioning为false,将等待用户创建pv跟它绑定
2.维护两个列表:pv和pvc
pv存在所有pv的状态和被绑定状态,pvc存放所有pvc的状态跟绑定状态
3.定时根据policy处理pv
kube-dns工作原理
如下图所示,kube-dns由三个容器构成:
kube-dns:DNS服务的核心组件,主要由KubeDNS和SkyDNS组成
KubeDNS负责监听Service和Endpoint的变化情况,并将相关的信息更新到SkyDNS中
SkyDNS负责DNS解析,监听在10053端口(tcp/udp),同时也监听在10055端口提供metrics
kube-dns还监听了8081端口,以供健康检查使用
dnsmasq-nanny:负责启动dnsmasq,并在配置发生变化时重启dnsmasq
dnsmasq的upstream为SkyDNS,即集群内部的DNS解析由SkyDNS负责
sidecar:负责健康检查和提供DNSmetrics(监听在10054端口)
1.Pod按照下面的顺序进行驱逐:
BestEffort:消耗最多紧缺资源的Pod最先失败。
Burstable:相对请求(request)最多紧缺资源的Pod最先被驱逐,如果没有Pod超出他们的请求,策略会瞄准紧缺资源消耗量最大的Pod。
Guaranteed:相对请求(request)最多紧缺资源的Pod最先被驱逐,如果没有Pod超出他们的请求,策略会瞄准紧缺资源消耗量最大的Pod
2.Label是识别Kubernetes对象的标签,以key/value的方式附加到对象上(key最长不能超过63字节,value可以为空,也可以是不超过253字节的字符串)。
Kubernetesapi server
kube-apiserver的启动:
1.调用genericapiserver.DefaultAndValidateRunOptions验证参数,包括验证集群ip,节点port,etcd服务等参数被有效设置了。
2.调用cloudprovider.InitCloudProvider()初始化CloudProvider
3.调用kubeletclient.NewStaticKubeletClient()创建kubeletclient,用于kubelet的健康检查
4.建立authenticator
5.调用admission.NewFromPlugins()创建服务许可框架和插件admissionController等
6.创建m,err := master.New(config),master实例,分别创建HTTPserver及安全的HTTPSServer开始监听客户端的请求。
kube-apiserver主要的作用:通过reset框架提供kubernetesapi server服务管理集群,如检验pod、service、rc的配置并将其储存到后端的etcdserver上。
Kube-controller-manager
controllermanager server其实就是一个超级调度中心,它负责定期同步node节点状态、资源使用配额信息、replicationcontroller、namespace\pod的pv绑定等信息,也包括执行诸如监控node节点状态、清除失败的pod容器记录等一系列定时任务。
进程启动过程:
1.调用client.New()创建一个restclient对象用于访问kubernetesapi server提供的API服务。
1.1创建一系列的client
2.调用http.Server()创建一个HTTPserver以提供必要的性能分析和性能指标度量的REST服务
3.调用endpointcontroller.NewEndpointController()创建的对象对注册表中kubernetesservice的endpoints信息的同步工作。
4.调用replicationcontroller.NewReplicationManager()创建的对象根据注册表中对replicationcontroller的定义,完成pod的复制或移除,以确保复制数量的一致性。
5.调用cloudprovider.InitCloudProvider创建cloudprovider的接口
6.调用nodecontroller.NewNodeController创建的对象通过cloudprovider的接口完成node实例的同步工作
7.调用servicecontroller.New()创建servicecontroller,servicecontroller通过cloudprovider的接口完成云平台中服务的同步工作,这些服务目前主要是外部的负载均衡服务。
8.调用resourcequotacontroller.NewResourceQuotaController()创建的对象负责资源配额使用情况的同步工作。
9.调用namespacecontroller.NewNamespaceController()创建的对象负责namespace的同步工作。
10.调用serviceaccountcontroller.NewTokensController()创建的对象负责token的同步工作
11.调用serviceaccountcontroller.NewServiceAccountsController()创建的对象负责account的同步工作。
replicationmanager的主要逻辑函数manageReplicas():
疑问:
1.add和delete对应的func一样
cache.ResourceEventHandlerFuncs{ AddFunc: e.queueServiceAccountSync, UpdateFunc: e.queueServiceAccountUpdateSync, DeleteFunc: e.queueServiceAccountSync,
2.cached不需要再次判断:
if obj, cached := rm.lookupCache.GetMatchingObject(pod); cached { controller, ok := obj.(*v1.ReplicationController) if !ok { // This should not happen glog.Errorf("lookup cache does not return a ReplicationController object") return nil } if cached && rm.isCacheValid(pod, controller) { return controller }}
ServiceAccount是Kubernetes用于集群内运行的程序,进行服务发现时调用API的帐号,帐号的token会直接挂载到Pod中,可以供程序直接使用。
总结
1.在pkg/api包里定义了restapi中涉及的资源对象,提供的rest接口、类型转换框架和具体转换函数、序列化反序列化等代码。其中,资源对象和转换函数按照版本分包,形成了kubernetesapi server基础的框架,其中核心是各类资源(如node\pod\podtemplate\service等)及这些资源对应的rest.storage(restapi接口)
2.在pkg/runtime包里最重要的对象是schema,它保存了kubernetesapiservice中注册的资源对象类型、转换函数等重要基础数据。另外,runtime包也提供了获取json/yaml序列化、反序列化的codec结构体,runtime总体上与pkg/api密切关联,分离出来的目的是供其它模块方便使用
3.pkg/registry包其实是把pkg/api中定义的各种资源对象所提供的rest接口进一步规范定义并且实现对应的接口,其中generate/etcd/etcd.go里的etcd对象是一个真正实现了rest.storage接口的基于etcd后段存储的服务框架,并且kubernetes中的各种资源对象的具体storage实现也是通过它来完成真正的后端存储操作
4.kubernetes采用了go-restful这个第三方的rest框架,大大简化了rest服务的开发,主要代码在pkg/apiserver资源包里。通过APIGroupVersion这个结构体可完成不同API版本的rest路径映射,而api_installer.go则实现了从kubernetesrest.storage接口到go-restful的映射连接逻辑,对应的rest.storage的具体restful.routefunction则在resthandler.go里实现。
Kubelet:
kubelet的启动
1.将kubeConfig、管理Pod和docker的参数、定期同步Pod和docker信息的参数导入到cfg中
2.根据cfg的属性创建多种Restclient对象访问kube-apiserver,如EventClient\discovery\kubeclient
3.根据cfg的属性创建cloudprovider,获取云供应商Cloud的资源。
4.根据cfg的属性创建cAdvisor来监控本地的Docker容器
5.根据cfg的属性创建ContainerManager来管理Docker容器
6.设置服务,防止发生OOM
7.开启垃圾回收协程以清理无用的容器和镜像,释放磁盘空间。
8.启动kubelet,创建PodSource对象拉取pod数据并汇总输出到同一个Podchannel中,kubelet启动协程监听podchannel中的数据并处理。
当前支持三种PodSource类型:
1.configfile:本地配置文件作为pod数据源
2.httpURL:pod数据源的内容通过一个HTTPUTL方式获取
3.kubernetesAPI server:默认方式,从APIserver中获取pod数据源。
9.启动kubelet服务的心跳机制,监听kubelet的启动状况。
- kubernetes笔记
- Kubernetes学习笔记---安装
- Kubernetes学习笔记---常用命令
- Kubernetes 学习笔记1
- Kubernetes 学习笔记2
- Kubernetes学习笔记---常用命令
- Kubernetes学习笔记(一)
- 学习笔记TF064:TensorFlow Kubernetes
- Kubernetes
- Kubernetes
- Kubernetes
- Kubernetes
- Kubernetes
- Kubernetes
- Kubernetes
- Kubernetes
- Kubernetes
- Kubernetes
- 使用java的spring定时执行任务
- 论文发表流程需要注意什么方面
- 9.2 机器人的 HTTP
- 不同操作系统下搭建服务器
- 518抽奖软件源码之:主窗口上含对话框时如何最小化
- kubernetes笔记
- Uva 10305 Ordering Tasks (用dfs 实现拓扑排序)
- PMOS开关管的选择与电路图
- curl 单线程请求
- Struts的两种驱动
- java发送带附件邮件
- 轻量级存储器 SharedPreferences
- 数据库表左连接查询首先一个表和3张表进行左连接查询,将查询的结果看做一张虚拟表,再将这个虚拟表,和另外一张表进行左连接查询
- 9.3 行为不当的机器人