运维工程师面试总结

2021-08-13  本文已影响0人  早_wsm

前言:

最近在面试找工作,整理一下遇到的面试题.大公司更倾向于基础,小公司更偏向于业务处理,但整体上遇到的面试问题大部分都会围绕于你简历中写了哪些技术.
写下这些面试题,权且当做对用到的技术做概念上的梳理.当然其中一些答案有的是我摘自别人的,可能存在不严谨的情况,建议自行验证

Django

讲一下Django的生命周期

浏览器发起请求>>WSGI创建socket服务端,接收请求(Httprequest)>>中间件处理请求>>url路由,根据当前请求的URL找到视图函数>>view视图,进行业务处理>>中间件处理响应>>WSGI返回响应(HttpResponse)>>浏览器渲染

说一下用过哪些中间件

Python

python中俩个列表如何取交集

获取两个list 的交集

a=[2,3,4,5]
b=[2,5,8]
tmp = [j for j in a if j in b] #列表推导式求的两个列表的交集
print(tmp)
print(list(set(a).intersection(set(b)))) # #列用集合的取交集方法
lst = []
for i in a:
if i in b :
lst.append(i)
print(lst)

拓展:
获取两个 list 的差集
方法一:
ret = list(set(a)-set(b))
print(ret)
方法二:
print(list(set(b).difference(set(a)))) # b中有而a中没有的
获取两个 list 的并集
方法一:
ret = list(set(a)-set(b))
print(ret)
方法二:
print(list(set(b).difference(set(a)))) # b中有而a中没有的

python全局变量应用场景

Python 允许在所有函数的外部定义变量,这样的变量称为全局变量(Global Variable)
全局变量的默认作用域是整个程序,即全局变量既可以在各个函数的外部使用,也可以在各函数内部使用
globals() 函数为 Python 的内置函数,它可以返回一个包含全局范围内所有变量的字典,该字典中的每个键值对,键为变量名,值为该变量的值
locals() 函数也是 Python 内置函数之一,通过调用该函数,我们可以得到一个包含当前作用域内所有变量的字典。这里所谓的“当前作用域”指的是,在函数内部调用 locals() 函数,会获得包含所有局部变量的字典;而在全局范文内调用 locals() 函数,其功能和 globals() 函数相同

python可变数据类型有哪些

可变数据类型:当该数据类型对应的变量的值发生了变化时,如果它对应的内存地址不发生改变,那么这个数据类型就是 可变数据类型。

不可变数据类型:当该数据类型对应的变量的值发生了变化时,如果它对应的内存地址发生了改变,那么这个数据类型就是 不可变数据类型。

总结:可变数据类型更改值后,内存地址不发生改变。不可变数据类型更改值后,内存地址发生改变。

装饰器用过吗,写一个简单的装饰器

用自己的话总结一下
装饰器可完成对原函数的扩展,可传递函数做为参数

# 一个简单的装饰器
def wsm(f):
    def wzj(*args,**kwargs):
        s = time.time()
        res = f(*args,**kwargs)
        e = time.time()
        h = (e -s)
        print(f'当前耗时{h}秒')
        return res
    return wzj

@wsm
def func():
    time.sleep(2)
    list1 = [1,2,2,3]
    list2 =  list(set(list1))

    print(list2)
func()

Docker

Dockerfile中ENTRYPOINT和CMD的区别:

总结:CMD和ENTRYPOINT可指定容器启动运行的参数,但是真实启动时如果RUN后面修改了启动参数,那以RUN修改的参数优先,而ENTRYPOINT比较倔,就不改

ADD和COPY的区别:
docker的几种网络模型

K8S

k8s的工作原理

