linux运维面试题

linux运维面试题

面试

K8S篇(高可用)

Q:k8s是什么?架构?

Kubenetes是一个开源的容器集群管理系统。主要用于容器编排,解决容器调度问题。当应用请求时,k8s需要合理分配请求到空闲node节点上去。k8s使用的主从模式,至少有一个主节点(Master)和多个工作节点(Node)。

master主要用于暴露API,调度部署和节点的管理。包括apiServer、scheduler、controller、etcd以及各种插件(dns)。etcd保存了整个集群状态。master会运行有大量副本控制器,抽象的service通过label调度一组pod。

Node是K8s集群操作的单元,是工作节点。node核心组件有kubelet,kube-proxy,kubelet用于维护声明周期以及和master通信。kube-proxy用于集群内部的服务发现、负载均衡等。

pod是k8s中最小的调度单元, 包含多个相关容器。pod一般是短暂的实体。每个pod都会有一个pause根容器,和其它业务容器,容器可以通过共享内存进行通信。作用: 评估健康状态,设置Ip地址实现Pod内部通信。

etcd是k8s必不可少的存储组件。

Q:什么是etcd?

ETCD是用于共享配置和服务发现的分布式KV存储系统。基于Go语言实现。

特点:

简单:支持 REST 风格的 HTTP+JSON API,算法易理解。

安全:支持 HTTPS 方式的访问

快速:支持并发 1k/s 的写操作

可靠:支持分布式结构,基于 Raft 的一致性算法,Raft 是一套通过选举主节点来实现分布式系统一致性的算法。

raft算法:

raft算法包括3个子问题:选举、 日志复制、 安全性。

选举:

Raft算法中,任何服务器都可以扮演下面三个角色之一:领袖、群众、候选人。

Leader(领导者):负责日志的同步管理,处理来自客户端的请求(日志),负责保证其他节点与他的日志同步。

Follower(追随者):刚启动时所有节点为Follower状态,响应Leader的日志同步请求,响应Candidate的请求,把请求到Follower的事务转发给Leader。

Candidate(候选者):从Follower转为Candidate发起选举,选举出Leader后从Candidate转为Leader状态。

Raft运行时提供服务的时候只存在Leader与Follower两种状态。选举由定时器来触发,每个周期不定。

日志复制:

所有日志请求都必须先经过Leader处理,保证了一致性。

安全性:

安全性是用于保证每个节点都执行相同序列的安全机制。

保证选举出来的Leader一定包含先前 commited Log。

Q:ETCD适应的场景?

服务发现、消息发布与订阅、负载均衡、分布式锁。

服务发现主要解决在同一个分布式集群中的进程或服务,要如何才能找到对方并建立连接。

etcd使用raft算法保持了强一致性,所以很容易实现分布式锁。锁服务有两种使用方式,一是保持独占,二是控制时序。

Q:为什么用etcd而不用Zookeeper?

Zookeeper缺点:

复杂。部署维护复杂,使用也复杂,需要安装客户端,官方只提供了java和C两种语言的接口。

Java编写。Java会引入大量的依赖。

发展缓慢。Apache基金会庞大的结构以及松散的管理导致项目发展缓慢。

Q:k8s用法?

在单机上使用k8s,需要安装kubectl与minikube。

Minikube 是一种可以在本地轻松运行一个单节点 Kubernetes 群集的工具。

Kubectl 是一个命令行工具,可以部署应用、检查和管理集群资源、查看日志。

kubelet:在每个Node上都会启动一个kubelet服务进程,该进程用于处理Master下发到本节点的任务,管理Pod及Pod中的容器。

其他

1、基础概念

Q:Linux 命令

Linux kill命令

Linux kill 命令向进程发送信号。

常用信号:

1 (HUP):重新加载进程。

9 (KILL):杀死一个进程。

15 (TERM):正常停止一个进程。

SIGUSR1/SIGUSR2: 这表示用户定义的条件

例:

kill -9 123456

kill -HUP 53

kill 12345

Linux 关机重启命令

重启:Reboot, shutdown-r是重启

关机:half,shutdown-s

netstat是显示网络状态

linux 检测远程端口是否打开

telnet

nc

nmap

linux 0,1,2的含义

例:echo "hello" > t.log

2>&1:将标准错误输出重定向到标准输出

