- Pod的IP加上Pod内的容器的端口,就组成了一个新的概念-Endpoint,一个Endpoint代表着此Pod里的一个服务进程的对外通信地址。一个Pod可能存在多个Endpoint;
- K8s网络请求处理流程
- service 通常用作负载均衡器;Pod的创建和销毁都会实时更新Service的Endpoint数据;
- Service Ip+Port–iptables nat–>kube-proxy’s Socket Server[Endpoints]–endpoint–>Pod-ID+Container-Port
- iptables的nat转换
- Ingress,7层路由机制,用于将不同的URL的访问转发到后段不同的Service,以实现HTTP层的业务路由机制;Ingress也是一个负载均衡器;
- Kube-proxy和Service的关系?Ingress会使用户的请求跳过Kuke-proxy,直达Service对应的后段Endpoint(即Pod);
- kube-proxy进程获取每个Service的Endpoints,实现了Service的负载均衡;
- kube-proxy为整个集群中所有的Service在每个Node上建立一个“服务代理对象”,每个服务代理对象会随即选择一个本地空闲的端口,开启一个SocketServer监听此服务的请求;
- Ingress Controller,实现为所有的后端Service提供一个统一的入口;(Ingress模块提供的功能类似与Nginx,是一个反向代理,nginx-ingress-controller就是google使用nginx实现的Ingress Controller,截止到目前,只有nginx和gce的版本)
- Ingress->Service->Pods
- ClusterIP地址池
- Kubernetes Api Server是整个集群的数据中心,集群内的各个功能模块通过Api Server将信息存入etcd,当需要获取和操作这些数据时,则通过Api Server提供的REST接口来实现,从而实现各个模块间的信息交互;比如各个Node上的Kubelet每隔一个时间周期,就会调用一次Api Server的REST接口报告自身状态;
- k8s etcd 数据结构整理
- K8s Scheduler调度过程中涉及到三个对象,待调度Pod列表,可用Pod列表以及调度算法和策略。K8s Scheduler组件通过调度算法为待调度Pod列表中的每个Pod从Node列表中选择一个最合适的Node;
- K8s集群中,每个Node结点上都会启动一个kubelet服务进程,该进程用于处理master节点下发到本节点的任务,管理本节点上的Pod及Pod中的容器;与K8s Api Server交互完成这些功能;
- kubelet获取自身所要运行的Pod清单:kubelet通过Api Server Client使用Watch加List的方式监听“/registry/nodes/$当前节点”和“/registry/pods”目录,将获取的信息同步到本地缓存中;
- kubelet就是运行在Node上的k8s集群的代理
- heapster
- k8s Service的Ip地址是在Kubernetes的Portal Network中分配的,Portal Network的地址范围是在Kub Master上启动API服务进程时,使用–service-cluster-ip-range=xx命令行参数指定的;这个网段可以是任意的网段,只要不和docker0或者物理网络的子网冲突就可以;
- Container级别的资源限制,Pod级别的资源限制;Pod组级别的资源限制;Namesapce级别的资源限制;
- Kubuernetes本身实现的是应用的高可用;Kubernetes自身的高可用包括:etcd集群的高可用,etcd集群使用的存储的高可用,master(kube-apiserver,kube-controller-manager,kube-scheduler)三大件的高可用,kubelet的高可用通过操作系统的帮助完成;
参考
Kubernetes(k8s)代码解读-apiserver之list-watch篇