本文汇总了弹性容器服务 EKS 的集群常见问题,介绍集群相关常见问题的出现原因及解决办法。
在分配 Pod 资源量时,EKS 需要对工作负载设置的 Request 及 Limit 进行计算,自动判断 Pod 运行所需的资源量,并非按照设置的 Request 及 Limit 值进行资源分配。详情请参见 CPU Pod 规格计算方法 及 GPU Pod 规格计算方法,进一步了解如何通过 Request、Limit 自动计算指定资源规格。
在创建集群时,需要选择一个 VPC 网络作为集群网络,同时指定一个子网作为容器网络,详情请参见 容器网络说明。弹性集群 EKS 的 Pod 会直接占用容器网络子网 IP。在使用集群过程中,如需新增或修改容器网络,需要通过新增/移出虚拟节点的操作来实现,具体操作请参考以下步骤。
移出虚拟节点后必须保证弹性集群至少存在一个虚拟节点,即若此时只存在一个虚拟节点,则无法执行移出操作。
移出虚拟节点之前,需要将此虚拟节点上的 Pod 全部驱逐到其他虚拟节点上(不包含 DaemonSet 管理的 Pod),完成驱逐后才可执行移出操作,否则会导致移出节点失败。具体操作请参考以下步骤。
驱逐后,该虚拟节点的状态会变更为“已封锁”,将不再向该节点上调度 Pod。驱逐会导致 Pod 重建,请谨慎操作。
当 Pod 因容器网络的子网 IP 耗尽而发生调度失败时,会在节点日志中观察到如下图所示两种事件:
您可通过 容器服务控制台 或在命令行执行以下命令查询虚拟节点的 YAML。
kubectl get nodes -oyaml
返回结果如下所示:
spec:
taints:
- effect: NoSchedule
key: node.kubernetes.io/network-unavailable
timeAdded: "2021-04-20T07:00:16Z"
- lastHeartbeatTime: "2021-04-20T07:55:28Z"
lastTransitionTime: "2021-04-20T07:00:16Z"
message: eklet node has insufficient IP available of subnet subnet-bok73g4c
reason: EKLetHasInsufficientSubnetIP
status: "True"
type: NetworkUnavailable
说明此时 Pod 是因容器网络的子网 IP 耗尽而发生调度失败。发生以上情况时,需要新建虚拟节点去新增子网,以此扩展集群 Pod 可用网段,新建虚拟节点的操作请参见 新建虚拟节点。
在创建弹性集群 Pod 时,若未指定安全组,则默认使用 default 安全组,您也可以通过 Annotation eks.tke.cloud.tencent.com/security-group-id : 安全组 ID
为 Pod 指定安全组,请确保同地域已存在该安全组 ID。关于此 Annotation 的详细说明请参加 Annotation 说明。
Kubernetes 可以通过 terminationMessagePath 设置容器退出的消息来源,即当容器退出时,Kubernetes 将从容器的 terminationMessagePath 字段中指定的终止消息文件中检索终止消息,并使用此内容来填充容器的终止消息,消息默认值为:/dev/termination-log
。
此外,您还可以设置容器的 terminationMessagePolicy 字段,进一步自定义容器终止消息。该字段默认值为 File
,即仅从终止消息文件中检索终止消息。您可以根据需求设置为 FallbackToLogsOnError,即在容器因错误退出时,如果终止消息文件为空,则使用容器日志输出的最后一部分内容来作为终止消息。
代码示例如下:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
resources:
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 250m
memory: 256Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: FallbackToLogsOnError
通过以上配置,当容器错误退出且消息文件为空时,Get Pod 会发现 stderr 的输出显示在 containerStatuses 中。
在使用弹性集群时需要注意以下事项:
弹性集群虽然没有节点,但兼容 Hostpath、Hostnetwork: true、DnsPolicy: ClusterFirstWithHostNet 等与 Host 相关的参数。
不过使用时请注意,因为没有节点,这些参数提供能力并不能完全与标准 k8s 对齐。
例如,期望使用 Hostpath 共享数据,但调度到同一个虚拟节点上的两个 Pod 查看到的是不同子机的 Hostpath,而且 Pod 重建后, Hostpath 的文件也将同时删除。
在弹性集群中,支持使用腾讯云 文件存储 CFS,也支持使用自建的文件存储 NFS 以 Volume 的形式挂载到 Pod 上,以实现持久化的数据存储。Pod 挂载 CFS/NFS 的 YAML 示例如下:
关于 Pod 挂载 Volume 的详细操作,请参见 存储卷的使用说明。
EKS 支持缓存容器镜像以便在下次用同样镜像启动容器时加快启动速度。
复用条件:
eks.tke.cloud.tencent.com/cbs-reuse-key
同一个用户账号下,有同一个 annotation value 的 Pod,缓存时间内会尽量复用启动镜像,建议 annntation value 填写镜像名:**eks.tke.cloud.tencent.com/cbs-reuse-key: "image-name"**。
缓存时间: 6小时。
当启用复用镜像功能时,当创建 Pod 时,$kubectl describe pod
可能见到如下错误:
no space left on device: unknown
Warning FreeDiskSpaceFailed 26m eklet, eklet-subnet-xxx failed to garbage collect required amount of images. Wanted to free 4220828057 bytes, but freed 3889267064 bytes
恢复方法:
无需任何操作,等待若干分钟后 Pod 会自动 running。
原因:
no space left on device: unknown
Warning FreeDiskSpaceFailed 26m eklet, eklet-subnet-xxx failed to garbage collect required amount of images. Wanted to free 4220828057 bytes, but freed 3889267064 bytes
如果您使用自建的 nfs 实现持久化存储时,连接时事件报 Operation not permitted。您需要修改自建 nfs 的 /etc/exports 文件,添加 /<path><ip-range>(rw,insecure) 参数,示例如下:
/data/ 10.0.0.0/16(rw,insecure)
EKS 的 Pod 默认免费提供 20G 可用的系统盘空间,若系统盘空间满了,可以通过如下方式进行处理。
如果使用空间达到 80%,EKS 后台会触发容器镜像的回收流程,尝试回收未使用的容器镜像来释放磁盘空间。如果未能释放任何空间,则会有一条事件提醒:ImageGCFailed: failed to garbage collect required amount of images, 提醒用户磁盘空间不足。
常见磁盘空间不足的原因有:
如果业务希望调整容器镜像回收的阈值,可以设置如下 annotation:
eks.tke.cloud.tencent.com/image-gc-high-threshold: "80"
如果业务原地升级过,或者容器异常退出过,已退出的容器仍会保留,直到磁盘空间达到 85% 时才会清理已退出的容器。清理阈值可以使用如下 annotation 调整:
eks.tke.cloud.tencent.com/container-gc-threshold: "85"
如果已退出的容器不想被自动清理(例如需要退出的信息进一步排障的),可以通过如下 annotation 关闭容器的自动清理,但副作用是磁盘空间无法自动释放:
eks.tke.cloud.tencent.com/must-keep-last-container: "true"
说明:此特性上线时间为 2021-09-15,故在此时间前创建的 pod,并未带有此特性。
业务需要在容器的系统盘用量超过某个百分比后直接重启 Pod,可以通过 annotation 配置:
eks.tke.cloud.tencent.com/pod-eviction-threshold: "85"
只重启 Pod,不会重建子机,退出和启动都会进行正常的 gracestop、prestop、健康检查。
说明:此特性上线时间在 2022-04-27,故在此时间前创建的 pod,需要重建 pod 来开启特性。
EKS 的 pod 默认会通过 9100 端口对外暴露监控数据,用户可以执行以下命令访问 9100/metrics 获取数据:
获取全部指标:
curl -g "http://<pod-ip>:9100/metrics"
大集群建议去掉 ipvs 指标:
curl -g "http://<pod-ip>:9100/metrics?collect[]=ipvs"
如果业务本身需要监听 9100 端口,则可以在创建 pod 时,通过使用 9100 之外的端口来收集监控数据,避免跟业务的 9100 端口冲突。配置方式如下:
eks.tke.cloud.tencent.com/metrics-port: "9110"
如果没有变更监控暴露的端口,业务直接监听 9100 端口,则在 EKS 新的网络方案里,将报错提醒用户 9100 端口已经被使用:
listen() to 0.0.0.0:9100, backlog 511 failed (1: Operation not permitted)
出现报错提醒时,需要为 pod 添加一个 annotation:metrics-port
,以变更监控端口,再重建 pod。
注意:如果 pod 带有公网 eip,则需要设置安全组,注意 9100 端口问题,并放通需要的端口。
本页内容是否解决了您的问题?