运维开发面试笔记

发布时间 2023-07-28 10:37:24作者: 醒日是归时

运维

k8s基础组件有哪些?

一、控制面 Master 节点的主要组件:

  1. kube-apiserver:
    负责对外提供集群各类资源的增删改查及 Watch 接口,它是 Kubernetes 集群中各组件数据交互和通信的枢纽。当收到一个创建 Pod 写请求时,它的基本流程是对请求进行认证、限速、授权、准入机制等检查后,写入到 etcd 即可。

备注:kube-apiserver 在设计上可水平扩展,高可用 Kubernetes 集群中一般多副本部署。

  1. kube-scheduler:
    是调度器组件,负责集群 Pod 的调度。基本原理是通过监听 kube-apiserver 获取待调度的 Pod,然后基于一系列筛选和评优算法,为 Pod 分配最佳的 Node 节点。

  2. kube-controller-manager:
    包含一系列的控制器组件,比如 Deployment、StatefulSet 等控制器。控制器的核心思想是监听、比较资源实际状态与期望状态是否一致,若不一致则进行协调工作使其最终一致。

  3. etcd 组件:

Kubernetes 的元数据存储。

二、Node 节点的主要组件:

  1. kubelet:

负责 Pod 的创建运行,部署在每个节点上的 Agent 的组件。基本原理是通过监听 APIServer 获取分配到其节点上的 Pod,然后根据 Pod 的规格详情,调用运行时组件创建 pause 和业务容器等。

  1. kube-proxy:

部署在每个节点上的网络代理组件。基本原理是通过监听 APIServer 获取 Service、Endpoint 等资源,基于 Iptables、IPVS 等技术实现数据包转发等功能。

flask

1、Flask路由原理

在Flask应用中,我们一般通过decorator装饰view函数,来注册一个路由,表示url和处理函数的对应关系

2、Flask路由请求过程

1、Flask应用初始化过程
此过程主要通过route装饰器(或直接调用add_url_rule方法)创建好Rule对象,并添加到Map对象中

2、请求分发过程

1)创建RequestContext对象并推入栈中

2)RequestContext初始化时会将请求参数environ传给Map对象创建MapAdapter对象,保存在url_adapter字段中

3)调用MapAdapter对象的match方法找到匹配的Rule并解析出参数,保存在Request对象的url_rule和view_args字段中

4)调用Flask对象的full_dispatch_request、dispatch_request方法,通过request中保存的匹配到的Rule获取endpoint以及的view_args参数,调用对应的view函数,完成一次请求分发

3、为什么要使用路由

传统web开发是每一个请求地址都会请求服务器来进行处理,但是用户有些操作则无需请求服务器,直接页面端修改下逻辑就能达到目的,这种最好使用路由,也许题主会有疑问:直接使用js处理下不就行了。使用js直接处理这些是可以的,事实上以前我们也这么做,但是这样做不便于用户收藏当前页,因为使用js时并不更新url,但是使用路由时,url也是随着改变的,用户浏览到一个网页时可以直接复制或收藏当前页的url给别人,这种方式对于搜索引擎和用户来说都是友好的。

4、什么是路由

在web开发中,“route”是指根据url分配到对应的处理程序,不同的请求地址会交给路由处理来转发给相应的控制器处理

5、url构建,页面跳转和重定向

url_for() 函数用于构建指定函数的 URL。它把函数名称作为第一个 参数。它可以接受任意个关键字参数,每个关键字参数对应 URL 中的变量。未知变量 将添加到 URL 中作为查询参数。

为什么不在把 URL 写死在模板中,而要使用反转函数 url_for() 动态构建?

1、反转通常比硬编码 URL 的描述性更好。

2、你可以只在一个地方改变 URL ,而不用到处乱找。

3、URL 创建会为你处理特殊字符的转义和 Unicode 数据,比较直观。

4、生产的路径总是绝对路径,可以避免相对路径产生副作用。

5、如果你的应用是放在 URL 根路径之外的地方(如在 /myapplication 中,不在 / 中), url_for() 会为你妥善处理。

页面跳转和页面重定向

首先,我们说说url_for的意义,大家在浏览网页的时候都会有跳转,假设我们写跳转的时候,用url路径,当整个网站路径需要修改时,就需要更改这些代码,如果我们使用的是url_for的话,修改量就很少(通常视图函数是不修改的)。

