Docker&k8s常见面试题

Docker

dockerfire指令:FROM,作者信息,RUN,WORKDIR,CMD,ENTRYPOINT, USER,ENV,ADD,COPY
add和copy区别
是否支持从远端URL获取资源
copy是在docker built所在主机读取资源到镜像中
add是支持通过URL从远端读取资源到镜像中并自动解压(最好wget或者curl因为会怎么创建更多镜像层使镜像更大)
cmd 和 entrypoint区别
都可以指定容器启动时要执行的命令
cmd可以被docker run 命令参数覆盖掉 在一起使用cmd会失效掉
cmd和entrypoint在一起 cmd参数会被附加到entrypoint后面
如果docker run 命令带了参数 ,会覆盖掉cmd命令参数 然后附加到entrypoint指令后
Docerkfile创建镜像 build -t 名字:标签

Docker有以下4种网络模式:
Host模式,使用宿主机的ip和端口
Container模式,和指定容器共享网络
None模式,关闭容器网络功能
Bridge模式,会分配ip将容器连接到一个docker0虚拟网桥通过iptables nat和宿主进行通讯
组成 :镜像容器仓库

Docker run 后参数
-e向容器内传递环境变量 启动容器用户可动态传参
–name 指定名称
-v 挂载
-p 映射端口
-d后台运行
-i 以交互模式运行容器
-t 为容器分配一个伪终端

常用命令
版本:version
详细信息:info
搜索镜像:search
获取pull
查看镜像详细信息:images 名字 读取镜像:load -i
标签:tag 原来镜像 新名字:标签
镜像载入:load < 本地名字 容器导出:export id > 导出文件
镜像存出: sare -o 本地名字 镜像 容器导入:cat 文件 | dake import -名字
查看容器信息 ps -a
创建容器 creare -it -p 创建启动 run -d
启动 start 关闭 stop 删除容器rm 镜像 rmi 进入 exec -it 复制cp 文件 id:位置

docker-compose是管理容器的 基于docker的编排工具 批量操作
up 启动所有服务
up -d 在后台所有启动服务
ps 列出目前所有容器
stop 停止
logs查看服务器输出
build重新构建项目中的服务容器
pull 拉取镜像

docker隔离机制
通过Linux Namespace 创建隔离,决定进程能够看到和使用哪些东西。
通过control groups 技术来约束进程对资源的使用
Namespase几种隔离
主机名和域名 UTS 系统调用参数:CLONE_NEWUTS
信号量,消息队列,共享内存 IPC
进程号 PID
文件系统(挂载点) Mount
网络设备,网络栈,端口 Network
用户和用户组 User
Cgroup
cgroups是linux内核中的机制,对组设置权限,对进程进行控制。用户会继承它所在组的权限。这种机制可以根据特定的行为把一系列的任务,子任务整合或者分离,按照资源划分的等级的不同,从而实现资源统一控制的框架,cgroup可以控制、限制、隔离进程所需要的物理资源,包括cpu、内存、IO,为容器虚拟化提供了最基本的保证,是构建docker一系列虚拟化的管理工具
解决问题:资源控制,优先级分配:资源统计:进程控制:

Kubernettes

组件
master组件
Api Server:,作为资源操作的唯一入口,客户端与k8s群集及K8s内部组件的通信,都要通过Api Server这个组件;
Controller-manager:运行控制器,负责维护群集的状态,比如故障检测、自动扩展、滚动更新等;
Scheduler:负责资源的调度,按照预定的调度策略将pod调度到相应的node节点上;
Etcd:担任数据中心的角色,保存了整个群集的状态;
node的组件
kubelet:负责维护容器的生命周期,同时也负责 Volume 和网络的管理
kube-proxy:负责为 Service 提供 cluster 内部的服务发现和负载均衡
其他组件
Container runtime:负责镜像管理和pod真正运行
Metrics-server:群集核心监控的聚合器
Kubeadm:群集的部署和升级工具
Kunectl:管理工具 k8s客户端

优点
K8s是一个容器编排工具 1.24版本后使用的containerd(docker的一个重要组件吧)
有自我修复,弹性伸缩,自动部署和回滚,服务发现和负载均衡,机密数据管理,允许指定内存,

存储用的PV/PVC 通过secret存储敏感数据

Pod创建流程
1,客户端提交Pod的配置信息到apiserver;
2,Apiserver收到指令后,通知给controller-manager创建一个资源对象;
3,Controller-manager通过api-server将pod的配置信息存储到ETCD数据中心中;
4,scheduler检测到pod信息会开始调度预选,挑选出更适合运行pod的节点,然后将pod的资源配置单发送到node节点上的kubelet组件上。
5 Kubelet根据scheduler发来的资源配置单运行pod,运行成功后,将pod的运行信息返回给scheduler,scheduler将返回的pod运行状况的信息存储到etcd数据中心。

