关于docker:dockerk8s-面试总结

7次阅读

共计 4988 个字符,预计需要花费 13 分钟才能阅读完成。

1. Docker 是什么?

Docker 是基于 容器技术 实现的,容器技术最开始是基于 Linux Container(简称 LXC)技术实现的,通过内核提供的 NamespaceCgroup 机制,实现了对应用程序的 隔离 以及物理资源的 调配

Docker 在容器根底上倒退出了一个欠缺的生态系统,它将容器视为一种打包格局,将应用程序所需的所有,比方依赖库、运行时环境等都汇合在了在一起,使得 一次构建,到处运行

它将 开发与运维 很好的交融在一起。开发人员能够很轻松的 构建、打包、推送和运行 应用程序。而且还容许咱们将容器视为部署单元,以 模块化 的形式公布,升高了零碎的运维治理难度。

2. Docker 基本概念

镜像

镜像就像是蕴含了操作系统的一张光碟,它是一个 模板文件,除了提供容器运行时所需的程序、库、资源、配置等文件外,还蕴含了一些为运行时筹备的一些配置参数(如匿名卷、环境变量、用户等)。

另外,镜像是一个 分层 的文件系统,通过一层层的组合,使得咱们能够复用这些不同粒度的镜像文件。

容器

容器是镜像的运行实例,咱们能够把镜像看成是一个个的构建块,容器依据这些构建块搭建起了一个隔离的,领有整个包的应用程序。每一个容器都是一个 标准化 单元,确保了在不同机子上也能领有统一的行为。

数据卷

Docker 对数据长久化的解决方案,数据不会随着容器完结而失落,通过将宿主机的某一文件目录挂载到容器里来实现。在 Docker 里提供了三种办法来实现目录的挂载:

  • volumes: 属于 Docker 治理的目录,无需本人创立目录。
  • bind mounts:本人指定的某个目录,需注意不同操作系统的文件门路格局。
  • tmpfs:仅存储在主机零碎的 内存 中,不会长久保留在磁盘上。容器能够应用它来共享简略状态或非敏感的信息。

网络

bridge 模式

Docker 在主机上会创立一个 docker0 的网桥,每当有容器要创立时,便会为容器调配一个独立的网卡,而后桥接到虚构网桥上。这其实是一对虚构网卡,一端放在容器里,另一端放在 docker0 网桥里。当一端有数据达到时,就会把数据包转发到另一端上,这就实现了网络通信。

host 模式

在建一个容器时,个别会为容器调配一个独立的 Network Namespace 以进行网络隔离。如果咱们应用了 Host 模式,则不再调配 Network Namespace,而是和 宿主机 共用一个 Network Namespace。此时容器将不再领有本人的虚构网卡、IP 和端口,而是和宿主机 共用 一个 IP 和端口。

none 模式

应用 none 模式的容器领有属于本人的 Network Namespace,但不做任何网络配置。它和宿主机以及其余容器是不互通的。如果须要和内部通信,则须要自定义网络驱动程序,本人增加网卡、配置 IP 等。

3. Docker 的底层技术是什么?

Docker 在 Linux 的底层技术有:Namespaces(资源隔离)CGroups (资源限度)UnionFS (联结文件系统)。其中:

  • Namespaces(资源隔离):将零碎的全局资源通过形象划分,使得在同一 namespace 中的过程看起来领有本人的全局资源。次要有 Mount namespaces(文件系统挂载)、Network namespaces(网络)、User namespaces(用户)等的资源隔离。
  • CGroups(资源限度):对系统资源的限度,比方 CPU、内存等。
  • UnionFS (联结文件系统):一次同时加载多个文件系统,但从里面看起来,只能看到一个文件系统,联结加载会把各层文件系统叠加起来,这样最终的文件系统会蕴含所有底层的文件和目录。便于镜像的分层继承。

4. Docker 和虚拟机的区别?