重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面。

301永久性重定向和302临时性重定向 https://www.jianshu.com/p/887d16ba71b9

302 重定向是暂时的重定向,搜索引擎会抓取新的内容而保留旧的网址。因为服务器返回 302 代码,搜索引擎认为新的网址只是暂时的。换句话说,已移动的资源对应的 URI 将来还有可能会改变。比如,用户把 URI 保存成书签,但不会像 301 状态码出现时那样去更新书签,而是仍旧保留返回 302 状态码的页面对应的 URI 。

301 重定向是永久的重定向,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址。也就是说,如果已经把资源对应的 URI 保存为书签了,这时应该按 Location 首部字段提示的 URI 重新保存。

6、蓝图和视图

视图是一个应用对请求进行响应的函数。 Flask 通过模型把进来的请求 URL 匹配到 对应的处理视图。视图返回数据, Flask 把数据变成出去的响应。 Flask 也可以反 过来,根据视图的名称和参数生成 URL 。

创建蓝图

Blueprint 是一种组织一组相关视图及其他代码的方式。它和把视图及其他代码直接注册到应用的方式不同,蓝图方式是把它们注册到蓝图,然后在工厂函数中 把蓝图注册到应用。

使用 app.register_blueprint() 导入并注册 蓝图。新的代码放在工厂函数的尾部返回应用之前。

7、渲染模板

使用 render_template() 方法可以渲染模板,你只要提供模板名称和需要 作为参数传递给模板的变量就行了

8、请求报文结构

https://blog.csdn.net/a19881029/article/details/14002273

HTTP请求报文格式:

HTTP请求报文主要由请求行、请求头部、请求正文3部分组成。

HTTP响应报文格式:

HTTP响应报文主要由状态行、响应头部、响应正文3部分组成。

请求行

由3部分组成,分别为:请求方法、URL(见备注1)以及协议版本,之间由空格分隔

请求方法包括GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE以及扩展方法

状态行

由3部分组成,分别为:协议版本,状态码,状态码描述,之间由空格分隔

9、装饰器

https://dormousehole.readthedocs.io/en/latest/patterns/viewdecorators.html

视图装饰器

Python 有一个非常有趣的功能:函数装饰器。这个功能可以使网络应用干净整洁。 Flask 中的每个视图都是一个装饰器,它可以被注入额外的功能。你可能已经用过了 route() 装饰器。但是,你有可能需要使用你自己的装饰器。 假设有一个视图,只有已经登录的用户才能使用。如果用户访问时没有登录,则会被重定向到登录页面。这种情况下就是使用装饰器的绝佳机会。

检查登录装饰器

让我们来实现这个装饰器。装饰器是一个包装并替换另一个函数的函数。既然源函数 已经被替代,就需要记住:要复制源函数的信息到新函数中。可以用 functools.wraps() 处理这个事情。

10、API接口:endpoint(端口的理解)

简单理解是:

url通过endpoint来去查找视图函数(通常endpoint的名字与视图函数名一致),但是如果不一致的时候,就需要有针对性的指定某个视图函数去执行,也或者多个蓝图里面有一样的视图函数的场景下,需要指定具体的endpoint

11、什么是Flask,有什么优点?

概念解释
Flask是一个Web框架,就是提供一个工具,库和技术来允许你构建一个Web应用程序。这个Web应用程序可以是一些Web页面,博客,wiki,基于Web的日里应用或商业网站。

优点
Flask属于微框架(micro-framework)这一类别,微架构通常是很小的不依赖外部库的框架。

  • 框架很轻量
  • 更新时依赖小
  • 专注于安全方面的bug

Flask的依赖
Werkzeug 一个WSGI工具包(web服务网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为python语言定义的web服务器和web应用程序或框架之间的一种简单而通用的借口,其他语言也有类似的接口)
jinja2模板引擎

12、Django和Flask有什么区别?