K8S-Service类型
ClusterIp:默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP
NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,这样可以通过NodeIP:NodePort来访问服务
LoadBalancer:在NodePort基础上,借助cloud provider创建一个外部负载均衡器,并将请求转发到NodeIP:NodePort(得是公网ip)
ExternalName: 把集群外部的服务引入到集群内部来,在集群内部直接使用,没有任何类型代理被创建,这只有kubernetes1.7 或更高版本的kube-dns才支持

五种控制器
Deployment( Nginx, 微服务,jar)无状态应用
SatefulSet (Mysql主从,etcd集群,kafka,zk) 有状态应用
deployment下的pod一样,不考虑顺序和在哪个node 可随意扩缩容
实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper
实例之间不对等的关系,以及依靠外部存储的应用。
DaemonSet:一次部署,每个node都会运行一个pod(适用于婆罗米修斯节点,logstach)
分为普通任务(Job)和定时任务(CronJob) 一次性执行

暴露服务ingress
创建一个pod和一个svc,ingress写入域名并指向这个svc
生命周期
创建 初始化 运行
终止 挂起pending 运行runing 成功 succeed 失败failed 未知 unknown

网络插件
Flannel 基于隧道
Calico 基于路由
包括:felix(路由配置和规则下发)etcd(存储保证网络数据的一致性)bird(把当前Felix写入kubnel信息下发到当前calico网络,确保workload通信有效性),bird大规模
calico优点
是个虚拟网络解决方案,它完全利用路由规则实现动态组网,通过BGP协议通告路由。
endpoints组成的网络是单纯的三层网络,报文的流向完全通过路由规则控制,没有overlay等额外开销; 数据存储到Etcd
calico的endpoint可以漂移,并且实现了acl。
calico的缺点
路由的数目与容器数目相同,非常容易超过路由器、三层交换、甚至node的处理能力,从而限制了整个网络的扩张;

工作模式:
Ipip:用在跨网段通信的时候,BGP不行,
Bgp
性能的几个检测方式:
Ping: hosts和pod之间的延迟
带宽测试:用iperf测试hosts和pods间带宽
HTTP性能测试:http之间

探针和检测方法
livenessProbe:(存活探针)如果侦测到容器不健康,则会根据重启策略来决定是否重启,如果不包含该策略则默认检测永远成功
readinessProbe:(就绪探针)如果检测失败,控制器会将此pod从service的endpoint表中移除,不再将任何请求调度到此pod,直到下一次检测成功
startupProbe:(启动探针)启动检测机制,应用于一些启动缓慢的业务,防止长时间启动而被前两类探针kill掉
exec:通过执行命令的方式检测服务是否正常,如检测某个重要的配置文件
httpget:通过发送http或者https请求来检测服务是否正常,200-399之间为正常
tcpsocket:通过建立tcp连接来检查是否健康

Pod调度策略
nodename指定特定的node
nodeselector给node打标签
taint&tolerances污点和容忍,

污点和容忍设置
noschedule:一定不被调度到node上
prefernoschedule:尽量不被调度node上
noexecute:不被调度切驱逐原有的pod
设置污点:kubectl tgint nodes node1 key1=value1:NoSchedule
查看污点:kubectl describe pod pod-name
去除污点:kubectl tgint nodes node1 key1:NoSchedule-
如果需要调度到相应的pod需要设置容忍度
-tolerations:
-key:“key”
operator:“Equal”
value:“value”
effect:“NoExecte”
Tolerationseconds:3600
容忍设置operator:”Exists” 表示忽略污点(容忍任意的taint)(默认Equal)
设置effect:”NoExecute”时 可以设置tolerationseconds(表示运行秒数如果在之前被污点删除了,则pod不会被调度)

常用命令
查看pod详细信息 如在哪个node
Kubectl get pod -o wide
查看pod运行信息
Kubectl describe pod
查看日志
Kubectl logs pod xxx
本地拷贝到容器 cp
进入容器exec -it
查看信息get
创建资源create -f apply -f
删除资源delete
打标签label nodes nodename salve=153
kubectl set image (更新指定版本)
kubectl rollout history (undo) (回退到指定版本)

pending状态排查
kubectl get pod -o wide 查看分配到哪个node
用kubectl descirbe pod 详细信息 或者logs查看日志
最有可能就是没有资源分配了 或者就配置的资源在node上运行不起来(查看节点资源使用情况内存 cpu 负载 磁盘)
如果没有就是本身有问题了 被调度的节点是否配置污点 可以删除污点或者添加容忍

镜像拉取策略
ifnotpresent:本地有不拉取
always:每次都拉取镜像
never:不拉取只使用本地镜像

pod重启策略
Always:默认策略. 当容器终止退出后, 总是重启容器.
OnFailure:当容器异常退出(退出状态码非0)时, 才重启容器. 适于job
Never:当容器终止退出, 从不重启容器. 适于job
pod容器
基础容器:维护整个pod网络空间
初始化容器:先于业务容器开始执行
业务容器:提供服务

Yaml怎么写
例:
在这里插入图片描述
或者就是基本上按照原来模板写
不会的按照kubectl explain 参数
按照这个去写

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值