# 面试题丨Kubernetes
# 1. 什么是 K8s?
K8s 是一个开源容器管理工具,负责容器部署,容器扩缩容以及负载平衡。作为 Google 的创意之作,它提供了出色的社区,并与所有云提供商合作。因此,我们可以说 Kubernetes 不是一个容器化平台,而是一个多容器管理解决方案。
# 2. K8s 和 Docker 之间的关系?
众所周知,Docker 提供容器的生命周期管理,Docker 镜像构建运行时容器。但是,由于这些单独的容器必须通信,因此使用 K8s。因此,我们说 Docker 构建容器,这些容器通过 K8s 相互通信。因此,可以使用 K8s 手动关联和编排在多个主机上运行的容器。
# 3. 在主机和容器上部署应用程序有什么区别?
两者都共用系统内核资源。不同的是:
- 在主机上部署应用,多个应用程序可以共享相同的一个库;
- 在容器上部署应用,不同的容器将其上面的依赖库隔离开了,只有当前容器可以访问到安装到当前容器上的依赖库。
# 4. K8s 的功能
- 服务发现和负载均衡;
- 存储编排;
- 自动部署和回滚;
- 自动完成装箱计算;
- 自我修复;
- 密钥和配置管理;
# 5. K8s 特点
Kubernetes 是一个开放的开发平台,它不局限于任何一种语言,没有限定任何编程接口,所以不论是用 Java、Go、C++ 还是用 Python 编写的服务,都可以被映射为 Kubernetes 的 Service(服务),并通过标准的 TCP 通信协议进行交互。此外,Kubernetes 平台对现有的编程语言、编程框架、中间件没有任何侵入性,因此现有的系统也很容易改造升级并迁移到 Kubernetes 平台上。
# 6. K8s 架构
Master:
# kube-apiserver
API 服务器是 Kubernetes Control Plane 的组件, 该组件公开了 Kubernetes API。 API 服务器是 Kubernetes 控制面的前端。
Kubernetes API 服务器的主要实现是 kube-apiserver。 kube-apiserver 设计上考虑了水平伸缩,也就是说,它可通过部署多个实例进行伸缩。 你可以运行 kube-apiserver 的多个实例,并在这些实例之间平衡流量。
# etcd
etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。(最好做一下备份)
# kube-scheduler
负责监视新创建的、未指定运行节点(node)的 Pods,选择节点让 Pod 在上面运行。
调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。
# kube-controller-manager
在主节点上运行控制器的组件。
从逻辑上讲,每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。
这些控制器包括:
- 节点控制器(Node Controller):负责在节点出现故障时进行通知和响应
- 任务控制器(Job controller):监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
- 端点控制器(Endpoints Controller):填充端点(Endpoints)对象(即加入 Service 与 Pod)
- 服务帐户和令牌控制器(Service Account & Token Controllers):为新的命名空间创建默认帐户和 API 访问令牌
Node:
Node 是 Kubernetes 集群中的工作负载节点,每个 Node 都会被 Control Plane 分配一些工作负载(Docker 容器),当某个 Node 宕机时,其上的工作负载会被 Control Plane 自动转移到其他节点上。
Node 上的核心组件有:
# kubelet
负责 Pod 对应的容器的创建、启停等任务,同时与 Control Plane 密切协作,实现集群管理的基本功能。
# kube-proxy
kube-proxy
是集群中每个节点上运行的网络代理, 实现 Kubernetes 服务(Service)概念的一部分。
kube-proxy
维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
如果操作系统提供了数据包过滤层并可用的话,kube-proxy
会通过它来实现网络规则。否则, kube-proxy
仅转发流量本身。
# 7. K8s 各个组件之间的关系
Container
容器,应用程序都是运行在一个个容器里面的;
Pod
一个 Pod 可能包含多个容器,这些容器一般业务比较紧密,Pod 是短暂的;
Node
Node 当中还有多个 Pod,是 K8s 中的工作负载节点,负责管理 Pod;
ReplicaSet
用来确保 Pod 副本数始终保持在用户定义的副本数;
Deployment
无状态应用部署,为 Pod 和 ReplicaSet 提供一个声明式定义方法,可以利用它来创建 Pod 和 Deployment,并简便地进行升级和回滚、扩缩容、暂停和继续。
StatefulSet
有状态应用部署。
DammonSet
确保全部(或者一些) Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。
删除 DaemonSet 将会删除它创建的所有 Pod。
Service
Service 在 Node 里面,是 Node 中定义的外界可以访问的入口,它有一定的规则,将请求转发到特定的 Pod 中。
# 8. K8s Pod 镜像拉取策略
k8s 支持配置三种拉取策略:
- Always:总是从远程仓库拉取镜像
- IfNotPresent:本地有则使用本地镜像,本地没有则从远程仓库拉取镜像
- Never:只使用本地镜像,从不去远程仓库拉取,本地没有就报错