用户创建pod请求信息>>存到etcd中>>scheduler查询分配未使用的node创建pod>>kubelet接收创建指令,实时汇报pod信息>>contrller-manager通过apiserver监控集群状态,确保集群处于预期工作中
用户通过kubectl或者APIserver的rest api接口提交需要运行的docker容器(创建pod请求)
api server将创建pod相关请求数据存储至etcd中
scheduler监听API server,查询还未分配的Node的pod,然后根据调度策略为这些pod分配节点
kubelet负责在所在的node节点上接收主节点发来的指令,管理pod及pod中的容器,并定时向master主节点汇报节点资源的使用情况及容器的情况
controller-manager则通过api-server监控整个集群的状态,并确保集群处于预期的工作

k8s中的常用组件
k8s的网络模式

k8s 网络模型要符合四个基础原则、三个网络要求原则、一个架构原则、一个 IP 原则。
每个 Pod 都拥有一个独立的 IP 地址,而且假定所有 Pod 都在一个可以直接连通的、扁平的网络空间中,不管是否运行在同一 Node 上都可以通过 Pod 的 IP 来访问。
k8s 中的 Pod 的 IP 是最小粒度 IP。同一个 Pod 内所有的容器共享一个网络堆栈,该模型称为 IP-per-Pod 模型。

pod有几种状态
pod服务启动失败有哪些原因及排查:
# 获取信息
kubectl describe pod 资源id
# 查看日志
kubectl logs 资源id
# 进入资源中
kubectl exec -it 资源id bash

常见故障

VUE

vue中组件间怎么传递数据:
vue中data内要return为什么:
vue组件的生命周期:

组件的生命周期就是一个组件创建、数据初始化、挂载、更新、销毁的整个过程,其中具体方法:

beforeCreate
// 在实例初始化之后,数据观测和event/watcher时间配置之前被调用
created
// 实例已经创建完成之后被调用。在这一步,实例已经完成以下的配置:数据观测,属性和方法的运算,watch/event事件回调。然而,挂载阶段还没开始,$el属性目前不可见
beforeMount
// 在挂载开始之前被调用:相关的render函数首次被调用。
// 该钩子在服务器端渲染期间不被调用
mounted (
// el被新创建的vm.$el替换,并挂在到实例上去之后调用该钩子函数。如果root实例挂载了一个文档内元素,当mounted被调用时vm.$el也在文档内。
// 该钩子在服务端渲染期间不被调用。
    beforeUpdate
   // 数据更新时调用,发生在虚拟DOM重新渲染和打补丁之前。
  // 你可以在这个钩子中进一步第更改状态,这不会触发附加的重渲染过程。
  // 该钩子在服务端渲染期间不被调用。
    updated
    // 由于数据更改导致的虚拟DOM重新渲染和打补丁,在这之后会调用该钩子。
   // 当这个钩子被调用时,组件DOM已经更新,所以你现在可以执行依赖于DOM的操作。然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环。
   //该钩子在服务端渲染期间不被调用
)

beforeDestroy
// 实例销毁之间调用。在这一步,实例仍然完全可用。
// 该钩子在服务端渲染期间不被调用。
destroyed
// Vue实例销毁后调用。调用后,Vue实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。
// 该钩子在服务端渲染不会被调用

DevOps

jenkins的流程,怎么构建的
  1. 开发者开发代码
  2. 提交至git仓库
  3. jenkins从仓库拉取代码
  4. jenkins通过maven(ant,gradle等)构建项目推到docker仓库
  5. 生成一个在tomcat运行的项目的docker容器
  6. 测试人员测试
jenkins的webhook怎么配置

shell

使用脚本取公网ip和内网ip

还有很多其他方法....

strace命令可以获取一个程序调用哪些函数的整个过程,貌似是这个命令

使用脚本写出多块4T盘,格式化后分区挂载并添加自启动
for V in $(ls /dev/sd[b-z])
do
  echo -e "n\np\n\n\n\nw\n" |parted $V
  mkfs.xfs -i size=512 ${V}1 &>/dev/null
  sleep 1
  M=$(echo "$V" |awk -F "/" '{print $3}')
  mkdir -p /data/${M}1 &>/dev/null
  echo -e "${V}1 /data/${M}1 xfs defaults 0 0\n" >>/etc/fstab
  mount -a &>/dev/null
