写在前面

在这用XMind画了一张导图记录Redis的学习笔记和一些面试解析(源文件对部分节点有详细备注和参考资料,欢迎关注我的公众号:阿风的架构笔记 后台发送【导图】拿下载链接, 已经完善更新):

前言

很多小伙伴学习K8S的时候,会被K8S里面的概念搞乱了,望而生畏;而且很多文章里面介绍的时候讲的太专业了。今天来帮小伙伴们梳理一下,讲的不深入,目的是帮忙小伙伴更好的理解,各个概念的由来。

架构图

上图中,有两种Node节点,一个是Master、一个是Work。

从字面上来看Work Node就是用来工作的,也就是真正承担服务的机器节点。如服务A部署到K8S后,它的运行环境就在WorkNode节点。

那么Master Node是干嘛用的?小伙伴可以认为是用来分配服务到哪一台work node节点的;可以理解为大管家,它会知道现有work node的资源运行情况,决定服务安排到哪些work nodes上。

在Work Node节点上面有2个重要的组件,一个是Pod、一个是Container;

Pod是K8S的最小单元,它里面可以有多个Container。Container就是服务/组件运行的环境。

一般情况下一个Pod只有一个业务服务Container,而其他的Container是系统所需要的容器(其实就是一些进程组件,如网络组件、Volume组件等)。所以一般可以理解为我们的服务就在Pod里面。

上面只是简单的介绍了K8S基本的架构,以及核心点。

小伙伴们基本使用,理解到这里也就可以了

当然需要深入了解具体Master和Work节点有哪些组件,以及组件之间的发布流程是什么?继续往下看哦。

Master Node组件

上面中,用户一般采用kubectl命令,以及dashboard控制台去操作k8s。所有的操作都是通过API Server组件,需要持久化的就存储到etcd。Scheduler、Controller Manager组件一直订阅API Server的变化。

整体流程

如用户需要创建服务A的3个pod,那整体流程:

1)通过Kubectl提交一个创建RC的请求,该请求通过API Server被写入etcd中。

2)此时Controller Manager通过API Server的监听资源变化的接口监听到这个RC事件,分析之后,发现当前集群中还没有它所对应的Pod实例,于是根据RC里的Pod模板定义生成一个Pod对象,通过API Server写入etcd。

3)接下来,此事件被Scheduler发现,它立即执行一个复杂的调度流程,为这个新Pod选定一个落户的Work Node,然后通过API Server讲这一结果写入到etcd中。

4)随后,目标Work Node上运行的Kubelet进程通过API Server监测到这个“新生的”Pod,并按照它的定义,启动该Pod。

5)用户的需求是3个pod;那到底有没有启动了3个;是由Controller Manager监控管理的,它会保证资源达到用户的需求。

etcd

用于持久化存储集群中所有的资源对象,如Node、Service、Pod、RC、Namespace等;API Server提供了操作etcd的封装接口API,这些API基本上都是集群中资源对象的增删改查及监听资源变化的接口。

API Server

提供了资源对象的唯一操作入口,其他所有组件都必须通过它提供的API来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很“实时”地完成相关的业务功能。

Controller Manager

集群内部的管理控制中心,其主要目的是实现Kubernetes集群的故障检测和恢复的自动化工作,比如根据RC的定义完成Pod的复制或移除,以确保Pod实例数符合RC副本的定义;根据Service与Pod的管理关系,完成服务的Endpoints对象的创建和更新;其他诸如Node的发现、管理和状态监控、死亡容器所占磁盘空间及本地缓存的镜像文件的清理等工作也是由Controller Manager完成的。

Scheduler

集群中的调度器,负责Pod在集群节点中的调度分配。

Work Node组件

上图右侧是Work Node的组件,整体流程

1)kubelet监听到Api Server的变化后,如果有本work node节点需要创建pod;则会通知Container Runtime组件

2)Container Runtime是管理节点Pod组件,在启动pod时,如果本地没有镜像,则会从docker hub里面拉取镜像,启动容器pod

3)kubelet会把相关信息再传给Api Server

Kubelet

负责本Node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里。本质Pod的管理是Container Runtime组件负责的

kube-proxy

实现了Service的代理与软件模式的负载均衡器,这个是因为pod的网络ip是经常变化的。这个网络知识,下一篇文章会介绍

Pod发布

上面介绍了K8S整体架构流程,现在先从pod开始,一步步引出K8S的其他概念。

我们先编辑yaml,定义一个pod对象

