Kubernetes面试题超详细总结

Stella981
• 阅读 659

来自:stackpush | 责编:乐乐

链接:blog.csdn.net/huakai_sun/article/details/82378856

正文

一个目标:容器操作;两地三中心;四层服务发现;五种 Pod 共享资源;六个 CNI 常用插件;七层负载均衡;八种隔离维度;九个网络模型原则;十类 IP 地址;百级产品线;千级物理机;万级容器;相如无亿,k8s 有亿:亿级日服务人次。

一个目标:容器操作

Kubernetes(k8s)是自动化容器操作的开源平台。这些容器操作包括:部署调度节点集群间扩展

具体功能:

  • 自动化容器部署和复制。

  • 实时弹性收缩容器规模。

  • 容器编排成组,并提供容器间的负载均衡。

  • 调度:容器在哪个机器上运行。

组成:

  • kubectl:客户端命令行工具,作为整个系统的操作入口。

  • kube-apiserver:以 REST API 服务形式提供接口,作为整个系统的控制入口。

  • kube-controller-manager:执行整个系统的后台任务,包括节点状态状况、Pod 个数、Pods 和Service 的关联等。

  • kube-scheduler:负责节点资源管理,接收来自 kube-apiserver 创建 Pods 任务,并分配到某个节点。

  • etcd:负责节点间的服务发现和配置共享。

  • kube-proxy:运行在每个计算节点上,负责 Pod 网络代理。定时从 etcd 获取到 service 信息来做相应的策略。

  • kubelet:运行在每个计算节点上,作为 agent,接收分配该节点的 Pods 任务及管理容器,周期性获取容器状态,反馈给 kube-apiserver。

  • DNS:一个可选的 DNS 服务,用于为每个 Service 对象创建 DNS 记录,这样所有的 Pod 就可以通过 DNS 访问服务了。

下面是 k8s 的架构拓扑图:

Kubernetes面试题超详细总结

两地三中心

两地三中心包括本地生产中心本地灾备中心异地灾备中心

Kubernetes面试题超详细总结

两地三中心要解决的一个重要问题就是数据一致性问题

k8s 使用 etcd 组件作为一个高可用、强一致性的服务发现存储仓库。用于配置共享和服务发现。

它作为一个受到 Zookeeper 和 doozer 启发而催生的项目。除了拥有他们的所有功能之外,还拥有以下 4 个特点:

  • 简单:基于 HTTP+JSON 的 API 让你用 curl 命令就可以轻松使用。

  • 安全:可选 SSL 客户认证机制。

  • 快速:每个实例每秒支持一千次写操作。

  • 可信:使用 Raft 算法充分实现了分布式。

四层服务发现

先一张图解释一下网络七层协议:

Kubernetes面试题超详细总结

k8s 提供了两种方式进行服务发现:

  • 环境变量:当创建一个 Pod 的时候,kubelet 会在该 Pod 中注入集群内所有 Service 的相关环境变量。需要注意的是,要想一个 Pod 中注入某个 Service 的环境变量,则必须 Service 要先比该 Pod 创建。这一点,几乎使得这种方式进行服务发现不可用。

    比如,一个 ServiceName 为 redis-master 的 Service,对应的 ClusterIP:Port 为 10.0.0.11:6379,则对应的环境变量为:

    Kubernetes面试题超详细总结

  • DNS:可以通过 cluster add-on 的方式轻松的创建 KubeDNS 来对集群内的 Service 进行服务发现。

以上两种方式,一个是基于 TCP,DNS 基于 UDP,它们都是建立在四层协议之上。

五种 Pod 共享资源

Pod 是 k8s 最基本的操作单元,包含一个或多个紧密相关的容器。

一个 Pod 可以被一个容器化的环境看作应用层的“逻辑宿主机”;一个 Pod 中的多个容器应用通常是紧密耦合的,Pod 在 Node 上被创建、启动或者销毁;每个 Pod 里运行着一个特殊的被称之为 Volume 挂载卷,因此他们之间通信和数据交换更为高效。在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个 Pod 中。

Kubernetes面试题超详细总结

同一个 Pod 里的容器之间仅需通过 localhost 就能互相通信。

