• 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 还没参与进来。

    k8s 组件架构

     

    一、整体架构

    kubernetes分为 master节点和工作节点,前者是管理节点,后者是容器运行的节点。其中master节点主要有3个重要组件,分别是APIServer,sheduler和controller manager。

    工作节点 有两个组件 kubelet 和 kubelet (有时候master节点也可以既是管理节点也是工作节点)

    APIServer

    APIServer组件负责响应用户的管理请求、进行指挥协调工作

    scheduler

    scheduler组件是将待调度的pod按照一定的调度算法绑定到合适的工作节点上

    controller manager

    是一组控制器的合集,负责控制控制管理对应的资源,如副本(replication)和工作节点(node)等。

    etcd

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

     kubelet

    管理维护pod运行的agent

    kube-proxy

    将service的流量转发到对应endpoint

    flannel网络

    维持各个节点上pod之间的通信。

    kuernetes架构可以用下图来简单描述,mster节点上的APIServer将负责与master节点、工作节点上的各个组件之间交互,以及集群外用户(如kubectl命令)

    与集群的交互、在集群中处于消息收发的中心地位。其他各个组件各司其职,共同完成应用的分发,部署与运行的工作。

     二、通过示例来理解

    复制代码
    [root@k8s-master k8s]# kubectl run httpd-pod --image=httpd --replicas=2      
    kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.
    deployment.apps/httpd-pod created
    [root@k8s-master k8s]# kubectl get deployment
    NAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    httpd-pod   2         2         2            2           22s
    [root@k8s-master k8s]# kubectl get pod -o wide
    NAME                         READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE
    httpd-pod-7cdfc75664-4trb9   1/1     Running   0          32s   10.244.2.4   k8s-node1   <none>
    httpd-pod-7cdfc75664-mjm7f   1/1     Running   0          32s   10.244.1.4   k8s-node2   <none>
    复制代码

    上面使用run命令在命令行创建pod的方式已经不被推荐使用

    官方推荐使用如下的方式,其中第三种方式已经成为一种广泛流传的方式。

    复制代码
    Examples:
    # Create a pod using the data in pod.json.
    kubectl create -f ./pod.json
    
    # Create a pod based on the JSON passed into stdin.
    cat pod.json | kubectl create -f -
    
    # Edit the data in docker-registry.yaml in JSON then create the resource using the edited data.
    kubectl create -f docker-registry.yaml --edit -o json
    复制代码

    上面的命令 httpd-pod 是所要deployment的名称

    --image  是指定使用镜像   --replicas 指定副本的数量

    通过查看pod,发现pod分别被调度到 k8s-node1和k8s-node2节点上运行。

    详细过程:

    1.kubectl发送部署的请求到API Server

    2.API Server通知Controller Manager创建一个 deployment 资源

    3.Scheduler执行调度任务,将两个副本Pod分发到k8s-node和k8s-node2上。

    4.k8s-node1和k8s-node2上的kubelet在各自的节点上创建并运行pod。

    tips:

    1.应用的配置和当前的状态信息保存在etcd中,当执行kubectl get pod 等查询操作时 API Server会从中读取数据

    2.flannel 会为每个Pod分配IP。因为没有创建service,目前kube-proxy还没有参与进来

    为了下面的学习,需要删除节点上的pod。删除这个deployment时,pod的状态会从running变为Terminating 直至清除。

    复制代码
    root@k8s-master k8s]# kubectl delete deployment httpd-pod             
    deployment.extensions "httpd-pod" deleted
    [root@k8s-master k8s]# kubectl get pod -o wide            
    NAME                         READY   STATUS        RESTARTS   AGE   IP           NODE        NOMINATED NODE
    httpd-pod-7cdfc75664-4trb9   0/1     Terminating   0          12m   10.244.2.4   k8s-node1   <none>
    [root@k8s-master k8s]# kubectl get pod -o wide
    NAME                         READY   STATUS        RESTARTS   AGE   IP           NODE        NOMINATED NODE
    httpd-pod-7cdfc75664-4trb9   0/1     Terminating   0          12m   10.244.2.4   k8s-node1   <none>
    [root@k8s-master k8s]# kubectl get pod -o wide
    No resources found.
    复制代码
  • 相关阅读:
    同异步调用、shutdown参数
    python学习笔记
    《深入浅出WPF》学习笔记之绘图和动画
    《深入浅出WPF》学习笔记之深入浅出话命令
    《深入浅出WPF》学习笔记之深入浅出话事件
    《深入浅出WPF》学习笔记之深入浅出话属性
    《深入浅出WPF》学习笔记之深入浅出话Binding
    《深入浅出WPF》学习笔记之控件与布局
    《深入浅出WPF》学习笔记之x名称空间详解
    《深入浅出WPF》学习笔记之系统学习XAML语法
  • 原文地址:https://www.cnblogs.com/panpanwelcome/p/13633475.html
Copyright © 2020-2023  润新知