没有合适的资源?快使用搜索试试~ 我知道了~
面试准备的k8s知识点
需积分: 36 7 下载量 42 浏览量
2023-01-03
22:49:59
上传
评论 4
收藏 67KB DOCX 举报
温馨提示
试读
30页
面试准备的k8s知识点
资源推荐
资源详情
资源评论
docker 的工作原理是什么,讲一下?
docker 是一个 Client-Server 结构的系统,docker 守护进程运行在宿主机上,守护进程从客户端接受命令并管理运行在
主机上的容器,容器是一个运行时环境,这就是我们说的集装箱。
docker 的组成包含哪几大部分?
一个完整的 docker 有以下几个部分组成:
1、docker client,客户端,为用户提供一系列可执行命令,用户用这些命令实现跟 docker daemon 交互;
2、docker daemon,守护进程,一般在宿主主机后台运行,等待接收来自客户端的请求消息;
3、docker image,镜像,镜像 run 之后就生成为 docker 容器;
4、docker container,容器,一个系统级别的服务,拥有自己的 ip 和系统目录结构;运行容器前需要本地存在对应的镜
像,如果本地不存在该镜像则就去镜像仓库下载。
docker 使用客户端-服务器 (C/S) 架构模式,使用远程 api 来管理和创建 docker 容器。docker 容器通过 docker 镜像来
创建。容器与镜像的关系类似于面向对象编程中的对象与类。
docker 与传统虚拟机的区别什么?
1、传统虚拟机是需要安装整个操作系统的,然后再在上面安装业务应用,启动应用,通常需要几分钟去启动应用,而
docker 是直接使用镜像来运行业务容器的,其容器启动属于秒级别;
2、Docker 需要的资源更少,Docker 在操作系统级别进行虚拟化,Docker 容器和内核交互,几乎没有性能损耗,而虚
拟机运行着整个操作系统,占用物理机的资源就比较多;
3、Docker 更轻量,Docker 的架构可以共用一个内核与共享应用程序库,所占内存极小;同样的硬件环境,Docker 运行
的镜像数远多于虚拟机数量,对系统的利用率非常高;
4、与虚拟机相比,Docker 隔离性更弱,Docker 属于进程之间的隔离,虚拟机可实现系统级别隔离;
5、Docker 的安全性也更弱,Docker 的租户 root 和宿主机 root 相同,一旦容器内的用户从普通用户权限提升为 root 权
限,它就直接具备了宿主机的 root 权限,进而可进行无限制的操作。虚拟机租户 root 权限和宿主机的 root 虚拟机权限
是分离的,并且虚拟机利用如 Intel 的 VT-d 和 VT-x 的 ring-1 硬件隔离技术,这种技术可以防止虚拟机突破和彼此交互,
而容器至今还没有任何形式的硬件隔离;
6、Docker 的集中化管理工具还不算成熟,各种虚拟化技术都有成熟的管理工具,比如:VMware vCenter 提供完备的虚
拟机管理能力;
7、Docker 对业务的高可用支持是通过快速重新部署实现的,虚拟化具备负载均衡,高可用、容错、迁移和数据保护等
经过生产实践检验的成熟保障机制,Vmware 可承诺虚拟机 99.999%高可用,保证业务连续性;
8、虚拟化创建是分钟级别的,Docker 容器创建是秒级别的,Docker 的快速迭代性,决定了无论是开发、测试、部署都
可以节省大量时间;
9、虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化,Docker 在 Dockerfile 中记录了容器构建过程,
可在集群中实现快速分发和快速部署。
docker 技术的三大核心概念是什么?
镜像:镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖
打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是
image 镜像文件。
容器:容器是基于镜像创建的,是镜像运行起来之后的一个实例,容器才是真正运行业务程序的地方。如果把镜像比
作程序里面的类,那么容器就是对象。
镜像仓库:存放镜像的地方,研发工程师打包好镜像之后需要把镜像上传到镜像仓库中去,然后就可以运行有仓库权
限的人拉取镜像来运行容器了。
centos 镜像几个 G,但是 docker centos 镜像才几百兆,这是为什么?
一个完整的 Linux 操作系统包含 Linux 内核和 rootfs 根文件系统,即我们熟悉的/dev、/proc/、/bin 等目录。我们平时看
到的 centOS 除了 rootfs,还会封装了很多软件,rpm 包,服务,图形桌面等等,所以 centOS 镜像有好几个 G 也不足为
奇。
而对于 docker 镜像而言,所有容器都是共享宿主机的 Linux 内核的,而对于 docker 镜像而言,docker 镜像只需要提供
一个很小的 rootfs 即可,只需要包含最基本的命令,工具,程序库即可,所有 docker 镜像才会这么小。
讲一下镜像的分层结构以及为什么要使用镜像的分层结构?
不管是官方的镜像还是我们平常事使用 dockerfile 创建镜像,一个新的镜像其实都是从 base 镜像一层一层叠加生成的。
每安装一个软件,dockerfile 中使用 RUM 命令,就会在现有镜像的基础上增加一层,这样一层一层的叠加最后构成整
个镜像。所以我们 docker pull 拉取一个镜像的时候会看到 docker 是一层层拉去下来的的。
使用镜像的分层机构最大的一个好处就是 : 共享资源。比如:有多个镜像都从相同的 base 镜像构建而来,那么
Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。
而且镜像的每一层都可以被共享。
讲一下容器的 copy-on-write 特性,修改容器里面的内容会修改镜像吗?
镜像它是分层的,它的每一层都可以被共享,而且镜像它是只读的。当我们启动一个容器的时候,会有一个可写层加
到镜像的顶部,这一层就是也称为“容器层”。
所有对容器的添加、删除、修改文件等等这些操作,都只会发生在容器层中,因为只有容器层是可写的,容器层下面
的镜像层都是只读的。所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比
如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠
加之后的文件系统。
添加文件时:在容器中创建文件时,新文件被添加到容器层中。
读取文件:在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到
容器层,然后打开并读入内存。
修改文件:在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复
制到容器层,然后修改之。
删除文件:在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此
删除操作。
只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对
镜像本身进行任何修改。
简单描述一下 Dockerfile 的整个构建镜像过程
好的。
1、首先,创建一个目录用于存放应用程序以及构建过程中使用到的各个文件等;
2、然后,在这个目录下创建一个 Dockerfile 文件,一般建议 Dockerfile 的文件名就是 Dockerfile;
3、编写 Dockerfile 文件,编写指令,如,使用 FORM 指令指定基础镜像,COPY 指令复制宿主机的文件到容器里面去,
RUN 指令指定要运行的 shell 命令,ENV 设置环境变量,EXPOSE 指定容器要暴露的端口,WORKDIR 设置容器里面当前
工作目录,CMD 容器启动时运行命令,等等指令构建镜像;
4、Dockerfile 编写完成就可以构建镜像了,使用 docker build -t 镜像名:tag . 命令来构建镜像,最后一个点是表示当前
目录,docker 会默认寻找当前目录下的 Dockerfile 文件来构建镜像,如果不使用默认,可以使用-f 参数来指定 dockerfile
文件,如:docker build -t 镜像名:tag -f /xx/xxx/Dockerfile ;
5、使用 docker build 命令构建之后,docker 就会将当前目录下所有的文件发送给 docker daemon,顺序执行 Dockerfile
文件里的指令,在这过程中会生成临时容器,在临时容器里面安装 RUN 指定的命令,安装成功后,docker 底层会使用
类似于 docker commit 命令来将容器保存为镜像,然后删除临时容器,以此类推,一层层的构建镜像,运行临时容器安
装软件,直到最后的镜像构建成功。
Dockerfile 构建镜像出现异常,如何排查?
首先,Dockerfile 是一层一层的构建镜像,期间会产生一个或多个临时容器,构建过程中其实就是在临时容器里面安装
应用,如果因为临时容器安装应用出现异常导致镜像构建失败,这时容器虽然被清理掉了,但是期间构建的中间镜像
还在,那么我们可以根据异常时上一层已经构建好的临时镜像,将临时镜像运行为容器,然后在容器里面运行安装命
令来定位具体的异常。
Dockerfile 的基本指令有哪些?
FROM 指定基础镜像(必须为第一个指令,因为需要指定使用哪个基础镜像来构建镜像);
MAINTAINER 设置镜像作者相关信息,如作者名字,日期,邮件,联系方式等;
COPY 复制宿主机文件到镜像中去;
ADD 复制文件到镜像(ADD 与 COPY 的区别在于,ADD 命令在复制文件的后会自动解压 tar、zip、tgz、xz 等归档文件,
而 COPY 不会,同时 ADD 指令还可以接一个 url 下载文件地址,一般建议使用 COPY 复制文件即可,文件在宿主机上是
什么样子复制到镜像里面就是什么样子这样比较好);
ENV 设置环境变量,这个变量可以在 Dockerfile 中被其他指令所引用,容器中使用;
EXPOSE 暴露容器进程的端口,仅仅是提示别人容器使用的哪个端口,没有过多作用;
VOLUME 数据卷持久化,挂载一个目录;
WORKDIR 设置工作目录,如果目录不在,则会自动创建目录;
RUN 在容器中运行命令,RUN 指令会创建新的镜像层,RUN 指令经常被用于安装软件包、依赖包等等;
CMD 指定容器启动时默认运行哪些命令,如果有多个 CMD,则只有最后一个生效,另外,CMD 指令可以被 docker run
之后的参数替换;
ENTRYOINT 指定容器启动时运行哪些命令,如果有多个 ENTRYOINT,则只有最后一个生效,另外,如果 Dockerfile 中同
时存在 CMD 和 ENTRYOINT,那么 CMD 或 docker run 之后的参数将被当做参数传递给 ENTRYOINT;
如何进入容器?使用哪个命令
进入容器有两种方法:docker attach、docker exec;
docker attach 命令是 attach 到容器启动命令的终端,docker exec 是另外在容器里面启动一个 TTY 终端。
docker attach 进入容器后想要退出来,可以按:
Ctrl + c 退出,Ctrl + c 会直接关闭容器终端,这样容器没有进程一直在前台运行就会死掉了
Ctrl + pq 退出(不会关闭容器终端停止容器,仅退出)
小结:attach 是直接进入容器启动命令的终端,不会启动新的进程;exec 则是在容器里面打开新的 bash 或 sh 终端,会
启动新的进程;一般建议使用 exec 进入容器。
什么是 k8s?说出你的理解
K8s 是一个谷歌开源的容器编排系统,现在很多公司都在使用它来进行编排容器,而且 k8s 本身能实现快速的部署应用,
扩容缩容,升级应用,都非常的方便,而且 k8s 还可以做到故障自愈、故障转移,所以,k8s 必定是未来的企业应用的
发展方向。因为传统的软件部署暴露出越来越多的弊端,而 k8s 能弥补这些弊端。
k8s 的组件有哪些,作用分别是什么?
k8s 主要由 master 节点和 node 节点构成。master 节点负责管理集群,node 节点是容器应用真正运行的地方。
master 节点包含的组件有:kube-api-server、kube-controller-manager、kube-scheduler、etcd。
node 节点包含的组件有:kubelet、kube-proxy、container-runtime。
kube-api-server:以下简称 api-server,api-server 是 k8s 最重要的核心组件之一,它是 k8s 集群管理的统一访问入口,
提供了 RESTful API 接口, 实现了认证、授权和准入控制等安全功能;api-server 还是其他组件之间的数据交互和通信的
枢纽,其他组件彼此之间并不会直接通信,其他组件对资源对象的增、删、改、查和监听操作都是交由 api-server 处理
后,api-server 再提交给 etcd 数据库做持久化存储,只有 api-server 才能直接操作 etcd 数据库,其他组件都不能直接操
作 etcd 数据库,其他组件都是通过 api-server 间接的读取,写入数据到 etcd。
kube-controller-manager:以下简称 controller-manager,controller-manager 是 k8s 中各种控制器的的管理者,是 k8s 集
群内部的管理控制中心,也是 k8s 自动化功能的核心;controller-manager 内部包含 replication controller 、 node
controller、deployment controller、endpoint controller 等各种资源对象的控制器,每种控制器都负责一种特定资源的控
制流程,而 controller-manager 正是这些 controller 的核心管理者。
kube-scheduler:以下简称 scheduler,scheduler 负责集群资源调度,其作用是将待调度的 pod 通过一系列复杂的调度
算法计算出最合适的 node 节点,然后将 pod 绑定到目标节点上。shceduler 会根据 pod 的信息,全部节点信息列表,
过滤掉不符合要求的节点,过滤出一批候选节点,然后给候选节点打分,选分最高的就是最佳节点,scheduler 就会把
目标 pod 安置到该节点。
Etcd:etcd 是一个分布式的键值对存储数据库,主要是用于保存 k8s 集群状态数据,比如,pod,service 等资源对象的
信息;etcd 可以是单个也可以有多个,多个就是 etcd 数据库集群,etcd 通常部署奇数个实例,在大规模集群中,etcd
有 5 个或 7 个节点就足够了;另外说明一点,etcd 本质上可以不与 master 节点部署在一起,只要 master 节点能通过网
络连接 etcd 数据库即可。
kubelet: kubelet 进程它是运行在每个 node 节点上的,它负责维护 node 节点上 pod 的生命周期,当 kubelet 监听到
master 的下发到自己节点的任务时,比如创建、更新、删除一个 pod,kubelet 就会通过控制 docker 来创建、更新、销
毁容器。而且 kubelet 还会定时的向 api-server 回报节点信息状态,这样 api-server 就能够知道 node 节点的资源剩余,
节点是否失联等等信息。
kube-proxy:kube-proxy 运行在 node 节点上,在 Node 节点上实现 Pod 网络代理,维护网络规则和四层负载均衡工作,
kube-proxy 会监听 api-server 中从而获取 service 和 endpoint 的变化情况,创建并维护路由规则以提供服务 IP 和负载均
衡功能。简单理解此进程是 Service 的透明代理兼负载均衡器,其核心功能是将到某个 Service 的访问请求转发到后端
的多个 Pod 实例上。
container-runtime:容器运行时环境,即运行容器所需要的一系列程序,目前 k8s 支持的容器运行时有很多,如
docker、rkt 或 containerd 其他,比较受欢迎的是 docker,但是新版的 k8s 已经宣布弃用 docker。
kube-api-server 的端口是多少?各个 pod 是如何访问 kube-api-server 的?
kube-api-server 的端口是 8080 和 6443,前者是 http 的端口,后者是 https 的端口,以我本机使用 kubeadm 安装的 k8s
为例:
在命名空间的 kube-system 命名空间里,有一个名称为 kube-api-master 的 pod,这个 pod 就是运行着 kube-api-server 进
程,它绑定了 master 主机的 ip 地址和 6443 端口,但是在 default 命名空间下,存在一个叫 kubernetes 的服务,该服务
对外暴露端口为 443,目标端口 6443,这个服务的 ip 地址是 clusterip 地址池里面的第一个地址,同时这个服务的 yaml
定义里面并没有指定标签选择器,也就是说这个 kubernetes 服务所对应的 endpoint 是手动创建的,该 endpoint 也是名
称叫做 kubernetes,该 endpoint 的 yaml 定义里面代理到 master 节点的 6443 端口,也就是 kube-api-server 的 IP 和端口。
这样一来,其他 pod 访问 kube-api-server 的整个流程就是:pod 创建后嵌入了环境变量,pod 获取到了 kubernetes 这个
服务的 ip 和 443 端口,请求到 kubernetes 这个服务其实就是转发到了 master 节点上的 6443 端口的 kube-api-server 这
个 pod 里面。
k8s 中命名空间的作用是什么?
namespace 的主要作用是用来实现多套环境的资源隔离,也就是多租户的资源隔离。
通过创建多个 namespace,然后将不同的资源分配到分配到不同的 namespace 中,这就可以形成资源的逻辑上隔离,
不同的 namespace 可以存在同名的资源,namespace 为资源提供了一个作用域,实现了逻辑隔离。
而且还可以通过 k8s 的授权机制,将不同的 namespace 交给不同的用户进行管理,这样就实现了多租户的资源隔离,
还可以结合 k8s 的资源配额机制,限定不同的租户能占用的资源,例如 CPU 使用量、内存使用量等等来实现租户可用
资源的管理。
k8s 提供了大量的 REST 接口,其中有一个是 Kubernetes Proxy API 接口,简述
一下这个 Proxy 接口的作用,以及怎么使用。
好的。kubernetes proxy api 接口,从名称中可以得知,proxy 是代理的意思,其作用就是代理 rest 请求;Kubernets API server
将接收到的 rest 请求转发到某个 node 上的 kubelet 守护进程的 rest 接口,由该 kubelet 进程负责响应。我们可以使用
这种 Proxy 接口来直接访问某个 pod,这对于逐一排查 pod 异常问题很有帮助。
下面是一些简单的例子:
http://<kube-api-server>:<api-sever-port>/api/v1/nodes/node 名称/proxy/pods #查看指定 node 的所有 pod 信息
http://<kube-api-server>:<api-sever-port>/api/v1/nodes/node 名称/proxy/stats #查看指定 node 的物理资源统计信息
http://<kube-api-server>:<api-sever-port>/api/v1/nodes/node 名称/proxy/spec #查看指定 node 的概要信息
http://<kube-api-server>:<api-sever-port>/api/v1/namespace/命名名称/pods/pod 名称/pod 服务的 url/ # 访 问 指 定
pod 的程序页面
http://<kube-api-server>:<api-sever-port>/api/v1/namespace/命名名称/servers/svc 名称/url/ #访问指定 server 的 url 程
剩余29页未读,继续阅读
资源评论
MssGuo
- 粉丝: 465
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- MyBatis 动态 SQL:灵活而强大的查询构建器.pdf
- com.accordion.prettyo.apk
- 毕业设计:基于SSM的mysql-ssm软件bug管理系统(源码 + 数据库 + 说明文档)
- MTSQL8.0.35windows(64bit)-mysql-installer-community-8.0.35.0
- 人工智能引领音乐创作新时代之Suno AI
- Public-bicycle-usage-forecast-master.zip
- 通道处理过程模拟:从理论到实践.pdf
- 数据库第七次作业E-R图第一题
- 大厂面试真题Java语法基础面试专题及答案
- IMG20240428211124.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功