运维面试题目总结

docker k8s

1.docker单机多容器之间的网络连通:

// 创建一个bridge类型的网络hadoop-br
docker network create -d bridge hadoop-br1

// 启动一个网络为hadoop-br方式的容器hadoop1
docker run -itd --network hadoop-br1 --name hadoop01 centos

// 再创建一个容器
docker run -itd --network hadoop-br1 --name hadoop02 centos

k8s label
本来k8spod的分配是schedule进行调度,我们希望他调度到指定的node,可以用一下命令:
给node1设置标签:
kubectl label node k8s-node1 disktype=ssd
然后设置标签选择器:
在这里插入图片描述
这个pod将在node1中运行

stateful set
优势:
稳定的唯一网络标识符。
稳定,持久的存储。
有序,顺畅的部署和扩展。
有序的自动滚动更新。
局限性
需要使用hardless service来标识pod
在删除statefulset资源时不会删除pod,需要将副本设置为0,
Hardless service(无头服务)
在这里插入图片描述
除了clusterIP设置成None,他们和普通的service一样

pod启动又挂掉解决思路
kubectl get pod podname -o yaml
kubectl describe pod
kubectl logs [-c ]
Nginx Pod作为客户端访问tomcat Pod中的应用,当tomcat Pod中的应用因工作节点故障或者被手动删除后重启,它的IP会发生变化,这样会导致nginx通过原先IP访问tomcat中的应用会出错。另外,当Pod应用进行规模缩减时,一部分Pod会下线,如果客户端继续访问也会出错。而当Pod应用进行规模扩容时,新增的Pod将无法被有效访问。

除此以外,Pod对象的IP地址都仅在集群内部可达,无法接入外部请求的流量。

Service资源就是用于解决以上问题的。
service是定义出由多个pod的组合而成的逻辑组合以及访问这组pod的策略
SVC负责检测Pod的状态信息,不会因pod的改动IP地址改变(因为关注的是标签),导致Nginx负载均衡影响

执行docker network inspect 网络名称可查看网络信息。
2.docker四种网络模式

  • Bridge contauner 桥接式网络模式
  • Host(open) container 开放式网络模式
  • Container(join) container 联合挂载式网络模式,是host网络模式的延伸
  • None(Close) container 封闭式网络模式
    bridge模式:
    从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
    brctl show命令查看

Host模式:
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
docker run --name b2 -it --network host --rm busybox:latest

Container 模式:
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

None模式:
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息,只有lo 网络接口。需要我们自己为Docker容器添加网卡、配置IP等。
  不参与网络通信,运行于此类容器中的进程仅能访问本地回环接口;仅适用于进程无须网络通信的场景中,例如:备份、进程诊断及各种离线任务等。

k8s暴露服务的三种方式
nodeport:将服务的类型设置成nodeport,让k8s在其所有节点上开放一个端口供外部访问,将传入的连接转发给service服务的pod
loadbalance:增加了一个负载均衡器面的NodePort是所有节点都开放一个端口,直接给外部访问,并没有Node节点的负载均衡。LoadBalane则是在上面的基础上增加了一层,只提供一个公网ip给外部访问,外部访问这个ip再负载均衡分发给Node节点的Pod
ingress:
微服务网关, 本质:七层反向代理,微服务集中出入口;ingresscontroller通过apiserver监听ingress资源,并实时生效,ingress订一些规则,而ingresscontroller监听这些规则。

使用k8s进行蓝绿发布
首先蓝绿发布就是A/B发布,
使用k8s进行金丝雀发布
先替换镜像紧接着暂停发布,kubectl set image && kubectl rollout pause
(或者修改yaml文件,或者使用kubectl edit deployment ) deployment name -n
查看一下deployment状态 kubectl get deployment name -n
查看发布状态 kubectl rollout status deployment name
然后可以用curl请求一下 for i in {1…100};do curl
然后继续滚动更新 kubectl rollout resume deployment name
如果出现问题 查看历史版本 kubectl rollout history deployment name
回滚 kubectl rollout undo deployment name --to-revision=

apiVersion: extension/v1beta1 #把一个发往ilinux.io的资源代理给myapp-svcservice
kind: Ingress
metadata:
 name: my-ingress
  annotations:
   kubernetes.io/ingress.class: "nginx"
spec:
 rules:
 - host: www.ilinux.io
   http:
    paths:
    - backend:
       serviceName: myapp-svc
       servicePort: 80

