十一,docker&k8s问答合集

十一.docker&k8s

11.1 docker的核心原理

11.2docker的⽹络模式有哪些,默认是⽹络模式是什么

Docker网络模式 配置 说明
host模式 –net=host 容器和宿主机共享Network namespace。容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好
container模式 –net=container:NAME_or_ID 容器和另外一个容器共享Network namespacekubernetes中pod就是多个容器共享一个Network namespace。文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信(127.0.0.1)
none模式 –net=none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。没有办法联网,封闭的网络能保证容器的安全性。
bridge模式 –net=bridge (默认为该模式)

11.3 dockerfile怎样部署⼀个项⽬

1.编写Dockerfile

[root@docker-server nginx]# vim Dockerfile 

FROM centos:7

MAINTAINER hugo 2763743788@qq.com

RUN yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop

ADD nginx-1.20.1.tar.gz /usr/local/src/

RUN cd /usr/local/src/nginx-1.20.1 \
&& ./configure --prefix=/usr/local/nginx --with-http_sub_module \
&& make \
&& make install \
&& cd /usr/local/nginx 
&& rm -rf /usr/local/src/nginx-1.20.1* # 清理源代码和压缩包以节省空间  

# ADD nginx.conf /usr/local/nginx/conf/nginx.conf

RUN useradd -s /sbin/nologin nginx \
&& ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx \
&& echo 'test nginx !' > /usr/local/nginx/html/index.html

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

注意:ADD特性:自动解压tar文件支持从URL下载文件

2.构建Docker镜像

[root@docker-server nginx]# docker build -t nginx:v1 .
[root@docker-server nginx]# docker images | grep v1
nginx          v1        fbd06c1753c0   8 seconds ago   581MB

3.运行Docker容器

[root@docker-server nginx]# docker run -d -it -p 80:80 nginx:v1

4.(可选)使用Docker Compose

11.5 dockerfiledocker-compose区别

  • Dockerfile:主要用于定义单个容器镜像的创建过程,确保镜像的一致性和可重复性。
  • Docker-Compose:主要用于定义和协调多个容器服务的部署和服务之间的依赖,简化多容器应用的管理和部署流程。

两者结合使用,可以实现从单个服务的构建到整个多服务应用部署的全链条自动化,是现代容器化应用开发和部署中不可或缺的工具。

11.6 Dockerfile中的cmd和run的区别

RUN指令在构建镜像的过程中执行。每当Dockerfile被用来构建镜像时,RUN指令指定的命令都会在构建环境中执行,主要用于安装软件包、下载文件、编译应用等,以便为镜像创建所需的文件系统更改。每次RUN执行后,都会创建一个新的镜像层。因此,如果可能的话,最好将多个命令合并为一个RUN指令,以减少镜像的层数和大小。

CMD指令在容器启动时执行。当使用docker run命令运行一个容器时,如果docker run后面没有跟任何额外的命令,那么CMD中指定的命令就会在容器的主进程中执行,主要目的是为容器提供默认的执行命令。它告诉容器在启动时应该运行什么程序。

11.7 docker与虚拟机有何不同

Docker:

  • 基于操作系统级别的虚拟化,使用容器来运行应用程序。

  • 共享系统的内核,容器之间相互隔离。

  • 容器运行在宿主机的操作系统之上,不需要启动独立的操作系统实例。

  • 启动速度快,资源开销小

  • 更适合需要快速部署和高效资源利用的场景。

  • 使用卷(Volumes)和绑定挂载(Bind Mounts)来管理存储,灵活但需要额外配置。

  • 网络配置相对简单,默认情况下容器共享宿主机的网络堆栈,但也可以配置独立的网络模式

虚拟机:

  • 基于硬件级别的虚拟化,使用 Hypervisor(如 VMware、Hyper-V、KVM 等)来管理虚拟机。

  • 每个虚拟机运行一个完整的操作系统,与宿主机操作系统完全独立。

  • 启动速度慢,资源开销大,因为有额外的虚拟化层(Hypervisor)

  • 适用于运行不同操作系统的场景、多租户环境、需要高度隔离的应用、传统的企业应用部署等。
    更适合需要完整操作系统环境的场景。

  • 有独立的虚拟硬盘,存储管理较为简单但不够灵活。

  • 网络配置较为复杂,可以通过虚拟网络接口、虚拟交换机等实现复杂的网络拓扑。

