k8s架构分析(二)

k8s的集群由master和node组成,节点上运行着若干k8s服务。

master节点之上运行着的后台服务有kube-apiserver 、kube-scheduler、kube-controller-manager、etcd和pod网络。如下图所示

k8s架构分析(二)

1. API Server(kube-apiserver)

API Server是k8s的前端接口,各种客户端工具以及k8s其他组件可以通过它管理集群的各种资源。

2.Scheduler(kube-scheduler)

scheduer负责决定将pod放在哪个node上运行。另外scheduler在调度时会充分考虑集群的架构,当前各个节点的负载,以及应用对高可用、性能、数据亲和性的需求。

3.Controller Manager(kube-controller-manager)

负责管理集群的各种资源,保证资源处于预期的状态。

Controller Manager 由多种 controller 组成,包括 replication controller、endpoints controller、namespace controller、serviceaccounts controller 等。

不同的 controller 管理不同的资源。例如 replication controller 管理 Deployment、StatefulSet、DaemonSet 的生命周期,namespace controller 管理 Namespace 资源。

4.etcd

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

5.pod网络

pod要能够相互通信,k8s集群必须掌握pod网络,fannel是其中一个可选的方案。

node节点

node是pod运行的地方。node上运行的k8s组件有kublet、kube-proxy和pod网络(例如flannel),如下图所示:

k8s架构分析(二)

 1.kubelet

是node的agent,当scheduler去确定在某个node上运行pod后,会将pod的具体配置信息发送给该节点的kubelet,kubelet会根据遮羞信息创建和运行容器,并向master报告运行状态。

2.kube-proxy

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

每个 Node 都会运行 kube-proxy 服务,它负责将访问 service 的 TCP/UPD 数据流转发到后端的容器。如果有多个副本,kube-proxy 会实现负载均衡。

3.pod网络

pod能能够互相通信,k8s集群必须部署pod网络,flannel是其中一个可以选择的方案

完整的架构图

k8s架构分析(二)

为什么 k8s-master 上也有 kubelet 和 kube-proxy 呢?

这是因为 Master 上也可以运行应用,即 Master 同时也是一个 Node。

几乎所有的 Kubernetes 组件本身也运行在 Pod 里,执行如下命令:

[root@ken ~]# kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                          READY   STATUS             RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
kube-system   coredns-78d4cf999f-dbxpc      1/1     Running            0          4h40m   10.244.0.2    ken     <none>           <none>
kube-system   coredns-78d4cf999f-q9vq2      1/1     Running            0          4h40m   10.244.0.3    ken     <none>           <none>
kube-system   etcd-ken                      1/1     Running            0          4h39m   172.20.10.2   ken     <none>           <none>
kube-system   kube-apiserver-ken            1/1     Running            0          4h39m   172.20.10.2   ken     <none>           <none>
kube-system   kube-controller-manager-ken   0/1     CrashLoopBackOff   23         4h39m   172.20.10.2   ken     <none>           <none>
kube-system   kube-flannel-ds-amd64-bq6jx   1/1     Running            0          4h4m    172.20.10.9   host2   <none>           <none>
kube-system   kube-flannel-ds-amd64-fd8mv   1/1     Running            0          4h24m   172.20.10.2   ken     <none>           <none>
kube-system   kube-flannel-ds-amd64-ssqcl   1/1     Running            0          4h5m    172.20.10.7   host1   <none>           <none>
kube-system   kube-proxy-7cnsr              1/1     Running            0          4h5m    172.20.10.7   host1   <none>           <none>
kube-system   kube-proxy-gwmr2              1/1     Running            0          4h40m   172.20.10.2   ken     <none>           <none>
kube-system   kube-proxy-n6zxl              1/1     Running            0          4h4m    172.20.10.9   host2   <none>           <none>
kube-system   kube-scheduler-ken            0/1     CrashLoopBackOff   21         4h39m   172.20.10.2   ken     <none>           <none>

Kubernetes 的系统组件都被放到kube-system namespace 中。这里有一个kube-dns 组件,它为 Cluster 提供 DNS 服务,我们后面会讨论。kube-dns是在执行kubeadm init 时作为附加组件安装的。

kubelet 是唯一没有以容器形式运行的 Kubernetes 组件,它在系统中通过 Systemd 运行。

[root@ken ~]# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: active (running) since Tue 2019-01-29 10:39:16 CST; 4h 44min ago
     Docs: https://kubernetes.io/docs/
 Main PID: 6350 (kubelet)
    Tasks: 35
   Memory: 87.7M
   CGroup: /system.slice/kubelet.service
           └─6350 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kub...

...

k8s集群架构工作演示

部署httpd应用

[root@ken ~]# kubectl run httpd-ken --generator=run-pod/v1 --image=httpd --replicas=2
pod/httpd-ken1 created

等待一段时间,应用部署完成。

[root@ken ~]# kubectl get deployment
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
httpd-ken   2/2     2            2           20m

k8s 部署了k8s httpd-ken,有两个副本 Pod,分别运行在k8s-node1和k8s-node2。

[root@ken ~]# kubectl get pod -o wide
NAME                        READY   STATUS    RESTARTS   AGE     IP           NODE    NOMINATED NODE   READINESS GATES
httpd-ken-5c949b96f-9cd52   1/1     Running   0          3m50s   10.244.1.3   host1   <none>           <none>
httpd-ken-5c949b96f-twdsd   1/1     Running   0          3m50s   10.244.2.3   host2   <none>           <none>

整个部署过程:

k8s架构分析(二)

① kubectl 发送部署请求到 API Server。

② API Server 通知 Controller Manager 创建一个 deployment 资源。

③ Scheduler 执行调度任务,将两个副本 Pod 分发到 k8s-node1 和 k8s-node2。

④ k8s-node1 和 k8s-node2 上的 kubelet 在各自的节点上创建并运行 Pod。

补充两点:

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

pod生命周期阶段

k8s架构分析(二)

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/53511.html

(0)
上一篇 2021年8月6日
下一篇 2021年8月6日

相关推荐

发表回复

登录后才能评论