done
使用脚本监测一个程序每15秒的状态,如果15秒中未监测到进程,则视为程序退出了(还有其他需求,大致记得这么多)

一个简单思路,未做验证,还有语法可能不通

c = 1
while true
do
# 获取此程序pid
A = ps -ef|grep '程序'
    if '$A' == '';then
        sleep 3
        c += 1
        if [ $c -eq 5 ];then
            break
        fi
    else
        continue
    fi
done

其他

Linux开机启动顺序

我觉得不准确,再查一查

1、加载BIOS(包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等)
2、读取MBR(硬盘上第0磁道第一个扇区)
3、Boot Loader(初始化硬件设备、建立内存空间的映射图)
4、加载内核
5、设定运行等级(init0-init6)
6、执行rc.sysinit
7、启动内核模块
8、执行不同运行级别的脚本
9、执行rc.local
10、执行/bin/login 进入登陆状态

Redis持久化
Zabbix自动发现及分布式
软连接与硬链接的区别:
僵尸进程和孤儿进程的区别:
怎么查看僵尸进程:
Nginx中location的匹配规则:

「=」 修饰符:要求路径完全匹配
「~」修饰符:区分大小写的正则匹配
「~*」不区分大小写的正则匹配
「^~」修饰符:前缀匹配 如果该 location 是最佳的匹配,那么对于匹配这个 location 的字符串, 该修饰符不再进行正则表达式检测。注意,这不是一个正则表达式匹配,它的目的是优先于正则表达式的匹配

Nginx日志中出现499报错是怎么回事

后端处理请求时间过长,客户端等的不耐烦了,提前关闭了http连接.常见于后台接口处理时间比较长,而前端请求又自带有超时时间
排查方法:

Apche与Nginx的区别

简单来说apache是同步多进程处理业务,更稳定,nginx异步处理业务,面对高并发更快性能更好.
nginx适合静态服务

TCP连接的几种状态:
LISTEN:侦听来自远方的TCP端口的连接请求
SYN-SENT:再发送连接请求后等待匹配的连接请求(客户端)
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认(服务器)
ESTABLISHED:代表一个打开的连接
FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2:从远程TCP等待连接中断请求
CLOSE-WAIT:等待从本地用户发来的连接中断请求
CLOSING:等待远程TCP对连接中断的确认
LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED:没有任何连接状态
常见状态码:
Ansible的使用:
ansible testservers -m copy -a 'src=/root/install.log dest=/tmp/install.log owner=testuser group=testgroup'
# 先进入somedir/ ,再在somedir/目录下让所有节点运行somescript.sh并把log输出到somelog.txt

ansible -i hosts all -m shell -a "somescript.sh >> somelog.txt" chdir=somedir/
LVS模式的几种及使用场景:

LVS工作模式分为NAT模式、TUN模式、以及DR模式

灾备是如何做的(其实就是数据库备份)
列出服务器备份恢复策略
Rsync 三种模式
linux系统做过内核优化吗?

没有,但是知道是修改sysctl.conf文件其中存在比较多的参数可供优化,但是做过nginx等中间件的优化....

最大并发连接数
允许系统打开的端口范围
发送缓存区的最大值
发送缓存区的默认值
socket保持FN-WAIT-2状态的最大时间 
.......
并发翻倍,系统正在扩容中,但是扩容需要7分钟才可以完成,怎么用现有服务器抗住7分钟内的翻倍并发

我不知道
面试官答:是在代码中做了埋点,当并发大于某一阈值,会触发开关,此时业务上存在的部分功能不可用,比如微博上传视频此时不做转码等等,以牺牲部分功能延缓到扩容完成后(简单的讲就是业务降级)

系统出现504需要怎么排查

客户访问时,代理不能及时地从远程服务器获得应答给客户,此时要检查后端数据服务是否出现问题,为什么未及时返还数据

写一下你们现有的架构

自己写

上一篇下一篇

猜你喜欢

热点阅读