11.8 docker容器的几种状态

created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)

img

11.9 docker的三大组件之间的关系

仓库是存储镜像的地方,镜像是创建容器的模板,而容器则是镜像运行时的实例

11.10 Docker file中的命令COPY和ADD命令有什么区别

  • COPY:仅支持基本的文件复制操作,它将指定的文件或目录从构建上下文复制到镜像中指定的路径。它不会执行任何额外的处理,如不会解压缩或远程下载。
  • ADD:除了具有COPY的所有功能外,ADD还更为强大和灵活。它可以自动解压缩压缩文件(如.tar、.zip等),或者在构建过程中从URL下载文件并添加到镜像中

在大多数情况下,如果只需要复制文件而不涉及解压缩或下载,推荐使用COPY指令,因为它更简单且构建缓存效率更高。

如果需要在构建过程中解压缩文件或从远程URL添加文件,那么ADD指令是更合适的选择。然而,考虑到安全性和可维护性,建议尽可能避免使用ADD从远程URL下载文件,而是使用COPYRUN(或其他命令)的组合来实现相同的功能。

11.11 Docker的优缺点

Docker的优点

  1. 轻量级

  2. 可移植性

  3. 快速启动和关闭

  4. 提高开发效率

  5. 简化部署和管理

  6. 资源利用率高

    • 可以在同一台主机上运行多个容
  7. 良好的隔离性

  8. 可扩展性强

    • Docker容器可以很容易地进行水平扩展,可以根据需求快速添加或删除容器,以适应不同的负载情况。
  9. 环境一致性

    • Docker容器可以确保开发、测试和生产环境的一致性,从而减少由于环境差异引起的问题。
  10. 支持微服务架构

    • Docker容器提供了一种简单的方式来构建和部署微服务,通过将各个服务拆分为独立的容器,可以实现更好的可伸缩性和可维护性

Docker的缺点

  1. 资源消耗

    • Docker镜像的体积较大,可能会占用较多的磁盘空间。此外,每个镜像的运行都需要一个额外的Docker运行时环境,会占用一定的内存和CPU资源。如果服务器资源有限,可能会导致性能压力。
  2. 镜像构建和网络传输较慢

    • Docker镜像构建是从一个基础镜像开始,逐步构建所需的环境和依赖
  3. 难以维护和管理

    • 当应用的规模逐渐增大,涉及到多个镜像的组合和协作时,Docker容器的维护和管理可能变得复杂。需要考虑容器之间的依赖关系、服务发现和负载均衡等问题。
  4. 安全性问题

    • 它们与宿主机共享相同的内核。如果容器配置不当或存在漏洞,可能会对整个宿主机造成影响。

11.12 Docker容器意外退出,如何盘查和处理

查看容器退出状态

docker ps -a --filter "exited = 0"

查看容器日志

docker logs [container_name(或容器ID)]

查看容器健康检查

docker inspect --format='{{json .State.Health}}' [container_name]

查看宿主机系统日志

linux:/var/log/messages或/var/log/syslog

windows:Event Viewer

进入容器进行排查

docker exec -it [container_name] /bin/bash

使用Docker自带工具进行故障定位

docker top [container_name]
docker stats [container_name]
docker inspect [container_name]

11.13 有没有使用过docker搭建过什么服务,怎么搭建的

搭过

​ 首先,我会为我的应用编写一个Dockerfile。Dockerfile是一个文本文件,包含了从基础镜像开始到运行应用所需的所有命令

​ 使用Dockerfile,我可以通过运行docker build命令来构建我的Docker镜像。

​ 构建完镜像后,我可以使用docker run命令来运行一个容器实例

​ 随着应用的运行,我可能会需要管理我的容器,比如查看正在运行的容器、停止或删除容器等。此外,如果我的应用需要扩展,我可以使用Docker Compose或Kubernetes等工具来编排和管理多个容器

