全网最系统、最清晰!深入微服务架构——Docker和K8s详解,助你大厂无忧
面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务
- 缺少稳定的线下测试环境
在测试过程中,会遇到一个问题,服务依赖的其他下游服务都没有提供稳定的测试环境,导致无法在测试环境模拟整个线上流程进行测试。所以有时候会用线上服务进行测试,这本身就存在着很高的潜在风险。一旦操作失误,就有可能造成不可估量的损失。
而Docker的出现在很大程度上解决了这些问题,那么我们一起来认识一下Docker 吧。
Docker简介
========
Docker是一个开源的引擎,可以轻松地为任何应用创建一个轻量级的、 可移植的、自给自足的容器。开发者在笔记本电脑上编译测试通过的容器可以批量地在生产环境中部署,包括VMs (虚拟机)、bare metal、OpenStack 集群和其他基础应用平台。
Docker的目标:
-
提供轻量简单的建模方式;
-
职责的逻辑分离;
-
快速高效的开发生命周期;
-
鼓励使用面向服务的架构,即单个容器运行单个应用。
Docker原理
========
Docker是一个客户端一服务器(C/S)架构的程序。Docker 客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker及一整套RESTful API,可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。
Docker依赖的Linux的内核特性包括Namespaces命名空间和Control groups(c groups)控制组。
Namespaces命名空间:
-
PID (process ID),进程ID隔离;
-
NET (network),管理网络端口;
-
IPC ( InterProcess Communication),进程间通信;
-
管理跨进程通信的访问;
-
MNT (Mount),管理挂载点;
-
UTS (UNIX Timesharing System),隔离内核和版本标识;
-
Control groups(c groups),控制组。
Control groups(c groups)控制组:
-
资源限制;
-
优先级设定;
-
资源度量;
-
资源控制及资源分配;
Docker容器的能力包括:
-
文件系统隔离——每个容器都有自己的root文件系统,可以独立挂载外部文件系统。
-
进程隔离——每个容器都运行在自己的进程环境中,相互之间互不干扰。
-
网络隔离——容器间的虚拟网络接口和IP地址都是分开的。
-
资源隔离和分组——使用cgroup将CPU和内存等资源独立分配给每个Docker容器。
更轻量级的虚拟化
========
Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。我们先来看一下虚拟机与Docker的架构对比,
从下到上理解上图
-
基础设施(Infrastructure):一般是服务器或者云主机。
-
虚拟机管理系统(Hypervisor):利用Hypervisor, 可以在主操作系统之上运行多个不同的从操作系统,可以构建在基础设施上,也可以构建在操作系统上。
-
客户机操作系统(Guest Operating System):假设运行3个相互隔离的应用,则需要使用Hypervisor启动3个客户机操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有900MB,这就意味着它们将占用2.7GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存资源。
-
各种依赖:每一个客户机操作系统都需要安装许多依赖。
-
应用:安装依赖之后,就可以在各个客户机操作系统分别运行应用了,这样各个应用就是相互隔离的。
再来看一下Docker的架构,
虚拟机和Docker的对比:
-
Docker容器可以在秒级实现,比虚拟机的方式不只快了一倍,任何虚拟机都不太可能在秒级启动完成。
-
Docker对系统资源的利用率很高,一.台主机上可以同时运行数千个Docker 容器。如果把服务器比作码头,则虚拟机就好比码头上的仓库,不能随便移动,而Docker就好比集装箱,操作灵活,运载方便。
-
容器除了运行其中应用,基本不消耗额外的系统资源,所使用的资源完全是使用宿主机上的资源。
-
传统虚拟机方式运行10个不同的应用就要启动10个虚拟机,而Docker只需要10个隔离的应用即可。
-
Docker容器可以跨平台运行,不需要额外的操作系统支持,按需装载。
小编之前整理过的Docker实战笔记,点击即可参阅哦~~~
网络模式
====
当Docker 进程启动时,会在主机上创建一一个 名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
Docker有以下四种网络模式:
-
host模式,docker run时使用–net-host指定。
-
container模式,docker run时使用–net=container:NAME or. ID指定。
-
none模式,docker run时使用–net-none指定。
-
bridge模式,docker run时使用–net-bridge指定,默认设置。
link
====
link是在两个contain之间建立一种父子关系,父container中的Web可以得到子container db上的信息。
通过link的方式创建容器,我们可以使用被link容器的别名进行访问,而不是通过IP,解除了对IP的依赖。
不过,link 的方式只能解决单机容器间的互连,多机的情况下,需要通过别的方式进行连接。
在运行一个容器时,使用-link-container_name or id:name选项可以在此容器的/etc/hosts文件中增加一个额外的name主机名,这个名字为container_name的容器的IP地址的别名。这使得新容器的内部进程可以访问主机名为name的容器而不用知道它的IP。
内网是走docker0的网桥,互相之间是Ping得通的,但是docker run建立容器时,它的IP地址是不可控制的,所以Docker用link的方式使Web能够访问到db中的数据。
跨主机访问
=====
跨主机的容器访问目前市面上主流的解决方法有flannel、 weave、 Pipework、 Open vSwitch等。下面就来分别认识一下这几种方案。
- Open vSwitch
Open vSwitch是一个高质量的、多层虚拟交换机,使用开源Apache 2.0许可协议,由Nicia Networks开发,主要实现代码为可移植的C代码。它的目的是让大规模网络自动化可以通过编程扩展,同时仍然支持标准的管理接口和协议(例如,NetFlow. SFlow. SPAN、RSPAN、CLI、LAAP、802.1ag)。
- Weave
Weave是由Zettio公司开发的,它能够创建一个虚拟网络,用于连接部署在多台主机上的Docker容器,这样容器就像被接入了同一个网络交换机-样,那些使用网络的应用程序不必去配置端口映射和链接等信息。外部设备能够访问Weave 网络上的应用程序容器所提供的服务,同时已有的内部系统也能够暴露到应用程序容器上。Weave能够穿透防火墙并运行在部分连接的网络上。另外,Weave 的通信支持加密,所以用户可以从一个不受信任的网络连接到主机。
- Flannel
Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址
Docker数据卷
=========
容器中管理数据主要有两种方式:
-
数据卷(Data Volumes);
-
数据卷容器(Data Volumes Dontainers )。
数据卷
数据卷是一个特殊的目录,它将主机目录直接映射进容器,可供一个或多个容器使用,如下图所示:
数据卷设计的目的就是为了数据的持久化,它完全独立与容器的生命周期。因此,容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理。
数据卷的特性:
-
数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会复制到新初始化的数据卷中。
-
数据卷可以在容器之间共享和重用。
-
可以对数据卷里的内容直接修改,修改会马上生效,无论是容器内操作还是本地操作。
-
对数据卷的更新不会影响镜像的更新。
-
数据卷会一直存在,即使挂载数据卷的容器已经被删除。
数据卷容器
一个目录或者一个容器通过挂载数据卷就可以实现容器与外部系统的交互了,但是如果多个容器想实现数据的共享又该怎么办呢?
Docker提供了一种挂载数据卷的容器,叫作数据卷容器,其他容器能够通过挂载这个容器实现数据共享,如下图所示
Kubernetes
==========
Swarm为Docker自行开发的容器调度工具,2017 年成为Docker平台的内建工具。不过,有鉴于Kubernetes已成为最受欢迎的容器调度工具,再加上Docker用户也希望能够更方便地使用Kubernetes,让Docker终于宣布支援Kubernetes。
容器调度工具的竞争局面中,Kubermnetes 可以说是站稳龙头,不只各家厂商抢着支援,连Docker都开始支援Kubernetes,包含企业版Docker、支持Windows与Mac的Docker社群版,以及Moby专案,用户可自行选择通过Kubernetes或Swarm来调度及管理容器任务。
那么Kubernetes到底是什么?为什么连Docker官方都宣布开始支持?我们一起来一探究竟。
Kubernetes (k8s) 是自动化容器操作的开源平台,这些操作包括部署、调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看作Kubernetes内部使用的低级别组件。Kubernetes 不仅仅支持Docker,还支持Rocket,这是另一种容器技术。
使用Kubernetes可以:
-
自动化容器的部署和复制;
-
随时扩展或收缩容器规模;
总结
面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。
此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!
给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等”
且除了单纯的刷题,也得需准备一本【JAVA进阶核心知识手册】:JVM、JAVA集合、JAVA多线程并发、JAVA基础、Spring 原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、一致性算法、JAVA算法、数据结构、加密算法、分布式缓存、Hadoop、Spark、Storm、YARN、机器学习、云计算,用来查漏补缺最好不过。
布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等”
[外链图片转存中…(img-PvBjyouF-1714579824979)]
且除了单纯的刷题,也得需准备一本【JAVA进阶核心知识手册】:JVM、JAVA集合、JAVA多线程并发、JAVA基础、Spring 原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、一致性算法、JAVA算法、数据结构、加密算法、分布式缓存、Hadoop、Spark、Storm、YARN、机器学习、云计算,用来查漏补缺最好不过。
[外链图片转存中…(img-NsgzayJr-1714579824980)]
更多推荐
所有评论(0)