2>1:将标准错误输出重定向到名为"1"的文件里

nohup java -jar app.jar >log 2>&1 &:

把1和2都理解是一个指针,:本来1->屏幕 ,执行>log后, 1->log

执行2>&1后, 2->1 (2指向1,而1指向log,因此2也指向了log)

"&>log" ">log 2>&1"">&log"

在Linux中命令后加&,表示该进程后台运行;

nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。nohup ,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

ps -aux | grep

ps 为我们提供了进程的一次性的查看

a : 显示所有程序 ; u : 以用户为主的格式来显示 ; x : 显示所有程序,不区分终端机

grep (RE) ,全面搜索正则表达式并把行打印出来

ps aux | grep go_gateway | grep -v 'grep' | awk '{print $2}' | xargs kill

查询当前进程中是否包含go_gateway,如包含则杀死

grep -v 不包含

ps -ef|grep erp-api.jar|grep -v grep|awk '{print $2}' 获取第二个参数

xargs 将前面获取到的进程号通过空格分割,杀死所有进程

awk 命令:逐行扫描文件

"#!/bin/sh"

"#!/bin/sh"是对shell的声明,说明你所用的是那种类型的shell及其路径所在。

Q:Linux 进程状态

就绪状态、执行状态、阻塞状态

进程没有睡眠状态,有睡眠状态的是线程

2、日常命令

cd、pwd、ls、cat、uname

cd -返回上一次所在的目录;cd ~主目录;cd /根目录;

echo P A T H 查看变量 PATH查看变量 PATH查看变量PATH的值

单引号所见即所得;双引号是先把变量解析之后再输出。在双引号中:

\ 反斜杠是转义字符;`` 反引号代表引用命令。

星号表示一个或者多个字符,问号代表一个字符。

删除目录: rmkir;rm -r

创建文件的几种方式

html 复制代码
touch;echo;printf;cat;vi/vim

个人认为最好用:gedit

trap:用于指定在接收到信号后将要采取的动作.

如:trap exit 2

Ctrl+Shift+C进行复制,Ctrl+Shift+V进行文本粘贴

".deb" 是 ubuntu 、debian 的格式。

html 复制代码
sudo apt install XXX

3、函数

html 复制代码
echo "number:$#"    获取参数个数

echo "scname:$0"    获取脚本名称

echo "first:$1"            获取第一个参数

echo "second:$2"         获取第二个参数

echo "argume:$@"         获取所有参数

echo "show parm list :$*" 数据参数的list

echo "show process id :$$"  获取进程id

echo "show precomm stat:$?"     获取命令执行的结果

grep abc xx 搜索XX文件里有abc的行

锁:fcntl ()、flock()、unlock()

4、vim命令

正常模式:可以使用快捷键命令,或按:输入命令行。

插入模式:可以输入文本,在正常模式下,按i、a、o等都可以进入插入模式。

可视模式:正常模式下按v可以进入可视模式, 在可视模式下,移动光标可以选择文本。按V进入可视行模式, 总是整行整行的选中。ctrl+v进入可视块模式。

替换模式:正常模式下,按R进入

:w -- 保存修改。

:q -- 退出。

:q! -- 退出并且不保存修改。

:wq 、:x -- 保存并退出。

删除多行:正常模式下输入"10dd"

5、linux目录

6、docker

命令

docker ps #仅显示正在运行的容器

docker ps -a#所有容器

docker search xxx

docker rmi -f ID

# -d后台运行容器,-h或者--hostname指定容器主机名为my-rabbit,

  • -name是指定容器名称为some-rabbit,-p指的是端口, rabbitmq的镜像名:latest
  • f 实时监控容器日志, -it:进入终端

docker根目录: /var/lib/docker

例子

1、

docker run -d --name rabbit -p 5672:5672 -p 15672:15672 -p 25672:25672 -v /data/rabbitmq:/var/lib/rabbitmq rabbitmq --restart=always

docker run -d --name mysql -p 3306:3306 mysql --restart=always

2、

docker run -d --hostname my-rabbit --name rabbit -p 5672:5672 -p 15672:15672 -p 25672:25672 -v /data/rabbitmq:/var/lib/rabbitmq rabbitmq:management

3、sudo docker run -itd -v ~/docker_test:/home ubuntu /bin/bash

