10 个问题测试你对 K8s 的理解程度
10 个 Kubernetes 问题,测试你对 Kubernetes 的理解程度:
原文:https://medium.com/@rifewang/kubernetes-10-questions-to-test-your-understanding-of-k8s-c2860c9f3cbf
- 1.在具有两个节点的集群中,一个节点有 Pod,另一个没有,新 Pod 将被调度到哪个节点?
- 2.如果容器中运行的应用程序遇到 OOM(内存不足)错误,容器会重启,还是会重新创建整个 Pod?
- 3.是否可以在不重新创建 Pod 的情况下动态应用环境变量或 ConfigMap 更新等应用程序配置?
- 4.Pod 一旦创建,即使用户没有采取进一步的行动,是否也就稳定下来了?
- 5.ClusterIP 类型的 Service 能否确保 TCP 流量的负载均衡?
- 6.应如何收集应用程序日志,是否存在丢失日志的风险?
- 7.如果 HTTP Server 类型的 Pod 的 livenessProbe 运行正常,是否意味着该应用程序没有问题?
- 8.应用程序如何扩展以应对流量波动?
- 9.当你执行
kubectl exec -it <pod> -- bash
时,你是否登录了 Pod? - 10.如果 Pod 中的容器反复退出和重启,您将如何排除故障?
看到这些问题时,内心是否能够立马有准确的答案呢?下面是答案:
1.在具有两个节点的集群中,一个节点有 Pod,另一个没有,新 Pod 将被调度到哪个节点?
调度过程包括几个阶段:
结果取决于 Pod 亲和性、污点和容忍度以及调度插件等配置。但是,假设两个节点上的默认配置和相同的资源可用性,NodeResourcesFit 插件起着关键作用。其评分策略包括 LeastAllocated (默认,优先考虑资源使用率最低的节点)、MostAllocated (优先考虑资源使用率较高的节点)和 RequestedToCapacityRatio(平衡资源利用率)。使用 MostAllocated 策略,新 Pod 将被调度到具有现有 Pod 的节点,而其他两种策略则更喜欢空节点。
2.如果容器中运行的应用程序遇到 OOM(内存不足)错误,容器会重启,还是会重新创建整个 Pod?
当容器内存不足时,它通常会根据 Pod 的 RestartPolicy(默认为 Always)重启。Pod 本身保持不变。但是,在极端情况下,例如节点上的严重内存压力,Pod 可能会被驱逐,从而导致其重新创建。
3.是否可以在不重新创建 Pod 的情况下动态应用环境变量或 ConfigMap 更新等应用程序配置?
环境变量无法动态更新。但是,如果 ConfigMap 更新作为文件挂载(不使用 subPath),则可以动态应用。同步延迟取决于 kubelet 的 syncFrequency(默认为 1 分钟)和 configMapAndSecretChangeDetectionStrategy。
4.Pod 一旦创建,即使用户没有采取进一步的行动,是否也就稳定下来了?
不能保证 Pod 保持稳定。资源短缺或网络中断等因素可能会导致 Pod 驱逐,即使没有用户干预也是如此。
5.ClusterIP 类型的 Service 能否确保 TCP 流量的负载均衡?
ClusterIP 的服务依靠 Linux 内核 Netfilter 进行负载均衡。其 connection tracking 机制维护已建立的 TCP 连接的会话持久性。这可能会导致长期连接的负载分配不均匀。
6.应用程序日志应该如何收集,是否存在丢失日志的风险?
日志可以输出到 stdout/stderr
或写入文件。对于 stdout/stderr
,日志保存在节点上,可以使用 Fluentd 或 Filebeat(通常部署为 DaemonSet)等日志代理进行收集。但是,如果删除了 Pod,则其日志可能会在 Agent 收集之前丢失。将日志写入持久性存储上的文件可以防止丢失。
7.如果 HTTP Server Pod 的 livenessProbe 运行正常,是否意味着该应用程序没有问题?
从应用程序的角度来看,livenessProbe 只检查应用程序是否处于活动状态,而不检查它是否正常运行。应用程序可能处于降级状态,但仍通过探测。从网络角度来看,livenessProbe(例如 httpGet)检查来自节点 kubelet 的请求,这并不能保证跨节点网络的可靠性。
8.应用程序如何扩展以应对流量波动?
Kubernetes 支持水平 Pod 自动扩展 (HPA) 和垂直 Pod 自动扩展 (VPA)。VPA 涉及使用调整后的资源重新创建 Pod,从而限制其场景。HPA 更常用,它根据 CPU 使用率、请求速率或自定义指标等指标动态调整 Pod 计数。外部系统也可以通过向 kube-apiserver 发送请求来触发扩展。
9.当你执行 kubectl exec -it <pod> -- bash
时,你是否登录了 pod?
不可以,kubectl exec 需要指定一个容器(默认为单容器 Pod 中的唯一容器)。Pod 是隔离的 Linux 命名空间的集合。容器共享 Network、IPC 和 UTS 命名空间,而 PID 和 Mount 命名空间保持独立。kubectl exec -it <pod> -- bash
在目标容器的隔离环境中启动一个新的 bash 进程,但不“登录”到 Pod。
10.如果 Pod 中的容器反复退出和重启,您将如何排除故障?
如果容器反复崩溃,kubectl exec
将不起作用。相反,请检查节点和容器日志,检查 Pod 的状态,并使用 kubectl debug
启动临时容器来调查环境和依赖项。