1,master节点。
Master是Kubernetes Cluster的大脑,运行着的Daemon服务有一下几个:
- kube-apiserver
- kube-scheduler
- kube-controller-manager
- etcd
- Pod 网络(例如 flannel)
如图所示:
接下来就一个一个介绍如上组件的功能。
1,API Server(kube-apiserver)
2,Scheduler(kube-scheduler)
3,Controller Manager(kube-controller-manager)
不同的 controller 管理不同的资源。例如 replication controller 管理 Deployment、StatefulSet、DaemonSet 的生命周期,namespace controller 管理 Namespace 资源。
4,etcd
5,Pod 网络
2,Node节点。
Node 是 Pod 运行的地方,Kubernetes 支持 Docker、rkt 等容器 Runtime。 Node上运行的 Kubernetes 组件有:
- kubelet
- kube-proxy
- Pod 网络(例如 flannel)
如图所示:
1,kubelet
2,kube-proxy
每个 Node 都会运行 kube-proxy 服务,它负责将访问 service 的 TCP/UPD 数据流转发到后端的容器。如果有多个副本,kube-proxy 会实现负载均衡。
3,Pod 网络
3,集群架构。
将如上讲解的架构汇总起来,组成一个集群,就是k8s集群了,我们先看一张集群完整架构图:
这里在k8s-master 上也加有 kubelet 和 kube-proxy ,是因为在k8s集群中,master既可以作为管理节点,也能够担任work节点。
有时部署的时候也可能将Scheduler等控制组件部署在node节点,这是为了高可用着想,如此一来,集群每个节点都是master,同时也都是node,任意一个节点出了问题,都能够被一些高可用的方案,所避免服务的宕机。
4,通过实例理解架构工作流程
现在来通过构建一个实例,来理解整个集群工作的流程。
执行如下命令:
kubectl run nginx-ds --image=nginx --replicas=2
等待一段时间,可以查看一下部署成功:
$kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-ds-fbx76 1/1 Running 0 2d 172.30.84.2 kube-node1 nginx-ds-jbjzg 1/1 Running 0 2d 172.30.8.2 kube-node2
Kubernetes 部署了 deployment nginx-ds,有两个副本 Pod,分别运行在 kube-node1 和 kube-node2。
详细部署流程如图所示:
- 1,kubectl 发送部署请求到 API Server。
- 2,API Server 通知 Controller Manager 创建一个 deployment 资源。
- 3,Scheduler 执行调度任务,将两个副本 Pod 分发到 k8s-node1 和 k8s-node2。
- 4,k8s-node1 和 k8s-node2 上的 kubelet 在各自的节点上创建并运行 Pod。
另:
- 应用的配置和当前状态信息保存在 etcd 中,执行 kubectl get pod 时 API Server 会从 etcd 中读取这些数据。
- flannel 会为每个 Pod 都分配 IP。因为没有创建 service,目前 kube-proxy 还没参与进来。
整理自:https://www.cnblogs.com/CloudMan6/
