【TKE】 平台常见问题 QA

2024-05-09 17:28:46 浏览数 (2)

本文章将以 QA 方式记录在使用 TKE 产品过程中的可能会遇到的常见问题解答,将不定期更新

集群相关问题

通过 kubectl get componentstatuses 查看 controller-manager和scheduler状态有问题?

代码语言:javascript复制
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused

原因:主要是因为托管集群部署架构导致不能通过127.0.0.1 连接到相关组件,实际上组件状态是正常的,可以忽略此告警。

TKE 集群节点突然被全部删除?

可能原因:检查是否安装了 Rancher 来管理集群,且做了 删除 Rancher 的 Namespace 操作。

TKE 普通节点和超级节点 Pod 同功能注解以那个为准?

TKE 普通节点 超级节点集群:以 TKE 集群文档注解为准。

TKE Serverless 集群(只有超级节点):以 TKE Serverless 集群文档注解为准。

在 TKE 节点尝试查看集群报错

代码语言:javascript复制
$ kubectl get node
error: You must be logged in to the server (Unauthorized)

原因:节点临时凭证 12 小时后过期导致,参考:下发节点 kubeconfig 文件的说明。

代金券余额还有的情况下,创建集群报余额不足

初始化集群时报错“Insufficient account balance”

原因:创建(购买)集群需要冻结一小时费用,需要您的账户本身要有1小时的费用,但是真正消费会走代金劵的。

操作集群资源报证书过期

报错日志:type: 'Warning' reason: 'FailedCreate' Error creating: pods "xxxx" is forbidden: Get "https://localhost:60002/api/v1/namespaces/xxx/limitranges": x509: certificate has expired or is not yet valid: current time 2023-06-06T15:25:30 08:00 is after 2023-03-10T05:10:20Z

原因:Apiserver 有个 loopbackclient server cert ,是在每次启动的时候签的,但有效期只有一年,Apiserver 超过一年没重启就会过期,相关issue: https://github.com/kubernetes/kubernetes/issues/86552

验证是否过期方式:

代码语言:javascript复制
在apiserver 容器中执行命令:
curl --resolve apiserver-loopback-client:60002:127.0.0.1 -k -v https://apiserver-loopback-client:60002/healthz

解决办法: 重建下apiserver pod 触发重签逻辑。

资源操作相关问题

创建的 Workloads/ Service/Ingress 等资源一直“转圈”是什么原因?

  1. 查看创建的相关资源列表的【事件列表】 事件信息(1小时内,超过1个小时的事件查看需要开启 集群事件持久化),通过事件报错信息检查配置。
  2. 无相关事件信息显示但是还是转圈? 工作负载如果是 LB 类型 svc 暴露,确保 LB 对于后端 RS pods 健康检查(lb 直连pod 模式)是否健康, 不健康的原因一般是 安全组未放通,或svc 端口映射与实际容器暴露服务不符。

Ingress 资源编辑时报 webhook 拒绝但是相关 webhook 服务并没有报错日志

可能原因: 分析集群中是否有多个 webhook 服务资源范围有重叠冲突导致(调用了非预期 webhook 被拒绝)。

GR 网络模式开启 已有CLB 实例直连 Pod 模式 Service 显示 Pending

可能原因:已有 CLB 实例和集群网络不在同一个 VPC 内,如果要跨VPC的话,需要使用云联网的 跨地域(跨VPC) 方案。

TKE 控制台无法通过 YAML 创建 CRD 资源?

可能是 TKE 前端出于安全考虑,禁止用户通过 WEB 页面创建 CRD 资源, 如果需要创建,请通过 kubectl 或helm 客户端创建。

应用商店自定义第三方 Chart 源的地址必须要公网能访问是吗?

是的, 拉取chart 源的托管组件和用户集群网络不互通,只支持公网拉取。

Nginx ingress 组件工作负载异常扩缩容

可能原因: Nginx Ingress 组件在部署时选择了 Deployment HPA 模式, 但是后续修改副本数方式为手动模式(会删除HPA),相关配置控制器会自动再创建 HPA 资源使用HPA模式导致。

解决方式:推荐通过修改HPA 扩缩容范围解决,即不影响 HPA 还能达到快速扩缩容需求。

工作负载/Pods 相关问题

Pod 调度相关问题

查看创建的相关资源列表的【事件列表】 事件信息(1小时内,超过1个小时的事件查看需要开启 集群事件持久化),通过事件报错信息检查调度不了原因。

Pod 中容器重启原因

  1. 查看事件信息(1小时内,超过1个小时的事件查看需要开启 集群事件持久化)。
  2. Describe Pod 查看相关容器退出状态码, 例如状态码为 137 ,一般是收到 kill -9 信号导致,可能是容器本身 OOM ,K8S 重新调度Pod 等,若为其他退出码,可能是容器主进程(业务)退出,需要排查容器业务进程和日志,详情参考:通过 Exit Code 定位 Pod 异常退出原因。