一个 Pod 中的应用容器共享五种资源:

  • PID 命名空间:Pod 中的不同应用程序可以看到其他应用程序的进程 ID。

  • 网络命名空间:Pod 中的多个容器能够访问同一个IP和端口范围。

  • IPC 命名空间:Pod 中的多个容器能够使用 SystemV IPC 或 POSIX 消息队列进行通信。

  • UTS 命名空间:Pod 中的多个容器共享一个主机名。

  • Volumes(共享存储卷):Pod 中的各个容器可以访问在 Pod 级别定义的 Volumes。

Pod 的生命周期通过 Replication Controller 来管理;通过模板进行定义,然后分配到一个 Node 上运行,在 Pod 所包含容器运行结束后,Pod 结束。

Kubernetes 为 Pod 设计了一套独特的网络配置,包括为每个 Pod 分配一个IP地址,使用 Pod 名作为容器间通信的主机名等。在公众号顶级架构师回复“架构整洁”,获取惊喜礼包。

六个 CNI 常用插件

CNI(Container Network Interface)容器网络接口是 Linux 容器网络配置的一组标准和库,用户需要根据这些标准和库来开发自己的容器网络插件。CNI 只专注解决容器网络连接和容器销毁时的资源释放,提供一套框架。所以 CNI 可以支持大量不同的网络模式,并且容易实现。

下面用一张图表示六个 CNI 常用插件:

Kubernetes面试题超详细总结

七层负载均衡

提负载均衡就不得不先提服务器之间的通信。

IDC(Internet Data Center)也可称数据中心机房,用来放置服务器。IDC 网络是服务器间通信的桥梁。

Kubernetes面试题超详细总结

上图里画了很多网络设备,它们都是干啥用的呢?

路由器、交换机、MGW/NAT 都是网络设备,按照性能、内外网划分不同的角色。

  • 内网接入交换机:也称为 TOR(top of rack),是服务器接入网络的设备。每台内网接入交换机下联 40-48 台服务器,使用一个掩码为 /24 的网段作为服务器内网网段。

  • 内网核心交换机:负责 IDC 内各内网接入交换机的流量转发及跨 IDC 流量转发。

  • MGW/NAT:MGW 即 LVS 用来做负载均衡,NAT 用于内网设备访问外网时做地址转换。

  • 外网核心路由器:通过静态互联运营商或 BGP 互联美团统一外网平台。

先说说各层负载均衡:

  • 二层负载均衡:基于 MAC 地址的二层负载均衡。

  • 三层负载均衡:基于 IP 地址的负载均衡。

  • 四层负载均衡:基于 IP+端口 的负载均衡。

  • 七层负载均衡:基于 URL 等应用层信息的负载均衡。

这里用一张图来说说四层和七层负载均衡的区别:

Kubernetes面试题超详细总结

上面四层服务发现讲的主要是 k8s 原生的 kube-proxy 方式。k8s 关于服务的暴露主要是通过 NodePort 方式,通过绑定 minion 主机的某个端口,然后进行 Pod 的请求转发和负载均衡,但这种方式有下面的缺陷:

  • Service 可能有很多个,如果每个都绑定一个 Node 主机端口的话,主机需要开放外围的端口进行服务调用,管理混乱。

  • 无法应用很多公司要求的防火墙规则。

理想的方式是通过一个外部的负载均衡器,绑定固定的端口,比如 80;然后根据域名或者服务名向后面的 Service IP 转发。

Nginx 很好的解决了这个需求,但问题是如果有的新的服务加入,如何去修改并且加载这些Nginx 配置?

Kubernetes 给出的方案就是 Ingress。这是一个基于七层的方案。

**八种隔离维度
**

Kubernetes面试题超详细总结

k8s 集群调度这边需要对上面从上到下从粗粒度到细粒度的隔离做相应的调度策略。

九个网络模型原则

k8s 网络模型要符合四个基础原则三个网络要求原则一个架构原则一个 IP 原则

每个 Pod 都拥有一个独立的 IP 地址,而且假定所有 Pod 都在一个可以直接连通的、扁平的网络空间中,不管是否运行在同一 Node 上都可以通过 Pod 的 IP 来访问。

k8s 中的 Pod 的 IP 是最小粒度 IP。同一个 Pod 内所有的容器共享一个网络堆栈,该模型称为 IP-per-Pod 模型

  • Pod 由 docker0 实际分配的 IP。

  • Pod 内部看到的 IP 地址和端口与外部保持一致。

  • 同一个 Pod 内的不同容器共享网络,可以通过localhost来访问对方的端口,类似同一个虚拟机内不同的进程。