容器技术和虚拟机都提供了 环境隔离 的性能。不同的是。容器是运行在操作系统上的一个过程,它和其余应用程序是共享内核的,由 操作系统 提供虚拟化隔离性能;而虚拟机则是完完全全 起了个操作系统,将环境隔离的更加彻底。

5. Docker 常用命令有哪些?

容器生命周期治理: run、start/stop/restart、kill、rm、pause/unpause

容器操作:ps、inspect、top

镜像仓库:login、pull、push、search

本地镜像治理:images、rmi、tag、build、history

例如,当咱们须要运行一个容器时,则能够执行:

docker run  nginx:test

6. k8s 是什么,特点?

k8s 是一个容器治理平台,负责容器的编排、治理、调度,反对故障转移 / 重启、主动扩缩容、服务发现 / 负载平衡、配置管理等性能,使得应用服务能从打包到部署再到监控能有一条残缺的自动化流程。

7. k8s 相干概念

Container

即容器,通过镜像蕴含软件的运行环境,加上 namespace 的隔离性能,使得容器能够很不便的在任何中央运行。

Pod

k8s 应用 Pod 来治理容器,一个 Pod 能够蕴含一个或多个容器。它是一组严密关联的容器汇合,共享 PID、IPC、Network 和 UTS namespace,是 Kubernetes 调度的根本单位。

Pod 内的多个容器共享网络和文件系统,能够通过过程间通信和文件共享这种简略高效的形式组合实现服务。

Node

Node 是 Pod 真正运行的主机,能够是物理机,也能够是虚拟机。为了治理 Pod,每个 Node 节点上至多要运行 container runtime(比方 docker 或者 rkt)、kubelet 和 kube-proxy 服务。

Namespace

Namespace 是对一组资源和对象的形象汇合,比方能够用来将零碎外部的对象划分为不同的项目组或用户组。常见的 pods, services, replication controllers 和 deployments 等都是属于某一个 namespace 的(默认是 default),而 node, persistentVolumes 等则不属于任何 namespace。

Service

Service 是应用服务的形象,通过 labels 为利用提供负载平衡和服务发现。匹配 labels 的 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载平衡到这些 endpoints 上。

每个 Service 都会主动调配一个 cluster IP(仅在集群外部可拜访的虚拟地址)和 DNS 名,其余容器能够通过该地址或 DNS 来拜访服务,而不须要理解后端容器的运行。

Label

Label 是辨认 Kubernetes 对象的标签,以 key/value 的形式附加到对象上。Label 不提供唯一性,并且实际上常常是很多对象(如 Pods)都应用雷同的 label 来标记具体的利用。

8. k8s 架构图及交互流程

k8s 次要有 Master 节点和工作节点组成。主节点次要对集群做出全局决策(比方调度),以及检测和响应集群事件(例如资源有余,主动扩缩容);从节点负责保护运行的 Pod 并进行通信的网络代理。

Mater 节点次要有以下组件:

  • kube-apiserver:负责对外裸露 Kubernetes API。
  • etcd:作为保留 Kubernetes 所有集群数据的后盾数据库。
  • kube-scheduler:在适当的时候进行调度决策,让 Pod 在适合的节点上创立运行。
  • kube-controller-manager:负责监控调整调整集群的状态,比方故障检测、主动扩大、滚动更新等

Node 节点有以下组件:

  • kubelet:次要负责执行、监控由调度器调配的 Pod,相当于是 Master 在每个 Node 节点上的代理。保障 Pod 的运行状态与指标状态统一。
  • kube-proxy:k8s 在每个节点上的网络代理,负责为 Service 提供集群外部的服务发现和负载平衡。

9. k8s 的健康检查机制是什么?

k8s 次要通过提供上面两种探针 (probe) 来进行 Pod 的衰弱检测:

  • livenessProbe(存活探针):用来确定什么时候要重启容器,例如通过一个 HTTP GET 申请来判断容器是否衰弱存活。
  • readinessProbe(就绪探针):有时候,应用程序会暂时性的不能提供通信服务。(例如启动加载大文件)。在这种状况下,既不想杀死应用程序,也不想给它发送申请。Kubernetes 提供了就绪探测器来发现并缓解这些状况,设置后,流量将不会打到 Service 上。