Flask
轻量级web框架,默认依赖两个外部库:jinja2和Werkzeug WSGI工具
适用于做小型网站以及web服务的API,开发大型网站无压力,但架构需要自己设计
与关系型数据库的结合不弱于Django,而与非关系型数据库的结合远远优于Django
Django
重量级web框架,功能齐全,提供一站式解决的思路,能让开发者不用在选择上花费大量时间。
自带ORM(Object-Relational Mapping 对象关系映射)和模板引擎,支持jinja等非官方模板引擎。
自带ORM使Django和关系型数据库耦合度高,如果要使用非关系型数据库,需要使用第三方库
自带数据库管理app
成熟,稳定,开发效率高,相对于Flask,Django的整体封闭性比较好,适合做企业级网站的开发。
python web框架的先驱,第三方库丰富

13、Flask-WTF是什么,有什么特点?

Flask-wtf是一个用于表单处理,校验并提供csrf验证的功能的扩展库
Flask-wtf能把正表单免受CSRF<跨站请求伪造>的攻击
Flask-WTF 提供 FileField 来处理文件上传,它在表单提交后,自动从 flask.request.files 中抽取数据。FileField 的 data 属性是一个 Werkzeug 。
eg:
form.html

<form action="{{ url_for('wtf_form') }}" method='post'>
    {{ form.csrf_token }} #进入csrf验证
    <p>{{ form.username.label }}{{ form.username(style='color:red',placeholder='请输入用户名') }}{{ form.username.errors }}</p>
    <p>{{ form.userpass.label }}{{ form.userpass() }}{{ form.userpass.errors }}</p>
    <p>{{ form.submit() }}</p>
</form>

manage.py

from flask import Flask,render_template,request
from flask_wtf import FlaskForm   #导入继承父类
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import Length,DataRequired

class Login(FlaskForm):  #继承自FlaskForm类
    username = StringField('用户名',validators=[Length(min=6,max=12,message='用户名长度为6~12位'),DataRequired(message='用户名不能为空')])
    userpass = PasswordField('密码',validators=[Length(min=6,max=12,message='密码长度为6~12位'),DataRequired(message='密码不能为空')])
    submit = SubmitField('登录')


@app.route('/wtf_form',methods=['GET','POST'])
def wtf_form():
    form = Login()  #实例化form对象
    if request.method == 'POST':
        if form.validate_on_submit():  #数据正确 并且验证csrf通过
            print(request.form.get('userpass'))
            print(request.form.get('username'))
            return '数据提交成功'
    return render_template('wtf_form.html',form=form)
#注:
#1 methods 参数告诉Flask在URL映射中把这个视图函数注册为GET和POST请求的处理程序,默认GET
#2 采用post请求可以通过对象很轻松访问,GET 请求没有主体,提交的数据以查询字符串的形式附加到URL中
#3 validate_on_submit() 会调用username 字段上附属的 DataRequired() 验证函数。

14、Flask脚本的常用方式是什么?

在shell中运行脚本文件
在python编译器中run

15、如何在Flask中访问会话?

会话(seesion)会话数据存储在服务器上。 会话是客户端登录到服务器并注销的时间间隔。 需要在此会话中进行的数据存储在服务器上的临时目录中。
from flask import session导入会话对象
session['name'] = 'admin'给会话添加变量,也可以使用session.get(‘name’)获取值。
session.pop('username', None)删除会话的变量

16、Flask是一个MVC模型吗?如果是,可以示例一下吗?

flask是一个典型的MVC框架
MVC框架,图形理解

flask项目中的MVC理解

17、解释Python Flask中的数据库连接?

python中的数据库连接有两种方式
在脚本中以用第三方库正常连接,用sql语句正常操作数据库,如mysql关系型数据库的pymsql库
用ORM来进行数据库连接,flask中典型的flask_sqlalchemy,已面向对象的方式进行数据库的连接与操作

18、谈谈restful?

官方文档的说法:
Flask-RESTful 提供的最主要的基础就是资源(resources)。资源(Resources)是构建在 Flask 可拔插视图 之上,只要在你的资源(resource)上定义方法就能够容易地访问多个 HTTP 方法.

其实就是想表达,在资源路由上(resources)定义多个方法(get,post,put等),就可以实现多种效果