工作负载 Pod 起不来是什么原因?

  1. 查看事件信息(1小时内,超过1个小时的事件查看需要开启 集群事件持久化 查看)。
  2. Pod 为 “CrashLoopBackOff” 状态时, 一般是因为容器业务程序启动异常,可以通过查看业务启动日志或修改容器启动命令为“sleep” 调试容器下,手动执行业务启动命令查看报错。

如何在容器中获取 Pod ip ?

1. 解析本机 IP 获取:hostname -i 2. 通过 Downward 传环境变量:

代码语言:javascript复制
env:
- name: MY_POD_IP
  valueFrom:
    fieldRef:
      fieldPath: status.podIP

为什么 会有 pod 事件不全的情况?

原因: kubelet 本身事件的限速,超过 25 条事件就会被限制成每 5 分钟两条

超级节点 pod 都有哪些注解增强功能?

参考注解文档:Annotation 说明。

给超级节点pod 底层cvm配置hosts

代码语言:javascript复制
apiVersion: v1
data:
  pod.annotations: |
    internal.eks.tke.cloud.tencent.com/init-script:  grep "xxx.xxx.com" /etc/hosts || "echo "127.0.0.1 xxx.xxx.com" >> /etc/hosts && echo "127.0.0.1 xxx.xxx.com" >> /etc/hosts"
kind: ConfigMap
metadata:
  name: eks-config
  namespace: kube-system
  
 # grep "xxxx" /etc/hosts || echo  "xxxx" >> /etc/hosts# 先做判断有没有,没有再加

Pod健康检查一直 Refused

问题现象: 通过curl -v 127.0.0.1/xxx/xxx 请求没有问题,但是配置如下健康检查一直报refused

代码语言:javascript复制
    readinessProbe:
      failureThreshold: 3
      httpGet:
        host: 127.0.0.1
        path: /xxx/xxx
        port: 9035
        scheme: HTTP
      initialDelaySeconds: 180
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 1

原因:  大多数情况下,不需要设置 host 字段。 这里有个需要设置 host 字段的场景,假设容器监听 127.0.0.1,并且 Pod 的 hostNetwork 字段设置为了 true

解决办法:不写host(默认pod ip) 解决。

磁盘存储相关问题

部署工作负载时该选择什么类型存储?

有状态服务(StatefullSet)一般为块存储 (CBS), 无状态服务(Deployment, DaemonSet)一般使用共享存储,如 NFS, COS 等。

创建了一个 CFS 的 StorageClass 并选择了 CFS 实例,但在创建 PVC 的时候没有自动创建 PV

事件报错信息:“Code=AuthFailure.UnauthorizedOperation, Message=CAM签名/鉴权错误: 请求未CAM授权”。

解决办法:给TKE_QCSRole这个角色授予预设策略 QcloudAccessForTKERoleInCreatingCFSStorageclass 解决。

单副本的 Deployment 类型服务可以使用块存储吗?

可以使用,但是还是建议使用Statefullset 多副本或者直接使用共享存储, 因为Deployment 类型工作负载一般会滚动更新,在滚动更新过程中,可能存在新本 Pod 已经创建,但是旧版本Pod 还没有销毁,导致新Pod 无法正常挂载 PVC(PVC 还被旧Pod 挂载)的情况。

CBS 存储类申请的 PV 和调度的Pod 不在同一个可用区导致 PVC 无法正常挂载问题

解决办法:修改存储类的“卷绑定模式”为“等待调度”(WaitForFirstCustomer) ,控制台配置参考:创建 StorageClass。

超级节点配置 pod 磁盘回收策略(重启容器)不生效?

可能原因:容器写入层可能挂载的是 emptyDir 卷, 只重启容器是无法释放的,只能重建 Pod 清理。

容器镜像相关问题

先查看 容器镜像服务常见问题 。

TCR 镜像拉取超时

通过拉取超时日志查看解析的ip 是否正确,例如使用 TCR 且使用公网拉取,请确保拉取客户端 ip 在 TCR 公网访问百名单中。

TCR 镜像拉取没有权限

私有仓库镜像拉取需要配置 内网免密拉取 或给工作负载配置拉取密钥 ,拉取密钥生成参考 TCR 镜像仓库 自动创建镜像密钥下发配置。

超级节点拉取私有仓库报未知机构证书错误

原始报错:"x509: certificate signed by unknown authority"

解决办法:超级节点可通过注解配置忽略证书校验。

网络访问相关问题

容器网络访问超时问题

  1. 梳理网络访问链路,首先查看安全组策略
  2. 梳理网络访问链路,在关键链路处抓包排查。

DNS 解析超时/失败问题

查看请求解析容器的 /etc/resolv.conf 配置信息,确保配置无误。

1. 解析集群内域名超时/失败

  • 确认需要解析的集群内域名资源是否存在,解析域名为“短域名”(如svc 名)时注意 search 域配置, 检查 FQDN 完整后缀是否可正常解析。
  • 在 "StatefullSet Headless svc" 场景下,如需要解析 $(podname).$(service name).$(namespace).svc.cluster.local 时,需要注意 StatefullSet 资源中 serviceName 和 $(service name) 保持一致。