11.14 控制平面和工作平面区别,分别包含哪些组件

控制平面(Control Plane) 工作平面(Data Plane)
定义与功能 Kubernetes的大脑,负责集群的整体管理和协调,提供API服务,运行控制器和调度器。 包含所有容器和应用程序的节点,通过与控制平面交互实现部署、扩展和管理。
关键组件 API Server, etcd, kube-controller-manager, kube-scheduler Node, kubelet, kube-proxy, 容器运行时
职责 决策和全局控制,维护集群状态和数据一致性。 运行容器化应用程序,响应控制平面的指令,管理节点上的资源和网络。

11.15 各个组件的原理详解

img

(标注:根据集群大小,主组件在机器上托管或分布)

kube-apiserver

​ kube-apiserver 是 Kubernetes 的核心组件之一,作为所有 REST 操作的前端。它处理所有的 API 请求并更新 etcd 存储的数据。通过 kube-apiserver,用户可以与 Kubernetes 集群进行交互,包括部署应用程序、查询集群状态和管理资源等。API 服务器的设计支持水平扩展,即可以通过部署多个实例来提高性能和容错能力。

etcd

​ etcd 是一个高可用的键值存储,用于保存 Kubernetes 的所有集群数据。它是 Kubernetes 的后台数据库,存储了集群的状态信息、配置数据和元数据。etcd 提供了一致性和高可用性,确保集群数据的持久性和可靠性。由于 etcd 存储了关键的数据,因此备份等数据保护措施非常重要。

kube-scheduler

​ kube-scheduler 负责为新创建的 Pods 选择合适的节点进行运行。它根据资源需求、调度策略和集群状态等因素,决定 Pods 的分配。调度器会考虑节点的资源使用情况、Pod 的亲和性和反亲和性、数据位置等条件,以优化资源的使用和满足应用的要求。

kube-controller-manager

​ kube-controller-manager 运行控制器进程,负责管理集群的状态。每个控制器都负责特定的任务,如节点状态监控、Pod 的创建和管理、服务的维护等。虽然每个控制器在逻辑上是独立的,但它们被编译到一个单独的可执行文件中,以简化管理和维护。主要控制器包括:

节点控制器(Node Controller):负责处理节点故障的通知和响应。
任务控制器(Job Controller):管理一次性任务的执行,确保 Job 对象下的 Pods 被正确创建和运行。
端点分片控制器(EndpointSlice Controller):管理 Service 和 Pod 之间的链接。
服务账号控制器(ServiceAccount Controller):为新的命名空间创建默认服务账号。

cloud-controller-manager

​ 负责与云提供商的 API 进行交互。它将集群的管理与云平台的特定操作分离开来,允许 Kubernetes 集群与云环境集成。主要控制器包括:

节点控制器(Node Controller):用于检测和处理云环境中节点的终止和删除。
路由控制器(Route Controller):配置云基础设施中的路由。
服务控制器(Service Controller):管理云提供商的负载均衡器的创建、更新和删除。
节点组件(Node Components)
节点组件运行在每个集群节点上,负责容器的实际执行和管理。

kubelet

​ kubelet 是每个节点上的核心组件,负责确保容器在 Pod 中运行并保持健康。它从 API 服务器获取 PodSpec,并确保容器按照这些规格运行。kubelet 监控容器的状态,并向 API 服务器报告节点的状态。kubelet 不管理非 Kubernetes 创建的容器。

kube-proxy

​ kube-proxy 是集群中的网络代理,负责实现 Kubernetes 服务的网络功能。它维护节点上的网络规则,支持服务的负载均衡和网络转发。kube-proxy 可以利用操作系统的数据包过滤层,也可以通过流量转发实现网络规则,确保 Pod 之间的网络通信顺畅。

容器运行时(Container Runtime)

​ 容器运行时 是 Kubernetes 运行容器的基础组件,管理容器的执行和生命周期。支持的容器运行时包括 containerd、CRI-O 和 Kubernetes CRI 的其他实现。容器运行时负责启动和停止容器,并处理容器的资源管理和监控。

