什么是 Kubernetes?
Kubernetes 是一种分布式开源技术,可帮助我们在集群内和跨集群调度和执行应用程序容器。Kubernetes 集群由两种类型的资源组成:
Master => 协调集群中的所有活动,例如 => 调度应用程序、维护应用程序的状态、扩展应用程序和推出新的更新
节点Node => 节点是作为 Kubernetes 集群中工作机器的操作系统实例。
此外,Node 将有两个组件
- Kubelet => 用于管理和与 master 通信的代理
- 工具(Docker/容器)=> 运行容器操作的工具
它的设计基础是松散耦合的容器集合,以部署、维护和扩展工作负载为中心。通过融合系统的实际状态和期望状态(自我修复)作为解决状态的引擎。隐藏在节点的底层硬件之外,并为要部署和消耗共享资源(硬件)池的工作负载提供统一接口,以简化部署。
Pod 是可以部署在 Kubernetes 上的最小对象单元,Kubernetes 将一个或多个容器打包成一个更高级别的结构,称为 Pod。Pod 比容器高一层。
POD 总是在一个节点上运行,但它们共享很少的资源,这些资源可以是共享卷、集群唯一 IP、有关如何运行每个容器的信息。Pod 中的所有容器都将被安排在一个等效节点上。
服务是访问 Pod 上工作负载的统一方式,作为 Kubernetes 核心的控制平面是一个 API 服务器,可让你查询、操作 Kubernetes 中对象的状态。
下图从高层次描述了 Kubernetes 的工作流程,其中应用程序描述是一个 YAML 文件,也称为配置或规范文件,借助它我们可以在集群或节点中部署以 Pod 形式捆绑的应用程序
基本的Kubernetes经典面试题合集
1、如何在K8节点上进行维护活动?
Kubernetes面试题解析:每当有可用的安全补丁时,Kubernetes 管理员必须执行维护任务,将安全补丁应用到正在运行的容器,以防止它受到漏洞的影响,这通常是管理中不可避免的一部分。以下两个命令对于安全地耗尽 K8s 节点很有用。
- kubectl cordon
- kubectl drain –ignore-daemon set
第一个命令将节点移至维护模式或使节点不可用,然后是 kubectl drain,最终从节点中丢弃 pod。排水命令成功后就可以进行维护了。
注意:如果你希望对单个 Pod 执行维护,可以依次发出以下两个命令:
- kubectl get nodes:列出所有节点
- kubectl drain <节点名称>:排出特定节点
2、Kubernetes常见面试题有哪些:如何控制POD的资源使用?
通过使用限制和请求,可以控制 POD 的资源使用情况。
请求:为容器请求的资源数量。如果一个容器超过了它对资源的请求,它可以被限制回它的请求。
限制:单个容器可以使用的资源上限。如果它试图超过这个预定义的限制,如果 K8 决定另一个容器需要这些资源,它可以被终止。如果你对 pod 重启很敏感,那么让所有容器资源限制的总和等于或小于集群的总资源容量是有意义的。
例子:
apiVersion: v1
kind: Pod
metadata:
name: demo
spec:
containers:
- name: example1
image:example/example1
resources:
requests:
memory: "_Mi"
cpu: "_m"
limits:
memory: "_Mi"
cpu: "_m"
3、节点上运行的K8的各种服务有哪些,描述了每个服务的作用?
K8集群主要由两种类型的节点组成,executor和master。
Executor 节点:(在主节点上运行)
- Kube-proxy:该服务负责集群内的 Pod 和运行在每个节点上的外部网络的通信。当你的 Pod 建立网络通信时,此服务负责维护网络协议。
- kubelet:每个节点都有一个正在运行的 kubelet 服务,它使用配置(YAML 或 JSON)文件相应地更新正在运行的节点。注意:kubelet 服务仅适用于 Kubernetes 创建的容器。
主服务:
- Kube-apiserver:主 API 服务,充当 K8 集群的入口点。
- Kube-scheduler:根据执行器节点上的可用资源调度 POD。
- Kube-controller-manager:是一个控制循环,它通过 apiserver 监视集群的共享状态并进行更改以尝试将当前状态移至所需的稳定状态
4. 什么是 PDB(Pod 中断预算)?
Kubernetes 管理员可以创建一种部署:PodDisruptionBudget 以实现应用程序的高可用性,它确保遵守 minAvailable 规范文件中提到的最小数量正在运行的 pod。这在执行 Drain 时很有用,其中 Drain 将停止直到 PDB 得到遵守以确保应用程序的高可用性 (HA)。以下规范文件还显示 minAvailable 为 2,这意味着可用 pod 的最小数量(即使在选举之后)。
示例:使用 minAvailable => 的 YAML 配置
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: zookeeper
5. init 容器是什么,什么时候可以使用?
init 容器将在运行实际 POD 之前为你设置一个阶段。
等待一段时间,然后使用 sleep 60 之类的命令启动应用程序容器。
将 git 存储库克隆到卷中。
6、负载均衡在Kubernetes中的作用是什么?
负载均衡是一种将传入流量分配到多个后端服务器的方法,这有助于确保应用程序可供用户使用。
在 Kubernetes 中,如上图所示,所有传入流量都到达负载均衡器上的单个 IP 地址,这是一种将你的服务暴露给互联网外部的方法,该互联网使用一个将传入流量路由到特定 pod(通过服务)算法称为循环。即使任何 Pod 出现故障,也会通知负载平衡,以便流量不会路由到该特定不可用节点。因此,Kubernetes 中的负载均衡器负责将一组任务(传入流量)分配给 Pod
7. 可以采取哪些措施来提高 Kubernetes 的安全性?
默认情况下,POD 可以与任何其他 POD 通信,我们可以设置网络策略来限制 POD 之间的这种通信。
- RBAC(基于角色的访问控制)来缩小权限范围。
- 使用命名空间来建立安全边界。
- 设置准入控制策略以避免运行特权容器。
- 打开审计日志。
8.如何监控Kubernetes集群?
Prometheus 用于 Kubernetes 监控。Prometheus 生态系统由多个组件组成。
- 主要是 Prometheus 服务器,它抓取和存储时间序列数据。
- 用于检测应用程序代码的客户端库。
- 用于支持短期作业的推送网关。
- StatsD、HAProxy、Graphite 等服务的专用出口商。
- 一个警报管理器,用于处理各种支持工具的警报。
9、如何从POD获取中心日志?
Kubernetes面试题解析:这种架构取决于应用程序和许多其他因素。以下是常见的日志记录模式
- 节点级日志代理。
- 流式边车容器。
- 带有日志代理的 Sidecar 容器。
- 直接从应用程序导出日志。
在设置中,journalbeat 和 filebeat 作为 daemonset 运行。这些收集的日志被转储到 kafka 主题,该主题最终被转储到 ELK 堆栈。
使用 EFK 堆栈和 fluentd-bit 也可以实现相同的目的。
中级Kubernetes经典面试题合集
10.如何将规范中定义的服务变成外部服务?
spec:
selector:
app: some-app
ports:
- protocol: UDP
port: 8080
targetPort: 8080
解释 -
添加类型:LoadBalancer 和 nodePort 如下:
spec:
selector:
app: some-app
type: LoadBalancer
ports:
- protocol: UDP
port: 8080
targetPort: 8080
nodePort: 32412
11.完成如下配置spec文件,使其成为Ingress
metadata:
name: someapp-ingress
spec:
解释 -
回答这个问题的几种方法之一。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: someapp-ingress
spec:
rules:
- host: my.host
http:
paths:
- backend:
serviceName: someapp-internal-service
servicePort: 8080
12. 如何在 Ingress 中配置 TLS?
添加 tls 和 secretName 条目。
spec:
tls:
- hosts:
- some_app.com
secretName: someapp-secret-tls
13. Kubernetes常见面试题有哪些:为什么要使用命名空间?使用默认命名空间有什么问题?
单独使用默认命名空间时,随着时间的推移,很难概览你可以在集群中管理的所有应用程序。命名空间使将应用程序组织成有意义的组变得更容易,例如所有监控应用程序的命名空间和所有安全应用程序的命名空间等。
命名空间也可用于管理蓝/绿环境,其中每个命名空间可以包含不同版本的应用程序,还可以共享其他命名空间(如日志记录、监控等命名空间)中的资源。
命名空间的另一个用例是一个具有多个团队的集群。当多个团队使用同一个集群时,他们最终可能会互相指责。例如,如果他们最终创建了一个同名的应用程序,这意味着其中一个团队覆盖了另一个团队的应用程序,因为 Kubernetes 中不能有两个同名的应用程序(在同一个命名空间中)。
14. 在以下文件中引用了哪个服务和哪个命名空间?
apiVersion: v1
kind: ConfigMap
metadata:
name: some-configmap
data:
some_url: silicon.chip
答案 -它引用名为“chip”的命名空间中的服务“silicon”。
15. 什么是运算符?
“Operators 是 K8s 的软件扩展,它利用自定义资源来管理应用程序及其组件。Operators 遵循 Kubernetes 原则,特别是控制循环。”
16. 为什么我们需要 Operator?
Kubernetes面试题解析:在 Kubernetes 中管理应用程序的过程并不像管理无状态应用程序那么简单,在无状态应用程序中,每个副本都以相同的方式处理达到所需状态和升级。在有状态应用程序中,由于应用程序的状态特性,升级每个副本可能需要不同的处理,每个副本可能处于不同的状态。因此,我们经常需要人工操作员来管理有状态的应用程序。Kubernetes Operator 应该会对此提供帮助。
这也将有助于在多个 Kubernetes 集群上自动化标准流程
17.什么是GKE?
GKE 是 Google Kubernetes Engine,用于管理和编排 Docker 容器的系统。在谷歌公共云的帮助下,我们还可以编排容器集群。
18. 什么是 Ingress 默认后端?
它指定如何处理未映射到任何后端的 Kubernetes 集群的传入请求,即当没有为传入的 HTTP 请求定义规则时要执行的操作 如果未定义默认后端服务,则建议对其进行定义用户仍然会看到某种消息而不是不清楚的错误。
高级Kubernetes经典面试题合集
19.如何在本地运行Kubernetes?
可以使用 Minikube 工具在本地设置 Kubernetes。它在计算机上的 VM 中运行单节点组。因此,它为刚刚持续学习 Kubernetes 的用户提供了完美的方式。
20.什么是Kubernetes负载均衡?
负载平衡是公开服务的最常见和标准的方式之一。K8s 中有两种类型的负载均衡,它们是:
内部负载平衡器——这种类型的平衡器会自动平衡负载并为 Pod 分配所需的传入负载。
外部负载均衡器——这种类型的均衡器将来自外部负载的流量引导到后端 Pod。
21、Deployment配置文件中的以下内容是什么意思?
spec:
containers:
- name: USER_PASSWORD
valueFrom:
secretKeyRef:
name: some-secret
key: password
解释 -
USER_PASSWORD 环境变量会将来自密码密钥的值存储在名为“some-secret”的秘密中,换句话说,你引用了来自 Kubernetes Secret 的值。
22. Docker Swarm 和 Kubernetes 有什么区别?
以下是 Kubernetes 和 Docker 之间的主要区别:
- K8s的安装过程非常复杂,但是一旦安装,集群就很健壮。另一方面,Docker swarm 安装过程非常简单,但集群根本不健壮。
- Kubernetes 可以处理自动缩放,但 Docker swarm 无法根据传入负载处理 pod 的自动缩放。
- Kubernetes 是一个成熟的框架。由于它更一致地维护集群状态,因此自动缩放不如 Docker Swarm 快。
23、POD没有被调度如何排查?
在 K8 的调度程序中负责将 pod 生成到节点中。有很多因素会导致无法启动 POD。最常见的就是资源耗尽,使用kubectl describe <POD> -n <Namespace>之类的命令查看POD没有启动的原因。此外,请密切关注 kubectl 以获取事件以查看来自集群的所有事件。
24.如何在特定节点上运行POD?
Kubernetes面试题解析:有多种方法可以实现它。
- nodeName:在 POD 规范配置中指定节点的名称,它将尝试在特定节点上运行 POD。
- nodeSelector:为具有特殊资源的节点分配特定标签,并在 POD 规范中使用相同的标签,以便 POD 仅在该节点上运行。
- nodeaffinities:需要DuringSchedulingIgnoredDuringExecution,preferredDuringSchedulingIgnoredDuringExecution 是在特定节点上运行POD 的硬性和软性要求。这将在未来取代 nodeSelector。这取决于节点标签。
25、Kubernetes经典面试题合集:K8提供外网连接的方式有哪些?
默认情况下,POD 应该能够访问外部网络,但反之亦然,我们需要进行一些更改。以下选项可用于从外部世界连接 POD。
- Nodeport(它将在每个节点上暴露一个端口以与之通信)
- 负载均衡器(TCP/IP 协议的 L4 层)
- Ingress(TCP/IP 协议的 L7 层)
另一种方法是使用 Kube-proxy,它可以在本地系统端口上公开一个只有集群 IP 的服务。
$
kubectl proxy --port=8080 $
http://localhost:8080/api/v1/proxy/namespaces//services/:/
26. Kubernetes常见面试题有哪些:'8080 (container) -> 8080 (service) -> 8080 (ingress) -> 80 (browser) 端口怎么转发,怎么做?
Ingress 对外暴露 80 端口供浏览器访问,并连接到一个监听 8080 的服务。默认情况下,ingress 会监听 80 端口。“入口控制器”是一个接收外部流量并处理入口并由入口资源配置的 Pod 为此,你需要配置入口选择器,如果没有提到“入口控制器选择器”,则入口控制器将不会管理入口.
简单的入口配置看起来像
host: abc.org
http:
paths:
backend:
serviceName: abc-service
servicePort: 8080
Then the service will look like
kind: Service
apiVersion: v1
metadata:
name: abc-service
spec:
ports:
protocol: TCP
port: 8080 # port to which the service listens to
targetPort: 8080