zoukankan      html  css  js  c++  java
  • k8s架构分析(二)

    master节点

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

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

    1. API Server(kube-apiserver)

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

    2.Scheduler(kube-scheduler)

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

    3.Controller Manager(kube-controller-manager)

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

    4.etcd

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

    5.pod网络

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

    node节点

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

     1.kubelet

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

    2.kube-proxy

    每个node都会运行kube-proxy服务,外界通过service访问pod,kube-proxy负责将降访问service的TCP/UDP数据流转发到后端的容器。如果有多个副本,kube-proxy会实现负载均衡。

    3.pod网络

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

    完整的架构图

    为什么 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>
     

    整个部署过程:

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

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

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

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

    补充两点:

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

    pod生命周期阶段

  • 相关阅读:
    HDU 1010 Tempter of the Bone
    HDU 4421 Bit Magic(奇葩式解法)
    HDU 2614 Beat 深搜DFS
    HDU 1495 非常可乐 BFS 搜索
    Road to Cinema
    Sea Battle
    Interview with Oleg
    Spotlights
    Substring
    Dominating Patterns
  • 原文地址:https://www.cnblogs.com/it-peng/p/11393765.html
Copyright © 2011-2022 走看看