插件(Addons)

​ 插件是扩展 Kubernetes 集群功能的组件,通常运行在 kube-system 命名空间中。它们提供额外的功能和服务,使集群更加全面和灵活。

DNS

​ 集群 DNS 是几乎所有 Kubernetes 集群都需要的插件。它为 Kubernetes 服务提供 DNS 记录,使得服务可以通过 DNS 名称进行访问。容器启动时会自动将集群 DNS 服务器包含在其 DNS 搜索列表中,简化了服务的发现和访问。

Web 界面(仪表盘)

​ Kubernetes Dashboard 是一个基于 Web 的用户界面,允许用户管理集群和应用程序,并进行故障排除。Dashboard 提供了集群状态的可视化展示,简化了集群的管理操作。

容器资源监控

​ 容器资源监控 插件将容器的时间序列度量值保存到集中数据库中,并提供数据浏览界面。它帮助用户监控容器的性能和资源使用情况,便于进行优化和故障排查。

集群层面日志

​ 集群层面日志 插件负责将容器的日志数据集中存储,提供搜索和浏览接口。通过集中日志存储,用户可以轻松查看和分析日志,支持故障排除和系统监控。

网络插件

​ 网络插件 实现容器网络接口(CNI)规范,负责为 Pod 分配 IP 地址并实现 Pod 之间的网络通信。网络插件确保集群内的网络功能正常运行,为应用提供稳定的网络支持。

11.16 创建一个pod的流程

  1. 用户通过kubectl或其他api客户端提交pod spec给api server
  2. api server尝试着将pod对象的相关信息存入etcd中,待写入操作执行完成,api server即会返回确认信息至客户端
  3. api server开始反应etcd中的状态变化
  4. 所有的kubernetes组件均使用watch机制来跟踪检查api server上的相关的变动
  5. kube-scheduler(调度器)通过其watch觉察到api server创建了新的pod对象但尚未绑定至任何工作节点
  6. kube-scheduler为pod对象挑选一个工作节点并将结果信息更新至api server
  7. 调度结果信息由api server更新至etcd存储系统中,而且api server也开始反映此pod对象的调度结果
  8. pod被调度到的目标工作节点上的kubelet尝试在当前节点上调用docker启动容器,并将容器的结果状态回送至api server
  9. api server将pod状态信息存入etcd中
  10. 在etcd确认写入操作成功完成之后,api server将确认信息发送至相关的kubelet事件将通过它被接收

11.17 删除一个pod的流程

  1. 用户发送删除pod对象的命令
  2. api服务器中的pod对象会随着事件的推移而更新,在宽限期内(默认为30秒),pod被视为“dead”
  3. 将pod标记为terminating状态
  4. (与第三步同时运行)kubelet在监控到pod对象转为“Terminating”状态的同时启动Pod关闭过程
  5. (与第三步同时运行)端点控制器监控到pod对象的关闭行为时将其从所有匹配到此端点的service资源的端点列表中移除
  6. 如果当前Pod对象定义了preStop钩子处理器,则在其标记为“terminating”后即会以同步的方式启动执行;如若宽限期结束后,preStop仍未执行结束,则第2步会被重新执行并额外获取一个时长为2秒的小宽限期。
  7. Pod对象中的容器进程收到TERM信号。
  8. 宽限期结束后,若存在任何一个仍在运行的进程,那么Pod对象即会收到SIGKILL信号
  9. Kubelet请求API Server将此Pod资源的宽限期设置为0从而完成删除操作,它变得对用户不再可见。

11.18 什么是k8s控制器

Kubernetes(k8s)的控制器包括:

  1. 节点(Node)控制器
  2. 副本(Replication)控制器:负责维护系统中每个副本中的pod
  3. 端点(Endpoints)控制器:填充Endpoints对象(即连接Services&Pods)
  4. Service Account 和Token控制器:为新的 Namespace 创建默认帐户访问API Token
posted @ 2024-08-05 17:28  guixiang  阅读(23)  评论(0编辑  收藏  举报