k8s 的服务如何让外网去访问

1.hostNetwork: true 直接暴露 pod在部署pod的节点上,然后通过节点的ip加端口去访问。

k8s不容node节点之间如何进行通信

只做学习之用,如有侵权,请联系我删除
因此,数据包将pod1的网络保留在eth0,并进入veth0的根网络。

然后它被传递给cbr0,这使得ARP请求找到目的地,并且发现该节点上没有人具有目的地IP地址。

因此,桥接器将数据包发送到flannel0,因为节点的路由表配置了flannel0。

现在,flannel守护程序与Kubernetes的API服务器通信,因为节点信息都记录在etcd中,通过etcd找到目标节点的节点IP,以了解所有pod IP及其各自的节点,以创建pods IP到节点IP的映射。

网络插件将此数据包封装在UDP数据包中,其中额外的标头将源和目标IP更改为各自的节点,并通过eth0发送此数据包。

现在,由于路由表已经知道如何在节点之间路由流量,因此它将数据包发送到目标节点2。

数据包到达node2的eth0并返回到flannel0以解封装并在根网络命名空间中将其发回。

同样,数据包被转发到Linux网桥以发出ARP请求以找出属于veth1的IP。

数据包最终穿过根网络并到达目标Pod4。

k8s数据持久化
通过节点选择器可以将pod调度到指定节点

spec: 
  volumes: 
    - name: cache-volume
      hostpath: 
        path: /opt/mysql/data
    nodeSelector: #使用节点选择器将pod调度到指定label的节点
      component: mysql 
  containers: 
  - image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
      - mountPath: /cache
        name: cache-volume

k8s服务健康检查
在这里插入图片描述
pod资源限制
对于一个pod来说,最基本的两个资源:CPU和内存
k8s提供了request和limits两种类型参数对资源进行分配和限制
在这里插入图片描述
deployment和pod
deployment在pod之上多了一层workload工作负载,

修改pod内容:

#修改副本数
kubectl -n demo scale test --replicas=3

更新策略:maxSurge 最大激增数 25%*2=0.5 向上取整,表示在更新过程中,最多可以存在的pod的数量为3 (1+replicas),
maxUnavailable 最大不可用
在这里插入图片描述

apiVersion: apps/v1
kind: Deployment
metadata:
 name: tomcat-deploy
 namespace: testing
spec:
 replicas: 2
 selector:
  matchLabels:
   app: tomcat
 template:
  metadata:
   labels:
    app: tomcat
  spec:
   containers:
   - name: tomcat
     image: kubeguide/tomcat-app:v1
     ports:
     - containerPort: 8080
       name: httpport
   nodeSelector:
    tomcat: "true"
apiVersion: v1
kind: Pod
metadata:
  name: hello-kube
spec:
  hostNetwork: true
  containers:
  - name: hello-kube
    image: paulbouwer/hello-kubernetes:1.8
    ports:
    - containerPort: 8080
    env:
    - name: MESSAGE
      value: "hello-kube"

k8s调度策略
软策略:preferredduringschedulingIgnored… 最好符合,不符合就忽略这条策略
硬策略:requiredDuringSchedulingIgnored… 必须符合
在这里插入图片描述

k8s部署流程:开发人员提交代码到代码仓库,然后触发jenkins的自动构建,拉取代码,做一些自动化的代码质量扫描,以及单元测试,自动化测试,通过之后进行编译,打包,进行镜像的打包,推送到远程的镜像仓库,然后在部署的时候k8s拉取镜像,在pod文件中修改版本号,然后用kebectl set对pod应用进行升级,

fluentd

source:从哪里取日志
在这里插入图片描述
match:到哪里去
在这里插入图片描述
fluent.conf的配置
在这里插入图片描述

MySQL

如何重置mysql root密码?
mysqladmin -uroot -p ‘新密码’

update mysql.user set password=‘新密码’ where user=‘root’;
flush privileges;

grant all on *.* to root@localhost identified by ‘新密码’;

忘记mysql密码
关闭MySQL服务 service mysqld stop
使用mysqld_safe脚本以安全模式(不加载授权表)启动mysqld 服务
/usr/local/mysql/bin/mysqld_safe --skip-grant-table &
mysql -uroot -p进入
update mysql.user set password=password where user=root
flush privileges
mysql备份
mysqldump -uroot -p --all-databases > /backup/mysqldump/all.db
mysqldump -uroot -p test > /backup/mysqldump/test.db