apiVersion: v1  #指定api版本,此值必须在kubectl apiversion中
kind: Pod #指定创建资源的角色/类型
metadata: #资源的元数据/属性
name: mc-user #资源的名字,在同一个namespace中必须唯一
spec: #specification of the resource content 指定该资源的内容
containers: #容器定义
- name: mc-user #容器的名字
image: rainbow/mc-user:1.0.RELEASE #容器镜像

我们通过kubectl命令,来创建这个pod

kubectl apply -f mc-user-pod.yaml

我们mc-user:1.0.RELEASE的镜像就是一个web应用,8080端口;但是我们发现pod启动后,我们无法通过pod的ip地址访问此web服务

那怎么才能访问pod呢?

反向代理

在要解决访问pod的问题前,我们先来看看我们之前是如何部署网站的?

外网访问我们内部的网站,一般我们会在中间部署一个nginx,反向代理我们的web服务。根据这个思路,K8S体系中也有反向代理这个概念

NodePort Service

K8S中我们可以采用类型为NodePort的Service实现反向代理

K8S的Service很多,其中NodePort Service是提供反向代理的实现

这样外网就可以访问内部的pod了。实现流程:

1)pod需要打上一个Label标签
2)外部流量请求到NodePort Service,通过Selector 进行路由,
3)NodePort Service根据Label标签进行路由转发到后端的Pod

从上面的流程中,其实Service也起到了负载均衡的作用;后端Pod可以有多个,同时打上相同的Label标签,Service会路由转发到其中一个Pod。

Service Type还可以为 LoadBalancer、ClusterIP LoadBalancer:这个是部署到云端(如阿里云)的时候需要用的,也是反向代理+负载均衡的作用,用作外部访问K8S内部。ClusterIP:这个Service是K8S集群内部做反向代理用的

Label与Selector

上图中有2个pod定义了Label为app:nginx;1个pod定义了app:apache;

那么Service的Selector筛选app:nginx,只会路由到nginx的pod。

Service发布

我们来编写一个NodePort Service发布文件

apiVersion: v1
kind: Service
metadata:
name: mc-user
spec:
ports:
- name: http #通讯协议
port: 8080 #这里的端口和clusterIP对应,即ip:8080,供内部访问。
targetPort: 8080 #端口一定要和container暴露出来的端口对应
nodePort: 31001 #节点都会开放此端口,此端口供外部调用
selector:
app: mc-user #这里选择器一定要选择容器的标签
type: NodePort #这里代表是NodePort类型的

nodePort的端口范围:30000~32767

上面是NodePort Service的yaml文件,我们还要修改一个之前的Pod的yaml文件

apiVersion: v1  #指定api版本,此值必须在kubectl apiversion中
kind: Pod #指定创建资源的角色/类型
metadata: #资源的元数据/属性
name: mc-user #资源的名字,在同一个namespace中必须唯一
labels: #标签定义
app: mc-user #标签值
spec: #specification of the resource content 指定该资源的内容
containers: #容器定义
- name: mc-user #容器的名字
image: rainbow/mc-user:1.0.RELEASE #容器镜像

我们可以利用kubectl命令去分别执行pod和service的yaml文件;这样就可以通过外网直接访问了。http://localhost:31001端口不要忘了是 nodePort定义的端口哦。

总结

今天介绍了K8S的基本概念,以及架构流程;核心的是小伙伴们需要理解Pod、Service、Labels、Selector的这个组件为什么会产生?他们的解决了是什么问题?后续会继续介绍K8S其他的组件概念,希望能够帮助小伙伴们理解,减少K8S的学习难度;谢谢!!!

看完三件事️



如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  1. 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  2. 关注公众号 『 阿风的架构笔记 』,不定期分享原创知识。
  3. 同时可以期待后续文章ing
  4. 关注后回复【666】扫码即可获取架构进阶学习资料包