2. 解析集群外域名超时/失败

查看 coredns 配置文件中的 forward 配置项是转发到具体上游 dns ,还是coredns 容器所在节点的 /etc/resolv.conf 文件中的上游,按照具体情况测试相关dns 上游是否可以正常解析。

如何配置集群内自定义域名解析

推荐使用 Private DNS 配置解析,维护方便,配置方式类似:使用 Private DNS 实现内网访问集群时的自动域名解析。

公网CLB暴露的服务将后端Pod调度到超级节点后访问不通

可能原因:普通节点上pod (VPC-CNI 网络模式网卡)绑定默认安全组,默认安全组本身无规则是可以通的。

但调度在超级节点上后 pod 使用的是给超级节点绑定的安全组,该安全组可能没有放开公网访问

解决办法:开启公网 clb 默认后端放通功能,参考:开启后端默认放通。

Ingress Nginx 配置可信任证书后依然显示不安全

可能原因:ingress nginx 需要显式将证书hosts 下域名和rules里的 host 对应,否则不生效。参考:Ingress 证书配置 。

多个ingress绑定不同的域名到同一个clb 方案

这个需求有两种方式可以实现:

1. 如果使用TKE clb 类型 ingress ,一个ingress只能对应一个clb(但是一个ingress中可以配置多个host), 如果想多个ingress 绑定到同一个clb, 可以使用clb类型service 并开启 clb复用 (要注意每个service之间配置的端口不要冲突),通过四层clb协议扩展的方式监听7层,参考:Service协议扩展配置。

2. 直接安装一个 Nginx ingress 组件,使用ingress-nginx社区的能力。

两种方式相比较第二种配置比较简单易懂,比较推荐。

Ingress-nginx 添加或设置header

文档参考:https://github.com/kubernetes/ingress-nginx/tree/main/docs/examples/customization/custom-headers

http请求被308 到https(ingress-nginx)

关闭默认308注解:nginx.ingress.kubernetes.io/ssl-redirect: "false" 参考文档:TLS/HTTPS - Ingress-Nginx Controller

Ingress-nginx 下 ingress 资源更新报错:x509: certificate signed by unknown authority

原因:Nginx controller 到证书 ca 被更新,与 admission中配置的 证书 Bundle 不匹配。

解决办法: 删除旧的 admission 更新下新的证书 Bundle,参考:issues 。

增强组件相关问题

安装了 TKE 增强组件为什么功能不生效?

原因:可能是组件相关 pod 没有 ready 导致, 可以通过查看 kube-system(一般情况下)命名空间下的组件 Pod 状态。

日志收集相关问题

如何递归采集子目录中的日志文件?

例如目录结构为:/a/xx.log /a/folder1/yy.log /a/folder2/zz.log,配置日志采集规则:logPath:/a,filePattern: *.log,即可采集到,*.log 文件匹配式默认可以递归收集子目录下的日志。

TKE 集群Pod 调度到超级节点后日志收集失效?

检查是否缺少TKE_QCSLinkedRoleInEKSLog 角色权限,点一下 这个链接 可进入到该权限授权管理界面同意授权,参考文档:首次授权。

注意: 点击授权前的 Pods 需要重建后生效。

日志收集输出pod ip 字段信息。

解决办法:formatType: 改成 fluent-bit 格式,会有个hostIp 字段就是 pod ip

相关文档参考:容器服务 使用 CRD 配置日志采集-TKE 标准集群指南-文档中心-腾讯云

监控告警相关问题

超级节点 Pod rootfs(底层系统盘默认 20G)使用如何监控?

超级节点 Pod rootfs(底层系统盘) 监控指标相关计算如下:

代码语言:javascript复制
rootfs空间总量 =  sum(pod_filesystem_size_bytes{device="/dev/root"} )
rootfs空间使用量 = sum(pod_filesystem_size_bytes{device="/dev/root"} ) -sum(pod_filesystem_free_bytes{device="/dev/root"})
rootfs空间使用率 = rootfs空间使用量 * 100.0 / rootfs空间总量

kube-system 下的一些组件 Pod 的网络流量监控为什么显示很大?

原因:相关组件 pod 因为是 hostNetwork 网络,所以 Pod 监控显示的是节点网络流量,并不是组件 Pod 真实流量大小。

超级节点 Pod 通过 9100 端口获取metrics 数据超时请求不到?

可能原因: 1.在容器中请求目的端为所在 pod 导致(产品限制),需要在该 pod 之外的客户端才能访问。 2. 目的 Pod 安全组策略未放通。

自建 custom metrics 服务报错

“APIService "v1beta1.custom.metrics.k8s.io"in namespace "" exists and cannot be imported into the current release“ tke 的基础监控使用了,一般用于磁盘、网络等指标(非cpu、内存)的hpa, 如果要使用自建的话,建议先备份一下,删掉后再部署。

代码语言:javascript复制
备份: kubectl get apiservice  v1beta1.custom.metrics.k8s.io -o yaml > backup.yaml
删除:kubectl delete apiservice v1beta1.custom.metrics.k8s.io

0 人点赞