kubernetes 架构实例详解

kubernetes cluster由Master 和Node节点组成,节点上运行着若干个Kubernetes服务。

Master 节点

Master节点上运行着的Daemon服务包括kube-apiserver、kube-scheduler、kube-controller-manager、etcd和pod网络(flannel)

在这里插入图片描述

API Server(kube-apiserver)

API Server提供 HTTP/HTTPS RESTful API,即Kubernetes API。API Server是Kubernetes Cluster的前端接口,各种客户端工具(CLI或UI)以及Kubernetes其他组件可以通过它管理Cluster的各种资源。

Scheduler(kube-scheduler)

Scheduler 负责决定将Pod放在哪个Node上运行。Scheduler在调度时会充分考虑Cluster的拓扑结构,当前各个节点的负载,以及应用对高可用、性能、数据亲和性的需求。

Controller Manager(kube-controller-manager)

Controller Manager 负责管理Cluster各种资源,保证资源处于预期的状态。Controller Manager有多种controller组成,包括replication controller,endpoints controller,namespace controller,serviceaccounts controller等。

etcd

etcd数据库负责保存Kuberneter Cluster的配置信息和各种资源的状态信息。当数据发生变化时,etcd会快速地通知Kubernetes相关组件。

Pod网络

Pod要能够在集群的多个节点之间进行通信,必须部署Pod网络,flannel是其中一个可选方案。

Node节点

Node节点是Pod运行的地方,Kubernetes支持Docker、rkt等容器Runtime。Node上运行的kubernetes组件包括kubectl、kube-proxy和Pod网络。
在这里插入图片描述

kubelet

kubelet是Node的agent,当Scheduler确定在某个Node上运行Pod后,会将Pod的具体配置信息发送给该节点的kubelete,kubelete根据这些信息创建和运行容器,并向Master报告运行状态。

kube-proxy

service在逻辑上代表了后端的多个pod,外界通过service访问Pod。service接收到的请求是如何转发到Pod的呢?这就是kube-proxy要完成的工作。如果有多个副本,也起到load balance的作用。

Pod网络

Pod要能够在集群的多个节点之间进行通信,必须部署Pod网络,flannel是其中一个可选方案。

完整的架构图

在这里插入图片描述
这里的Master节点也可以作为Node节点,在上面运行应用,所以Master节点上也有kubelet和kube-proxy。

几乎所有的Kubernetes组件本身也是运行在Pod里:

root@k8s-master:~# kubectl get pod -A -o wide
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
kube-system   coredns-fb8b8dccf-fnlxl              1/1     Running   0          59m   10.244.0.2       k8s-master   <none>           <none>
kube-system   coredns-fb8b8dccf-vb7jj              1/1     Running   0          59m   10.244.0.3       k8s-master   <none>           <none>
kube-system   etcd-k8s-master                      1/1     Running   0          58m   192.168.24.136   k8s-master   <none>           <none>
kube-system   kube-apiserver-k8s-master            1/1     Running   0          58m   192.168.24.136   k8s-master   <none>           <none>
kube-system   kube-controller-manager-k8s-master   1/1     Running   0          59m   192.168.24.136   k8s-master   <none>           <none>
kube-system   kube-flannel-ds-amd64-cpjnd          1/1     Running   0          43m   192.168.24.136   k8s-master   <none>           <none>
kube-system   kube-flannel-ds-amd64-kt45p          1/1     Running   0          39m   192.168.24.137   k8s-node1    <none>           <none>
kube-system   kube-proxy-5fdss                     1/1     Running   0          59m   192.168.24.136   k8s-master   <none>           <none>
kube-system   kube-proxy-vkq2p                     1/1     Running   0          39m   192.168.24.137   k8s-node1    <none>           <none>
kube-system   kube-scheduler-k8s-master            1/1     Running   0          59m   192.168.24.136   k8s-master   <none>           <none>
root@k8s-master:~#

系统组件都放在kube-system namespace中。这里有一个coredns组件,它为Cluster提供DNS服务。

kubelet是唯一没有一容器形式运行的kubernetes组件,它在Ubuntu中通过Systemd服务运行。

root@k8s-master:~# systemctl status kubelet.service 
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: active (running) since Sun 2019-06-09 19:23:55 PDT; 1h 5min ago
     Docs: https://kubernetes.io/docs/home/
 Main PID: 47268 (kubelet)
    Tasks: 18
   Memory: 59.3M
      CPU: 1min 41.929s
   CGroup: /system.slice/kubelet.service
           └─47268 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-conta

...

举例介绍

为了更好的理解Kubernetes架构,我们部署一个应用来演示各个组件之间是如何写作的。

root@k8s-master:~# kubectl run httpd-app --image=httpd --replicas=2
deployment.apps/httpd-app created
root@k8s-master:~# kubectl get deployment
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
httpd-app   2/2     2            2           48s
root@k8s-master:~# 
root@k8s-master:~# kubectl get pod -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
httpd-app-6df58645c6-97td2   1/1     Running   0          58s   10.244.1.3   k8s-node1   <none>           <none>
httpd-app-6df58645c6-9ldpd   1/1     Running   0          58s   10.244.1.4   k8s-node2  <none>           <none>
root@k8s-master:~#

接下来,详细分析整个部署过程:
在这里插入图片描述

  1. kubectl 发送部署请求到API Server;
  2. API Server 通知 Controller Manager 创建一个 deployment 资源;
  3. Scheduler 执行调度任务,将两个 Pod副本发送到 k8s-node1 和 k8s-node2上;
  4. k8s-node1和k8s-node2 上的kubelete 在各自的节点上创建并执行pod。

注意:

  • 应用的配置信息和当前状态信息会保存在etcd中,执行 kubectl get pod 时API Server 会从etcd中读取这些数据。
  • flannel 会为每个Pod 都分配IP。因为没有创建service,所以目前kube-proxy还没有参与进来。

猜你喜欢

转载自blog.csdn.net/cbmljs/article/details/91372170