5分钟让你理解K8S必备架构概念,以及网络模型(上)的更多相关文章

  1. 5分钟让你理解K8S必备架构概念,以及网络模型(中)

    写在前面 在这用XMind画了一张导图记录Redis的学习笔记和一些面试解析(源文件对部分节点有详细备注和参考资料,欢迎关注我的公众号:阿风的架构笔记 后台发送[导图]拿下载链接, 已经完善更新): ...

  2. 5分钟让你理解K8S必备架构概念,以及网络模型(下)

    写在前面 在这用XMind画了一张导图记录Redis的学习笔记和一些面试解析(源文件对部分节点有详细备注和参考资料,欢迎关注我的公众号:阿风的架构笔记 后台发送[导图]拿下载链接, 已经完善更新): ...

  3. 深入理解openstack网络架构(1)

    原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture 译文转载自:http://b ...

  4. 理解S12(X)架构中的地址映射方案

    目录 1. 介绍 2. CPU 本地地址 3. 分页窗口 4. 内存页 5. 控制各个对象在内存中放置的位置 介绍 在一个S12或S12X架构中,很有必要分清楚两种类型的内存地址:banked和non ...

  5. [转帖]理解k8s 的 Ingress

    理解k8s 的 Ingress https://www.jianshu.com/p/189fab1845c5/ 暴露一个http服务的方式 service 是 k8s 暴露http服务的默认方式, 其 ...

  6. K8s生产架构

    部分图片显示问题,特附上有道云笔记中的链接:http://note.youdao.com/noteshare?id=df78492d2c25383975c67f3eadf0bbd9&sub=4 ...

  7. 从相亲的角度理解 K8S 的 Node Affinity, Taints 与 Tolerations

    这是昨天晚上阅读园子里的2篇 k8s 博文时产生的想法,在随笔中记录一下. 这2篇博文是 K8S调度之节点亲和性 与 K8S调度之Taints and Tolerations . 如果我们把 node ...

  8. 【K8S学习笔记】初识K8S 及架构组件

    K8S是什么?发展历史 Kubernetes (简称 k8s)是 Google 在2014年开源的,对容器生命周期管理的开源平台,致力于对容器集群提供易于管理.高可用.弹性负载与故障转移的能力,提高服 ...

  9. Kubernetes(K8s)基础概念 —— 凿壁偷光

    Kubernetes(K8s)基础概念  --  凿壁偷光 K8s是什么:全称 kubernetes  (k12345678s) 作用:用于自动部署,扩展和管理"容器化应用程序"的 ...

随机推荐

  1. 攻防世界 reverse Replace

    Replace 湖湘杯2018 查壳upx,手动脱壳,修复IAT,去掉重定向便可以运行. ida查看,流程清晰.关键函数check_E51090. int __cdecl main(int argc, ...

  2. java例题_04 分解质因数

    1 /*4 [程序 4 分解质因数] 2 题目:将一个大于 2 正整数分解质因数.例如:输入 3, 3=3, 输入 6, 6=2*3,输入 90, 90=2*3*3*5. 3 程序分析:对 n 进行分 ...

  3. CMU数据库(15-445) Lab4-CONCURRENCY CONTROL

    Lab4- CONCURRENCY CONTROL 拖了很久终于开始做实验4了.lab4有三个大任务1. Lock Manager.2. DEADLOCK DETECTION .3. CONCURRE ...

  4. 云原生 API 网关,gRPC-Gateway V2 初探

    gRPC-Gateway 简介 我们都知道 gRPC 并不是万能的工具. 在某些情况下,我们仍然想提供传统的 HTTP/JSON API.原因可能从保持向后兼容性到支持编程语言或 gRPC 无法很好地 ...

  5. 高精度减法(c++)

    高精度减法 每当要进行精度较高的运算时,就要用到高精度. 下图是各个类型的数值范围: 如果想不起各个类型占多少字节,可以采用下面的方法: printf("%d %d",sizeof ...

  6. 连续函数离散化-以SOGI为例

    0. 引言 0.1 本文内容 基于SOGI函数,将s域传递函数转换为离散的z域函数,并以m语言形式进行实现,在simulink中封装为m-function并进行验证 0.2 学到什么 离散化方法 函数 ...

  7. leetcode 刷题(数组篇)1题 两数之和(哈希表)

    题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元 ...

  8. Floyd算法C++实现与模板题应用

    简介 Floyd算法算是最简单的算法,没有之一. 其状态转移方程如下map[i , j] =min{ map[i , k] + map[k , j] , map[i , j] }: map[i , j ...

  9. 分布式锁的实现之 redis 篇

    为什么需要分布式锁 引入经典的秒杀情景,100件商品供客户抢.如果是单机版的话,我们使用synchronized 或者 lock 都可以实现线程安全.但是如果多个服务器的话,synchronized ...

  10. jq 获取表单全部数据

    jQuery Ajax 操作函数: serialize(): 将表单内容序列化为字符串 serializeArray():序列化表单元素,返回JASON数据 语法: $(selector).seria ...