K8S面试题

877次阅读
没有评论
K8S 面试题

service 和 ep 的关系

在 Kubernetes 中,Service 和 Endpoint(简称 EP)是两个不同的概念,但它们之间有一定的关联。

在 Kubernetes 中,Service 是一种抽象,用于公开一组 Pod 作为一个网络服务。当 Service 被创建时,Kubernetes 会创建一个虚拟 IP 地址(ClusterIP),以及一个与该 Service 相关的 DNS 名称。其他的 Kubernetes 资源可以使用 Service 名称和 ClusterIP 来访问该服务,而无需了解后面的 Pod IP 地址。

Endpoint 则是 Kubernetes 中另一个重要的资源,它是一种用于存储一组网络终端点的对象。在 Kubernetes 中,Endpoint 通常用于存储一组后端 Pod 的 IP 地址和端口号,这些 Pod 可以通过 Service 进行访问。当 Service 被创建时,Kubernetes 会自动创建一个 Endpoint 对象,并将它与该 Service 相关联。这个 Endpoint 对象会包含一个或多个 Pod 的 IP 地址和端口号,Service 将使用这些信息来负载均衡请求。

因此,Service 和 Endpoint 之间的关系是:Service 使用 Endpoint 来确定如何将请求负载均衡到后端 Pod 上。Endpoint 中存储了 Service 可以访问的一组后端 Pod 的 IP 地址和端口号。当 Service 接收到请求时,它会使用这些 IP 地址和端口号来决定将请求路由到哪个后端 Pod 上。

deployment 和 rs 有什么关系

在 Kubernetes 中,Deployment(部署)和 ReplicaSet(副本集)是两个不同的概念,但它们之间有一定的关系。

Deployment 是 Kubernetes 中一种用于管理 Pod 副本的对象。它定义了一个 Pod 模板和一组部署策略,用于创建和更新 Pod 副本的数量和版本。当 Deployment 被创建时,Kubernetes 会创建一个 ReplicaSet 对象,这个 ReplicaSet 会负责实际管理 Pod 的副本。如果需要对 Pod 副本进行更新、扩容或缩容,Deployment 会修改 ReplicaSet 中的 Pod 模板,并根据所选的部署策略进行 Pod 副本的滚动更新。

ReplicaSet 是 Kubernetes 中一种用于管理 Pod 副本数量的对象。它定义了一个 Pod 模板,以及要运行的 Pod 副本数量。当 ReplicaSet 被创建时,Kubernetes 会创建指定数量的 Pod 副本。如果有任何 Pod 副本故障或被删除,ReplicaSet 将自动创建新的 Pod 副本来保证指定的 Pod 副本数量不变。

因此,Deployment 和 ReplicaSet 之间的关系是:Deployment 使用 ReplicaSet 来管理 Pod 副本的数量。Deployment 定义了一个 Pod 模板和一组部署策略,用于创建和更新 Pod 副本的数量和版本。当 Deployment 进行更新或扩缩容时,它会修改 ReplicaSet 中的 Pod 模板,并根据所选的部署策略进行 Pod 副本的滚动更新,从而确保 Pod 副本的数量始终与 Deployment 的期望值相匹配。

clusterIP 访问不通是什么原因

ClusterIP 是 Kubernetes 中 Service 的一种类型,用于将一组后端 Pod 公开为一个虚拟的 IP 地址。如果通过 ClusterIP 访问 Service 时出现问题,可能有以下几个原因:

Service 未正确创建:如果 Service 没有正确创建或配置,ClusterIP 可能无法正常工作。您可以使用 kubectl get svc 命令检查 Service 是否已成功创建,并使用 kubectl describe svc 命令检查 Service 的详细信息以查看是否存在任何问题。

Service 没有正确关联后端 Pod:如果 Service 没有正确关联后端 Pod,ClusterIP 可能无法正确转发请求到后端 Pod。您可以使用 kubectl describe svc 命令检查 Service 的 Endpoint 信息,以确保它包含正确的后端 Pod IP 地址和端口号。

网络问题:如果您使用的是网络插件,可能存在网络配置问题。您可以使用 kubectl get pods -n kube-system 命令检查网络插件的运行状况,并使用 kubectl logs -n kube-system 命令查看网络插件的日志,以查找网络问题。

防火墙或安全组问题:如果您在使用云提供商的 Kubernetes 服务,可能存在防火墙或安全组规则导致 ClusterIP 无法访问。您可以查阅云服务提供商的文档,了解相关的防火墙或安全组规则。

DNS 问题:如果您正在使用 DNS 名称来访问 Service,可能存在 DNS 配置问题。您可以使用 kubectl get endpoints 命令检查 Service 的 Endpoint 信息,并使用 kubectl describe pod 命令检查 Pod 的 DNS 配置。

以上是一些可能导致 ClusterIP 访问不通的原因,您可以通过检查这些方面来解决 ClusterIP 访问不通的问题。

service 和 deployment 有什么关系

在 Kubernetes 中,Service 和 Deployment 是两个不同的概念,但它们之间有关联。Deployment 用于定义一个 Pod 模板和部署策略,用于创建和更新 Pod 副本的数量和版本,而 Service 则用于将一组后端 Pod 公开为一个虚拟 IP 地址,并为这些 Pod 提供一个负载均衡的入口。

Deployment 和 Service 的关系是:Deployment 创建的 Pod 是 Service 的后端对象。当 Deployment 创建或更新 Pod 时,Service 会自动将这些 Pod 加入到其后端对象池中。Service 使用这些 Pod 来处理客户端请求,并根据 Service 的负载均衡策略,将请求分配给不同的 Pod。