主从复制原理
1.主库有二进制的bin-log日志文件,记录了所有的sql语句
2.想要进行主从复制,就需要将bin-log日志复制到从库
3.然后从库执行sql语句,复制完成
上述过程主库开启binlog线程,当有从库连接到主库时,就会主库就会创建binlog线程发送内容到从库,
从库中当复制开始时,从库开启两个线程,
从库开启IO线程,将binlog日志复制到从库,写入到从库的中继日志文件中
之后从库sql线程读取中继日志文件,执行一遍sql,复制完成

MySQL 主从同步延时问题(精华)
以前线上确实处理过因为主从同步延时问题而导致的线上的 bug,属于小型的生产事故。

是这个么场景。有个同学是这样写代码逻辑的。先插入一条数据,再把它查出来,然后更新这条数据。在生产环境高峰期,写并发达到了 2000/s,这个时候,主从复制延时大概是在小几十毫秒。线上会发现,每天总有那么一些数据,我们期望更新一些重要的数据状态,但在高峰期时候却没更新。用户跟客服反馈,而客服就会反馈给我们。

我们通过 MySQL 命令:
show status

查看 Seconds_Behind_Master,可以看到从库复制主库的数据落后了几 ms。

一般来说,如果主从延迟较为严重,有以下解决方案:

分库,将一个主库拆分为多个主库,每个主库的写并发就减少了几倍,此时主从延迟可以忽略不计。
打开 MySQL 支持的并行复制,多个库并行复制。如果说某个库的写入并发就是特别高,单库写并发达到了 2000/s,并行复制还是没意义。
重写代码,写代码的同学,要慎重,插入数据时立马查询可能查不到。
如果确实是存在必须先插入,立马要求就查询到,然后立马就要反过来执行一些操作,对这个查询设置直连主库。不推荐这种方法,你要是这么搞,读写分离的意义就丧失了。

脚本

1.写一个脚本,实现判断192.168.1.0/24网络里,当前在线的IP有哪些,能ping通则认为在线

#!/bin/bash
for ip in `seq 1 255`
do
{
ping -c 1 192.168.1.$ip > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo 192.168.1.$ip UP
else
echo 192.168.1.$ip DOWN
fi
}&
done
wait

sort命令
wc -c 命令
uniq命令
shell 数组相关,& wait并发执行
将字符串中大于6的单词打印
who -b
crontab * * * * * 分钟 时 天 月 星期0-6
/var/spool/mail/ 下查看每个用户定时任务详情
( ) 与 () 与 (){} 的区别:$() 是引用()中运行的结果
${} 仅仅是用{}中的内容,是参数,不执行

#!/bin/bash

words='I am oldboy teacher welcome to oldboy training class.'

for word in ${words[@]};do
l=$(echo $word | wc -c)
if [ $l -gt 7 ];then
echo $word
fi
done      
#awk 'NR==1,NR==4' 1.txt           行号在1到5之间的行
#awk 'NR < 5' 1.txt        行号小于5的行
#awk '/linux/' 1.txt     包含样式linux的行
#awk '! /linux/' 1.txt   不包含包含样式linux的行

#awk -F: '($2 == "") { print   $1 }' /etc/shadow 列出空密码帐号

#以root身份执行:
 awk -F: '($3 == 0) { print $1 }'   /etc/passwd  检查UID为0的帐号
#

通过脚本判断远程Web服务器状态码是否正常

#!/bin/bash
curl -I -s xxx.xxx.xxx.xxx 

case条件语句的用法:

case "变量" in)
		指令
		;;
	值)
		指令
		;;
	*)
		指令
esac

运维

现在给你三百台服务器,你怎么对他们进行管理?
管理3百台服务器的方式:
使用跳板机,使用统一账号登陆,便于管理
使用salt,ansible等配置管理工具进行统一调度和管理
建立简单的服务器的系统、配置、应用的cmdb信息管理

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." ‘{print $1"."$2"."$3"."$4}’| sort | uniq -c | sort -nr |head -20
设置开机自启动
systemctl enable httpd
如何排查服务器故障的处理步骤如下:
在这里插入图片描述
网卡配置文件目录:
/etc/sysconfig/network-scripts

保留7天日志
find ~ -type f -mtime +7 -name “*.log” | xargs rm -f
-mtime 0 即距离当前时间不到1天(24小时)以内的文件。
-mtime 1 即距离当前时间1天(24小时-48小时)的文件。
-mtime+1 即距离当前时间2天(48小时)之外的文件
-mtime -1 即距离当前时间1天(24小时)之内的文件