Flask 0.7 版本引入了可插拨视图(https://www.osgeo.cn/flask/views.html)。可插拨视图基于使用类来代替函数,其灵感来自于 Django 的通用视图。可插拨视图的主要用途是用可定制的、可插拨的视图来替代部分 实现。

REST是一种Web架构风格,它有六条准则:
1.客户端-服务端(Client-Server)
2.无状态(Stateless)
3.可缓存(Cachable)
4.分层系统(Layered System)
5.统一接口(Uniform Interface)
6.支持按需代码(Code-on-Demand,可选)
只要满足以上六条准则的Web架构可以说是Restful的。

http://www.pythondoc.com/Flask-RESTful/quickstart.html

19、列举Http请求中常见的请求方式?

GET / POST/DELETE

20、列举Http请求中的状态码?

404 请求的url地址不存在
503 访问限制有权限
200 访问成功
302 重定向

1xx —— 元数据
2xx —— 正确的响应
3xx —— 重定向
4xx —— 客户端错误
5xx —— 服务端错误
100 Continue。客户端应当继续发送请求。
200 OK。请求已成功,请求所希望的响应头或数据体将随此响应返回。
201 Created。请求成功,并且服务器创建了新的资源。
301 Moved Permanently。请求的网页已永久移动到新位置。 服务器返回此响应(对GET或HEAD请求的响应)时,会自动将请求者转到新位置。

302 Found。服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
400 Bad Request。服务器不理解请求的语法。
401 Unauthorized。请求要求身份验证。对于需要登录的网页,服务器可能
返回此响应。
403 Forbidden。服务器拒绝请求。
404 Not Found。服务器找不到请求的网页。
500 Internal Server Error。服务器遇到错误,无法完成请求。

21、列举Http请求中常见的请求头?

User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
Cookie:这是最重要的请求头信息之一
Content-Type:请求类型

22、什么是wsgi?

WSGI(Web Server Gateway Interface,Web 服务器网关接口)则是Python语言中1所定义的Web服务器和Web应用程序之间或框架之间的通用接口标准。
WSGI就是一座桥梁,桥梁的一端称为服务端或网关端,另一端称为应用端或者框架端,WSGI的作用就是在协议之间进行转化。WSGI将Web组件分成了三类:Web 服务器(WSGI Server)、Web中间件(WSGI Middleware)与Web应用程序(WSGI Application)。
Web Server接收HTTP请求,封装一系列环境变量,按照WSGI接口标准调用注册的WSGI Application,最后将响应返回给客户端。

23、Flask框架依赖组件?

Route(路由)
templates(模板)
Models(orm模型)
blueprint(蓝图)
Jinja2模板引擎

24、Flask蓝图的作用?

蓝图Blueprint实现模块化的应用

  • book_bp = Blueprint('book', name)创建蓝图对象
  • 蓝图中使用路由@book_bp.route('url')
  • 在另一.py文件里导入和注册蓝图from book import book_bp app.register_blueprint(book_bp)

作用
将不同的功能模块化
构建大型应用
优化项目结构
增强可读性,易于维护(跟Django的view功能相似)

25、列举使用过的Flask第三方组件?

flask_bootstrap
flask-WTF
flask_sqlalchemy

26、简述Flask上下文管理流程?

每次有请求过来的时候,flask 会先创建当前线程或者进程需要处理的两个重要上下文对象,把它们保存到隔离的栈里面,这样视图函数进行处理的时候就能直接从栈上获取这些信息。

27、Flask中多app应用是怎么完成?

请求进来时,可以根据URL的不同,交给不同的APP处理

28、wtforms组件的作用?

WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。

29、Flask框架默认session处理机制?

Flask的默认session利用了Werkzeug的SecureCookie,把信息做序列化(pickle)后编码(base64),放到cookie里了。

过期时间是通过cookie的过期时间实现的。

为了防止cookie内容被篡改,session会自动打上一个叫session的hash串,这个串是经过session内容、SECRET_KEY计算出来的,看得出,这种设计虽然不能保证session里的内容不泄露,但至少防止了不被篡改

30、ORM的实现原理?

概念: 对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

详细介绍: 让我们从O/R开始。字母O起源于”对象”(Object),而R则来自于”关系”(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。
当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。
ORM解决的主要问题是对象关系的映射。域模型和关系模型分别是建立在概念模型的基础上的。域模型是面向对象的,而关系模型是面向关系的。一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录,类的每个属性对应表的每个字段。
ORM技术特点:
1.提高了开发效率。由于ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射,所以我们实际可能已经不需要一个专用的、庞大的数据访问层。
2.ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样从数据库获取数据。