IP-per-Pod 模型从端口分配、域名解析、服务发现、负载均衡、应用配置等角度看,Pod 可以看做是一台独立的虚拟机或物理机。

  • 所有容器都可以不用 NAT 的方式同别的容器通信。

  • 所有节点都可以在不同 NAT 方式下同所有容器通信,反之亦然。

  • 容器的地址和别人看到的地址是同一个地址。

要符合下面的架构:

Kubernetes面试题超详细总结

由上图架构引申出来 IP 概念从集群外部到集群内部:

Kubernetes面试题超详细总结

十类IP地址

大家都知道 IP 地址分为 ABCDE 类,另外还有五类特殊用途的 IP。

第一类

  • A 类:1.0.0.0-1226.255.255.255,默认子网掩码/8,即255.0.0.0。

  • B 类:128.0.0.0-191.255.255.255,默认子网掩码/16,即255.255.0.0。

  • C 类:192.0.0.0-223.255.255.255,默认子网掩码/24,即255.255.255.0。

  • D 类:224.0.0.0-239.255.255.255,一般用于组播。

  • E 类:240.0.0.0-255.255.255.255(其中255.255.255.255为全网广播地址)。E 类地址一般用于研究用途。

第二类

0.0.0.0

严格来说,0.0.0.0 已经不是一个真正意义上的 IP 地址了。它表示的是这样一个集合:所有不清楚的主机和目的网络。这里的不清楚是指在本机的路由表里没有特定条目指明如何到达。作为缺省路由。

127.0.0.1 本机地址。

第三类

224.0.0.1 组播地址。

如果你的主机开启了IRDP(internet路由发现,使用组播功能),那么你的主机路由表中应该有这样一条路由。

第四类

169.254.x.x

使用了 DHCP 功能自动获取了 IP 的主机,DHCP 服务器发生故障,或响应时间太长而超出了一个系统规定的时间,系统会为你分配这样一个 IP,代表网络不能正常运行。

第五类

10.xxx172.16.x.x~172.31.x.x192.168.x.x 私有地址。

大量用于企业内部。保留这样的地址是为了避免亦或是哪个接入公网时引起地址混乱。

PS: 欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!


后台回复“加群”,带你进入高手如云交流群

推荐阅读:

kube-proxy 如何与 iptables 配合使用

完美排查入侵者

Kubernetes 万字实战教程 (2021最新版)

Kubernetes 常见问题总结

一文详解负载均衡和反向代理的真实区别

经典!Kubernetes 几个常见对象概述图

带宽、延时、吞吐率、PPS 这些都是啥?

一文读懂你身边的网络

Linux 环境变量配置全攻略

如何定位软中断CPU使用率过高的问题?

10大高性能开发利器

安全容器gVisor详解

TCP协议灵魂 12 问,总会用得到

QUIC也不是万能的

超详干货!Linux环境变量配置全攻略

为什么要选择智能网卡?

60,000毫秒内对Linux进行性能诊断

为什么Linux需要Swapping

Linux系统常用命令速查手册

一文读懂容器网络发展

一文搞懂CDN加速原理

8 个问题彻底搞透 DNS 协议

三张图彻底搞懂iptables和netfilter

故障排查:K8s中Pod无法正常解析域名

网络排错大讲解~

OVS 和 OVS-DPDK 对比

微软出品的最新K8S学习指南3.0下载


**_喜欢,就给我一个“在看”******_

Kubernetes面试题超详细总结


10T 技术资源大放送!包括但不限于:云计算、虚拟化、微服务、大数据、网络、Linux、Docker、Kubernetes、Python、Go、C/C++、Shell、PPT 等。在公众号内回复「1024,即可免费获取!!****

Kubernetes面试题超详细总结

本文分享自微信公众号 - Linux云计算网络(cloud_dev)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Bill78 Bill78
3年前
k8s超详细总结
一个目标:容器操作;两地三中心;四层服务发现;五种Pod共享资源;六个CNI常用插件;七层负载均衡;八种隔离维度;九个网络模型原则;十类IP地址;百级产品线;千级物理机;万级容器;相如无亿,K8s有亿:亿级日服务人次。一个目标:容器操作Kubernetes(k8s)是自动化容器操作的开源平台。这些容
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这