# 面试题丨Kubernetes

# 1. 什么是 K8s?

K8s 是一个开源容器管理工具,负责容器部署,容器扩缩容以及负载平衡。作为 Google 的创意之作,它提供了出色的社区,并与所有云提供商合作。因此,我们可以说 Kubernetes 不是一个容器化平台,而是一个多容器管理解决方案。

# 2. K8s 和 Docker 之间的关系?

众所周知,Docker 提供容器的生命周期管理,Docker 镜像构建运行时容器。但是,由于这些单独的容器必须通信,因此使用 K8s。因此,我们说 Docker 构建容器,这些容器通过 K8s 相互通信。因此,可以使用 K8s 手动关联和编排在多个主机上运行的容器。

# 3. 在主机和容器上部署应用程序有什么区别?

640?wx_fmt=jpeg

两者都共用系统内核资源。不同的是:

  • 在主机上部署应用,多个应用程序可以共享相同的一个库;
  • 在容器上部署应用,不同的容器将其上面的依赖库隔离开了,只有当前容器可以访问到安装到当前容器上的依赖库。

# 4. K8s 的功能

  • 服务发现和负载均衡;
  • 存储编排;
  • 自动部署和回滚;
  • 自动完成装箱计算;
  • 自我修复;
  • 密钥和配置管理;

# 5. K8s 特点

Kubernetes 是一个开放的开发平台,它不局限于任何一种语言,没有限定任何编程接口,所以不论是用 Java、Go、C++ 还是用 Python 编写的服务,都可以被映射为 Kubernetes 的 Service(服务),并通过标准的 TCP 通信协议进行交互。此外,Kubernetes 平台对现有的编程语言、编程框架、中间件没有任何侵入性,因此现有的系统也很容易改造升级并迁移到 Kubernetes 平台上。

# 6. K8s 架构

3.png

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:只使用本地镜像,从不去远程仓库拉取,本地没有就报错
/
上次更新: 8/28/2022, 11:43:26 PM