kubelete的架构图

分类: 云计算 |
kubelete的架构图:
kubelet:负责Pod的生命周期管理,同时与Master密切协作,实现集群管理的基本功能。
kube-proxy:实现Service的通信与负载均衡机制的重要组件,老版本主要通过设置iptables规则实现,新版1.9基于kube-proxy-lvs
实现。
Docker
Engine:Docker引擎,负责Docker的生命周期管理。
https://img-blog.csdn.net/20180304205656579?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRHVzdGluX0NEUw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70
Service:
K8s中一个Service相当于一个微服务的概念,一个Service对应后端多个Pod计算实例,使用LabelSelector将一类Pod都绑定到自己上来。一般还会需要一下·务能力和质量。
kube-proxy的原理:
运行在每个Node上的kube-proxy其实就是一个智能的软件负载均衡器,它负载将发给Service的请求转发到后端对应的Pod,也就是说它负责会话保持和负责均衡。
Cluster IP
负载均衡的基础是负载均衡器要维护一个后端Endpoint列表,但是Pod的Endpoint会随着Pod的销毁和重建而改变,k8s使这个问题透明化。一旦Service被创建,就会立刻分配给它一个Cluster
IP,在Service的整个生命周期内,这个Cluster IP不会改变。于是,服务发现的问题也解决了:只要用Service
Name和Service Cluster IP做一个DNS域名映射就可以了
DNS:
外部访问Service的问题:
先明确这样几个IP:
Node IP:Node主机的IP,与它是否属于K8s无关。
Pod IP:是Dokcer
Engine通过docker0网桥的IP地址段进行分配的,通常是一个虚拟的二层网络。k8s中一个Pod访问另一个Pod就是通过Pod
IP。
Cluster IP:仅用于Service对象,属于k8s的内部IP,外界无法直接访问。
(1)NodePort
在Service的yaml中定义NodePort,k8s为集群中每个Node都增加对这个端口的监听,使用这种方式往往需要一个独立与k8s之外的负载均衡器作为流量的入口。
(2)使用External IP
运行Hello World应用程序的五个实例。
创建一个暴露外部IP地址的Service对象。使用Service对象访问正在运行的应用程序。
高可用
Etcd高可用方案
Etcd使用raft算法将一组主机组成集群,raft
集群中的每个节点都可以根据集群运行的情况在三种状态间切换:follower, candidate 与 leader。leader 和
follower
之间保持心跳。如果follower在一段时间内没有收到来自leader的心跳,就会转为candidate,发出新的选主请求。
Master高可用方案
Master上有三个关键的服务:apiserver、controller-manager和scheduler,这三个不一定要运行在一台主机上。
Kubernetes中实现了一套简单的选主逻辑,依赖Etcd实现scheduler和controller-manager的选主功能。
如果scheduler和controller-manager在启动的时候设置了leader-elect参数,它们在启动后会先尝试获取leader节点身份,只有在获取leader节点身份后才可以执行具体的业务逻辑。它们分别会在Etcd中创建kube-scheduler和kube-controller-manager的endpoint,endpoint的信息中记录了当前的leader节点信息,以及记录的上次更新时间。leader节点会定期更新endpoint的信息,维护自己的leader身份。每个从节点的服务都会定期检查endpoint的信息,如果endpoint的信息在时间范围内没有更新,它们会尝试更新自己为leader节点。
apiserver的高可用
Kubernetes的接入层服务主要是kube-apiserver。apiserver本身是无状态的服务,它的主要任务职责是把资源数据存储到Etcd中,后续具体的业务逻辑是由scheduler和controller-manager执行的。
容器网络
3.1 docker默认容器网络
在默认情况下会看到三个网络,它们是Docker
Deamon进程创建的。它们实际上分别对应了Docker过去的三种『网络模式』,可以使用docker network
ls来查看:
1
2
3
4
5
这 3 个网络包含在 Docker 实现中。运行一个容器时,可以使用 the
–net标志指定您希望在哪个网络上运行该容器。您仍然可以使用这 3 个网络。
bridge
网络表示所有 Docker 安装中都存在的 docker0 网络。除非使用 docker run –net=选项另行指定,否则
Docker 守护进程默认情况下会将容器连接到此网络。在主机上使用
ifconfig命令,可以看到此网桥是主机的网络堆栈的一部分。
none
网络在一个特定于容器的网络堆栈上添加了一个容器。该容器缺少网络接口。
host
网络在主机网络堆栈上添加一个容器。您可以发现,容器中的网络配置与主机相同。
Flannel
flannel是CoreOS提供用于解决Dokcer集群跨主机通讯的覆盖网络工具。它的主要思路是:预先留出一个网段,每个主机使用其中一部分,然后每个容器被分配不同的ip;让所有的容器认为大家在同一个直连的网络,底层通过UDP/VxLAN等进行报文的封装和转发。