在实际使用中,通常会先创建 Deployment 来定义应用程序的 Pod 模板和部署策略,然后再创建一个 Service,将这些 Pod 公开为一个虚拟 IP 地址,为外部客户端提供访问入口。这样,即使 Pod 发生故障、扩容或缩容,Service 仍然可以保持访问入口不变。

总之,Deployment 和 Service 是 Kubernetes 中两个不同的对象,但它们之间有一定的关联。Deployment 创建的 Pod 是 Service 的后端对象,Service 为这些 Pod 提供负载均衡的入口。这种关系使得在 Kubernetes 中部署和管理应用程序更加方便和灵活。

k8s 中有几种健康检查的方式

在 Kubernetes 中,有三种常用的健康检查方式:Liveness Probe、Readiness Probe 和 Startup Probe。

Liveness Probe
Liveness Probe 是用于检测容器内应用程序是否存活的健康检查方式。Kubernetes 会定期发送一个 HTTP 请求、TCP 连接或执行一个命令来检查容器的状态。如果容器的响应超时、返回非 200 状态码或命令执行失败,则认为容器已经不健康,Kubernetes 将会尝试重启容器。Liveness Probe 通常用于检测应用程序是否发生了死锁或其他严重错误,从而保证应用程序的可用性。

Readiness Probe
Readiness Probe 是用于检测容器是否准备好接收流量的健康检查方式。Kubernetes 会定期发送一个 HTTP 请求、TCP 连接或执行一个命令来检查容器的状态。如果容器返回 200 状态码,Kubernetes 将会认为容器已经就绪,并开始将流量分配到该容器上。如果容器没有返回 200 状态码,Kubernetes 将不会将流量分配到该容器上,直到容器返回 200 状态码为止。Readiness Probe 通常用于检测容器是否已经完成了初始化,或者是否已经连接到依赖的服务。

Startup Probe
Startup Probe 是用于检测容器是否已经启动完成的健康检查方式。Kubernetes 会在容器启动后等待一段时间,然后发送一个 HTTP 请求、TCP 连接或执行一个命令来检查容器的状态。如果容器返回 200 状态码,Kubernetes 将会认为容器已经启动完成,并开始将流量分配到该容器上。如果容器没有返回 200 状态码,Kubernetes 将会认为容器启动失败,并尝试重启该容器。Startup Probe 通常用于检测容器是否已经成功启动并运行,从而避免将流量发送到尚未完全启动的容器上。

总之,Liveness Probe、Readiness Probe 和 Startup Probe 都是 Kubernetes 中常用的健康检查方式,它们可以帮助 Kubernetes 自动识别并处理出现故障的容器,从而提高应用程序的可用性和稳定性。

目前有几种 k8s 的网络插件

Kubernetes 支持多种网络插件,不同的插件具有不同的实现方式和特点。以下是目前常用的几种 Kubernetes 网络插件:

Flannel

Flannel 是一种基于 vxlan 的覆盖网络方案,它使用 vxlan 技术将每个节点的 Pod 网络地址空间连接在一起,从而实现了跨节点的 Pod 网络通信。

Calico

Calico 是一种基于 BGP 协议的 L3 网络方案,它使用网络策略来实现网络隔离和安全控制,并支持多种网络拓扑结构,例如单一网段、双网段和多网段。

Cilium

Cilium 是一种基于 eBPF 技术的 L3/L4 网络方案,它使用 eBPF 过滤器来实现网络隔离和安全控制,并支持多种网络拓扑结构,例如单一网段、双网段和多网段。

Weave Net

Weave Net 是一种基于虚拟网络设备的 L2 网络方案,它使用 vxlan 和 macvlan 技术来实现网络隔离和通信,并支持多种网络拓扑结构,例如单一网段、双网段和多网段。

kube-router

kube-router 是一种基于 BGP 协议的 L3/L4 网络方案,它使用 iptables 和 ipvs 技术来实现网络隔离和通信,并支持多种网络拓扑结构,例如单一网段、双网段和多网段。

需要注意的是,不同的网络插件具有不同的实现方式和特点,选择合适的网络插件需要根据实际情况进行评估和测试。

同一个 node 上,pod 之间互相通信会不会走网络插件

在同一个节点上运行的 Pod 之间的通信不会通过网络插件进行路由和转发。这是因为在同一个节点上运行的 Pod 共享同一个网络命名空间,它们可以直接通过 localhost 或者容器 IP 进行通信,不需要经过网络插件的处理。

当同一个节点上的 Pod 需要与其他节点上的 Pod 进行通信时,通信数据需要经过网络插件进行路由和转发。网络插件会将通信数据从源 Pod 的节点转发到目标 Pod 的节点,并在目标节点上将数据转发给目标 Pod。在 Kubernetes 中,这种跨节点的 Pod 网络通信可以通过各种网络插件来实现,例如 Flannel、Calico、Cilium 等。

会不会走 iptables

在 Kubernetes 中,网络插件通常会使用 iptables、ipvs 或 eBPF 等技术来实现网络隔离、流量控制和路由转发等功能。因此,当同一个节点上的 Pod 之间进行通信时,数据流量可能会通过 iptables 规则进行过滤和转发。

具体来说,当 Pod 向同一节点上的另一个 Pod 发送数据时,数据包会被发送到 Linux 内核中的网络层,然后根据本地的路由表决定是否需要经过 iptables 规则进行过滤和转发。如果目标 Pod 在同一个节点上,则数据包会直接传递给目标 Pod;否则,数据包会被传递到网络插件中进行进一步处理和路由转发。

需要注意的是,不同的网络插件可能会使用不同的技术来实现网络隔离和路由转发,因此在实际使用中,需要根据具体的网络插件和实现方式来了解数据流量的路径和处理过程。

正文完
 
评论(没有评论)