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生命周期阶段

k8s架构分析(二)的更多相关文章

  1. k8s架构分析(二)--技术流ken

    master节点 k8s的集群由master和node组成,节点上运行着若干k8s服务. master节点之上运行着的后台服务有kube-apiserver .kube-scheduler.kube- ...

  2. Ext4文件系统架构分析(二)

    接着上一篇博文,继续分析Ext4磁盘布局中的元数据. 1.7 超级块 超级块记录整个文件系统的大量信息,如数据块个数.inode个数.支持的特性.管理信息,等待. 如果设置sparse_super特性 ...

  3. Backbone.js 1.0.0源码架构分析(二)——Event

    (function(){ //省略前面代码 var Events = Backbone.Events = { // 根据name订阅事件,push到this._events[name] on: fun ...

  4. 二、Java神经网络框架Neuroph的使用和架构分析

    一.使用Neuroph Studio构造感知机处理逻辑与 新建项目 接着,输入名字和地址,点击“完成” 在工程的神经网络文件下新建神经网络 准备训练数据 开始训练 误差展示 也可以测试神经元 或者输入 ...

  5. ECMALL模板解析机制.MVC架构分析及文件目录说明.二次开发指南手册(转)

    ECMALL模板解析语法与机制 http://www.nowamagic.net/architecture/archt_TemplateSyntaxAndAnalysis.php ECMALL模块开发 ...

  6. Tomcat源码分析二:先看看Tomcat的整体架构

    Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...

  7. Android架构分析之Android消息处理机制(二)

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本号:4.4.2 在上一篇文章中我们看了一个使用Handler处理Message消息的样例,本文我们 ...

  8. NopCommerce架构分析(转载)

    原文 一,NopCommerce架构分析之开篇 NopCommerce是.net开源项目中比较成熟的一款业务应用框架,也是电子商务系统中的典范.所以很想多学习一下里面的设计和实现方式. 二,NopCo ...

  9. Qualcomm Android display架构分析

    Android display架构分析(一) http://blog.csdn.net/BonderWu/archive/2010/08/12/5805961.aspx http://hi.baidu ...

随机推荐

  1. 【期外】(三)Linux下集成开发环境Geany

    今天小编发现了一个很好的软件,它的名字就叫做Geany. 这是Linux系统中的开发工具,相当的好用. Linux与windows最大的不同正是不是集成开发环境,所以写起代码来总是用文档写好后,然后再 ...

  2. 每天都在用String,你真的了解吗?

    1.String概述 java.lang.String 类代表字符串.Java程序中所有的字符串文字(例如"abc")都可以被看作是实现此类的实例 String 中包括用于检查各个 ...

  3. C++ U型数

    U型数字 最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增.比如 212212 就是一个U型数字,但是 333333, 9898, 567567, 3131 ...

  4. golang并发

    1.goroutine goroutine是Go并行设计的核心.goroutine说到底其实就是线程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些 ...

  5. Better Key Sizes (and Attacks) for LWE-Based Encryption

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 以下是对本文关键部分的摘抄翻译,详情请参见原文 Abstract 基于“learning with errors”(LWE)问题,分析了理 ...

  6. 从 BIO、NIO 聊到 Netty,最后还要实现个 RPC 框架!

    大家好,我是 「后端技术进阶」 作者,一个热爱技术的少年. 觉得不错的话,欢迎 star!ღ( ´・ᴗ・` )比心 Netty 从入门到实战系列文章地址:https://github.com/Snai ...

  7. 区块链入门到实战(23)之以太坊(Ethereum) – 虚拟机架构

    以太坊(Ethereum)网络中,定义了一组通用协议用于支持智能合约的运行,其核心便是以太坊(Ethereum)虚拟机. 下图解释了该架构: 开发人员使用Solidity等开发语言开发智能合约 源程序 ...

  8. 接口测试 Mock 实战 | 结合 jq 完成批量化的手工 Mock

    本文霍格沃兹测试学院学员学习实践笔记. 一.应用背景 因为本章的内容是使用jq工具配合完成,因此在开始部分会先花一定的篇幅介绍jq机器使用,如果读者已经熟悉jq,可以直接跳过这部分. 先来看应用场景, ...

  9. 把Autofac玩的和javaSpring一样6

    大家好,今天来介绍我开源的一个autofac.Annotation项目 源码:https://github.com/yuzd/Autofac.Annotation 本项目是autofa的一个扩展组件, ...

  10. 前端测试框架Jest——语法篇

    使用匹配器 使用不同匹配器可以测试输入输出的值是否符合预期.下面介绍一些常见的匹配器.普通匹配器最简单的测试值的方法就是看是否精确匹配.首先是toBe() test('two plus two is ...