2.Service仅支持UDP和TCP协议,所以像ping的ICMP协议是用不了的,所以无法ping通Service IP。
3.Foreground 级联删除
在 foreground 级联删除 模式下,根对象首先进入 “删除中” 状态。在 “删除中” 状态会有如下的情况:
-
对象仍然可以通过 REST API 可见
-
会设置对象的 deletionTimestamp 字段
-
对象的 metadata.finalizers 字段包含了值 “foregroundDeletion”
一旦被设置为 “删除中” 状态,垃圾收集器会删除对象的所有 Dependent。垃圾收集器删除了所有 “Blocking” 的 Dependent(对象的 ownerReference.blockOwnerDeletion=true)之后,它会删除 Owner 对象。
注意,在 “foreground 删除” 模式下,Dependent 只有通过 ownerReference.blockOwnerDeletion 才能阻止删除 Owner 对象。在 Kubernetes 1.7 版本中将增加 admission controller,基于 Owner 对象上的删除权限来控制用户去设置 blockOwnerDeletion 的值为 true,所以未授权的 Dependent 不能够延迟 Owner 对象的删除。
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: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的同步工作。
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的启动状况。
1.Deployment的特性
-
Replication Controller全部功能:Deployment继承了上面描述的Replication Controller全部功能。
-
事件和状态查看:可以查看Deployment的升级详细进度和状态。
-
回滚:当升级pod镜像或者相关参数的时候发现问题,可以使用回滚操作回滚到上一个稳定的版本或者指定的版本。
-
版本记录: 每一次对Deployment的操作,都能保存下来,给予后续可能的回滚使用。
-
暂停和启动:对于每一次升级,都能够随时暂停和启动。
-
多种升级方案:Recreate:删除所有已存在的pod,重新创建新的; RollingUpdate:滚动升级,逐步替换的策略,同时滚动升级时,支持更多的附加参数,例如设置最大不可用pod数量,最小升级间隔时间等等。
2.各层负载均衡:
二层负载均衡:基于MAC地址的二层负载均衡。
三层负载均衡:基于IP地址的负载均衡。 kube-proxy, service endpoint
四层负载均衡:基于IP+端口的负载均衡。 nodePort
七层负载均衡:基于URL等应用层信息的负载均衡。 lb ingress
3. 设置系统参数 – 允许路由转发,不对bridge的数据进行处理
-
net.bridge.bridge-nf-call-ip6tables=1
-
net.bridge.bridge-nf-call-iptables=1
-
net.ipv4.ip_forward=1
-
vm.swappiness=0
4. 设置iptables的FORWARD链,Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables filter表中FOWARD链,这样会引起Kubernetes集群中跨Node的Pod无法通信。
-
iptables -P FORWARD ACCEPT
5. Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动。可以通过kubelet的启动参数--fail-swap-on=false更改这个限制。
6. 发送到docker0的请求,需要被无条件从docker0转发到容器eth0
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
7.