10. 镜像的下载策略有哪些?

次要分为三种:

  • Always:总是从指定的仓库中获取镜像。
  • Never:应用本地镜像,不从仓库中下载。
  • IfNotPresent:当本地镜像不存在时,才从仓库拉取。

当镜像标签是 latest 时,默认下载策略是 Always。当镜像标签是自定义时,应用 IfNotPresent。

11. Pod 的状态有哪些?

  • Pending:pod 正在期待 kube-scheduler 抉择适合的节点创立。
  • Running:pod 已失常创立,并且至多有一个容器正在运行。
  • Succeeded:所有容器已胜利启动运行。
  • Failed:pod 的容器非正常退出。
  • Unknown:无奈获取 pod 状态,可能节点间通信呈现问题。

12. k8s 创立一个 pod 流程

1)客户端提交 Pod 的配置信息(能够是 yaml 文件定义好的信息)到 kube-apiserver;
2)Apiserver 收到指令后,告诉给 controller-manager 创立一个资源对象;
3)Controller-manager 通过 api-server 将 pod 的配置信息存储到 ETCD 数据中心中;
4)Kube-scheduler 检测到 pod 信息会开始调度预选,会先过滤掉不合乎 Pod 资源配置要求的节点,而后开始调度调优,次要是挑选出更适宜运行 pod 的节点,而后将 pod 的资源配置单发送到 node 节点上的 kubelet 组件上。
5)Kubelet 依据 scheduler 发来的资源配置单运行 pod,运行胜利后,将 pod 的运行信息返回给 scheduler,scheduler 将返回的 pod 运行状况的信息存储到 etcd 数据中心。

13. 删除 pod 流程

Kube-apiserver 会承受到用户的删除指令,默认有 30 秒工夫期待优雅退出,超过 30 秒会被标记为死亡状态,此时 Pod 的状态 Terminating,kubelet 看到 pod 标记为 Terminating 就开始了敞开 Pod 的工作;

14. service 是什么?

Pod 每次重启或者重新部署,其 IP 地址都会产生变动,这使得 pod 间通信和 pod 与内部通信变得艰难,这时候,就须要 Service 为 pod 提供一个固定的入口。

Service 的 Endpoint 列表通常绑定了一组雷同配置的 pod,通过负载平衡的形式把外界申请调配到多个 pod 上

15. 怎么服务注册?

Pod 启动后会加载以后环境所有 Service 信息,以便不同 Pod 依据 Service 名进行通信。

16. 长久化形式

1)EmptyDir(空目录):没有指定要挂载宿主机上的某个目录,间接由 Pod 内保部映射到宿主机上。相似于 docker 中的 manager volume。

2)Hostpath:将宿主机上已存在的目录或文件挂载到容器外部。相似于 docker 中的 bind mount 挂载形式。

3)PersistentVolume(简称 PV):
基于 NFS 服务的 PV,也能够基于 GFS 的 PV。它的作用是对立数据长久化目录,方便管理。

17. 常用命令

  • kubectl create:创立资源(kubectl create -f docker-registry.yaml)
  • kubectl run:疾速创立容器(kubectl run nginx –image=nginx)
  • kubectl get:获取资源列表(kubectl get pods)
  • kubectl describe:查看资源详细信息(kubectl describe pods/nginx)
  • kubectl exec:在容器内执行命令(kubectl exec podName -c containerName -i -t — bash -il)
  • kubectl logs:查看 pod 日志(kubectl logs nginx)
  • kubectl delete:删除一个资源(kubectl delete pods –all)

感兴趣的敌人能够搜一搜公众号「阅新技术」,关注更多的推送文章。
能够的话,就顺便点个赞、留个言、分享下,感激各位反对!
阅新技术,浏览更多的新常识。

正文完
 0