在这里插入图片描述
如何查看http的并发请求数与其TCP连接状态?
netstat -n | awk ‘/^tcp/ {++b[$NF]} END {for(a in b) print a,"\t",b[a]}’
修改内核参数
vi /etc/sysctl.conf 这里修改参数
sysctl -p 刷新后可用

网络

当在url发生了什么?
DNS地址解析,查看本地缓存能不能找到对应IP地址,不能在有附近的地址解析服务器进行解析,如果依旧没有找到则会查询
然后向目的IP发送HTTP请求,
传输层三次握手四次挥手建立TCP连接,发送TCP报文
网络层IP协议查询mac地址
到达数据链路层,数据链路层封装数据帧
物理层传播比特流
然后返回请求文件
渲染页面
一个TCP连接可以发起多少个HTTP请求
HTTP协议1.1之后是长连接,理论上可以发起无数个HTTP请求,

进程和线程的概念
进程是CPU资源分配的最小单位
线程是CPU调度的最小单位 一个进程包含一个或多个线程,线程之间资源是共享的,进程之间资源是独立的
为什么要进行三次握手
三次才能建立可靠的连接,如果如果只进行两次握手,则会导致资源浪费或者死锁,当客户端发送的信息发生延迟,在服务端和客户端数据传输完毕断开连接之后到达服务端,服务端认为客户端发起了一个新的tcp连接请求,假设两次握手成立,那么此时服务端只要发送了确认,连接就建立了,而此时连接已经断开,客户端不会理睬服务端,那么这样就造成了资源的浪费
为什么要进行四次挥手
全双工通信。

ansible

ansible ‘*’ -m command -a ‘uptime’

‘*’:自己定义的主机 -m command:命令

指定节点上的权限,属主和数组为root

ansible ‘’ -m file -a “dest=/tmp/t.sh mode=755 owner=root group=root”
#指定节点上定义一个计划任务,每隔3分钟到主控端更新一次时间
ansible '
’ -m cron -a ‘name=“custom job” minute=/3 hour= day=* month=* weekday=* job="/usr/sbin/ntpdate 172.16.254.139"’

指定节点上创建一个组名为aaa,gid为2017的组

ansible all -m group -a ‘gid=2017 name=a’

在节点上创建一个用户aaa,组为aaa

ansible all -m user -a ‘name=aaa groups=aaa state=present’
删除用户示例
ansible all -m user -a ‘name=aaa groups=aaa remove=yes’

在节点上安装httpd

ansible all -m yum -a “state=present name=httpd”

在节点上启动服务,并开机自启动

ansible all -m service -a ‘name=httpd state=started enabled=yes’

检查主机连接

ansible ‘*’ -m ping

执行远程命令

ansible ‘*’ -m command -a ‘uptime’

执行主控端脚本

ansible ‘*’ -m script -a ‘/root/test.sh’

执行远程主机的脚本

ansible ‘*’ -m shell -a ‘ps aux|grep zabbix’

类似shell

ansible ‘*’ -m raw -a “ps aux|grep zabbix|awk ‘{print $2}’”

创建软链接

ansible ‘*’ -m file -a “src=/etc/resolv.conf dest=/tmp/resolv.conf state=link”

删除软链接

ansible ‘*’ -m file -a “path=/tmp/resolv.conf state=absent”

复制文件到远程服务器

ansible ‘*’ -m copy -a “src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=root mode=0644”

在节点上运行hostname

nsible all -m raw -a ‘hostname|tee’

将指定url上的文件下载到/tmp下

ansible all -m get_url -a ‘url=http://10.1.1.116/favicon.ico dest=/tmp’

ansible 只用play_book部署:总的yml,包括其他主节点的,从节点的
inventory 默认在/etc/ansible/inventory
或者 ansible_playbook -i stage
主节点包括一些角色,common角色(比如关闭防火墙,关闭安全模块),
-name
yum:
name:
state:

docker角色,kubelet角色
用ansible部署k8s集群:
最上面目录application.yml 部署应用的
k8s.yml 部署k8s集群的
master.yml 部署主节点的
node.yml 部署从节点的
k8s.yml
import master.yml
import node.yml
import application.yml

master.yml
安装docker的roles

  • hosts: master
    roles:
    • common
    • docker
    • kubelet
    • master
      移到gitlab命令

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值