kubernetes笔记

来源:互联网 发布:js 设置高度 编辑:程序博客网 时间:2024/05/19 17:52

PVC

1.创建pvc时,会去查找最合适的pvvolumesize最接近,>=)跟pvc绑定,如果没有找到合适的pv,并且enableDynamicProvisioningtrue,将会调用storageclass创建一个pv跟它绑定。

如果enableDynamicProvisioningfalse,将等待用户创建pv跟它绑定

2.维护两个列表:pvpvc

pv存在所有pv的状态和被绑定状态,pvc存放所有pvc的状态跟绑定状态

3.定时根据policy处理pv


kube-dns工作原理

如下图所示,kube-dns由三个容器构成:

  • kube-dnsDNS服务的核心组件,主要由KubeDNSSkyDNS组成

    • KubeDNS负责监听ServiceEndpoint的变化情况,并将相关的信息更新到SkyDNS

    • SkyDNS负责DNS解析,监听在10053端口(tcp/udp),同时也监听在10055端口提供metrics

    • kube-dns还监听了8081端口,以供健康检查使用

  • dnsmasq-nanny:负责启动dnsmasq,并在配置发生变化时重启dnsmasq

    • dnsmasqupstreamSkyDNS,即集群内部的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,节点portetcd服务等参数被有效设置了。

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服务管理集群,如检验podservicerc的配置并将其储存到后端的etcdserver上。


Kube-controller-manager

controllermanager server其实就是一个超级调度中心,它负责定期同步node节点状态、资源使用配额信息、replicationcontrollernamespace\podpv绑定等信息,也包括执行诸如监控node节点状态、清除失败的pod容器记录等一系列定时任务。

进程启动过程:

1.调用client.New()创建一个restclient对象用于访问kubernetesapi server提供的API服务。

1.1创建一系列的client

2.调用http.Server()创建一个HTTPserver以提供必要的性能分析和性能指标度量的REST服务

3.调用endpointcontroller.NewEndpointController()创建的对象对注册表中kubernetesserviceendpoints信息的同步工作。

4.调用replicationcontroller.NewReplicationManager()创建的对象根据注册表中对replicationcontroller的定义,完成pod的复制或移除,以确保复制数量的一致性。

5.调用cloudprovider.InitCloudProvider创建cloudprovider的接口

6.调用nodecontroller.NewNodeController创建的对象通过cloudprovider的接口完成node实例的同步工作

7.调用servicecontroller.New()创建servicecontrollerservicecontroller通过cloudprovider的接口完成云平台中服务的同步工作,这些服务目前主要是外部的负载均衡服务。

8.调用resourcequotacontroller.NewResourceQuotaController()创建的对象负责资源配额使用情况的同步工作。

9.调用namespacecontroller.NewNamespaceController()创建的对象负责namespace的同步工作。

10.调用serviceaccountcontroller.NewTokensController()创建的对象负责token的同步工作

11.调用serviceaccountcontroller.NewServiceAccountsController()创建的对象负责account的同步工作。


replicationmanager的主要逻辑函数manageReplicas()

疑问:

1.adddelete对应的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       }}



ServiceAccountKubernetes用于集群内运行的程序,进行服务发现时调用API的帐号,帐号的token会直接挂载到Pod中,可以供程序直接使用。

总结

1.pkg/api包里定义了restapi中涉及的资源对象,提供的rest接口、类型转换框架和具体转换函数、序列化反序列化等代码。其中,资源对象和转换函数按照版本分包,形成了kubernetesapi server基础的框架,其中核心是各类资源(如node\pod\podtemplate\service等)及这些资源对应的rest.storagerestapi接口)

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、管理Poddocker的参数、定期同步Poddocker信息的参数导入到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.httpURLpod数据源的内容通过一个HTTPUTL方式获取

3.kubernetesAPI server:默认方式,从APIserver中获取pod数据源。

9.启动kubelet服务的心跳机制,监听kubelet的启动状况。



原创粉丝点击