冒号前后分别为本地路径 和 docker内的路径

/bin/bash的作用是因为docker后台必须运行一个进程,否则容器就会退出,在这里表示启动容器后启动bash.(非必要)

4、rabbitmq

加载rabbitmq的管理器插件:

docker exec some-rabbit rabbitmq-plugins enable rabbitmq_management

新增用户

rabbitmqctl add_user name passwd

赋予权限

rabbitmqctl set_user_tags name administrator

rabbitmqctl list_users

docker login -u 用户名 -p 密码

5、exec

docker exec -it ID bash

docker start/restart id

6、docker run -d -p 16379:6379 --name redis redis:latest

最后参数为指定镜像

7、docker build -t test:v1 .

8、docker run -it nginx:latest /bin/bash

使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。

9、docker attach

进入容器

架构

docker快速入门:https://docker.easydoc.net

Docker三个概念:dockerfile、image、container

Image:类似虚拟机的快照。里面包含你要部署的应用程序以及它所关联的所有库。

一个镜像可以创建多个不同的容器,每个容器独立。一个容器对应一个镜像

Dockerfile:自动化脚本


Volume数据卷(共享文件夹)

基础命令

$ docker volume create test

$ docker volume ls

$ docker inspect test

$ docker volume rm test

如果启动容器时带的容器不存在,那么 docker 会创建一个。

例:docker run -p 27018:27017 --name mongo -v mongo-data:/data -d mongo:4.4

Docker-compose.yml可定义多个容器

docker compose up运行所有容器

多容器通信(***)

创建虚拟网络

k8s

8、LVS

LVS 是四层负载均衡,建立在传输层之上,传输层有 TCP/UDP

LVS (Linux Virtual Server)是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术。LVS架构从逻辑上可分为负载调度器、服务器池和共享存储。

**负载调度器:**它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。

**服务器池:**是一组真正执行客户请求的服务器,执行的服务一般有WEB、MAIL、FTP和DNS等。

**共享存储:**它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。

**术语:**DS:Director Server。指的是前端负载均衡器节点。

RS:Real Server。后端真实的工作服务器。

VIP:向外部直接面向用户请求,作为用户请求的目标的 IP 地址。

LB:load balancer

Lvs常用的3种调用算法:

· **基本轮询调度 rr:**调度器会将所有的请求平均分配给每个真实服务器

· 加权最小连接调度 wlc:

把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态的调度算法,它通过服务器当前活跃的连接数来估计服务器的情况。

· **加权轮询调度 wrr:**根据性能给每台服务器添加权值。权值越高,处理请求越多。

Lvs 3种模式:

NAT模式:

NAT 模式下,网络数据的进出都要经过 LVS 处理,LVS 需要作为真实服务器的网关。

客户请求越来越多时,lb压力越来越大

TUN IP隧道模式:

请求由 LVS 接受,由真实提供服务的服务器(RS)直接发放给用户,返回的时候不经过 LVS。

缺点:暴露真实服务器地址,RS必须支持IP隧道协议,有IP隧道的开销

DR(直接路由)模式:

请求由 LVS 接受,由真实提供服务的服务器(RS)直接发放给用户,返回的时候不经过 LVS。

返回的数据打包给给路由包装器统一返回。

DR 负载均衡模式数据分发过程中不修改 IP 地址,只修改 Mac 地址,不需要通过负载均衡服务器进行地址转换

8、".d"

linux中".d"文件表示的是:1、依赖文件,其中d是dependence的意思;2、默认配置文件,其中d是default的意思;3、动态意义的文件,其中d是Dynamic的意思。

9、请你说说IO多路复用(select、poll、epoll)*

IO多路复用是指单个线程或进程能够处理多个IO请求。select调用主要统计有多少个文件描述符需要进行IO操作。缺点:内存开销大,支持的的文件描述符的个数有限。poll和select调用差别不大,主要是底层数据结构变成了链表,支持的文件描述符的个数无上限。epoll调用是更加高效的方式,底层数据结构使用了红黑树和链表,避免了大量的内存分配和轮询。

相关推荐
AlfredZhao10 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户97183563346616 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪17 小时前
linux 拷贝文件或目录到指定的位置
linux
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
小宇宙Zz1 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信