本文章将以 QA 方式记录在使用 TKE 产品过程中的可能会遇到的常见问题解答,将不定期更新。
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 连接到相关组件,实际上组件状态是正常的,可以忽略此告警。
可能原因:检查是否安装了 Rancher 来管理集群,且做了 删除 Rancher 的 Namespace 操作。
TKE 普通节点 + 超级节点集群:以 TKE 集群文档注解为准。
TKE Serverless 集群(只有超级节点):以 TKE Serverless 集群文档注解为准。
$ 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
验证是否过期方式:
在apiserver 容器中执行命令:
curl --resolve apiserver-loopback-client:60002:127.0.0.1 -k -v https://apiserver-loopback-client:60002/healthz
解决办法: 重建下apiserver pod 触发重签逻辑。
可能原因: 分析集群中是否有多个 webhook 服务资源范围有重叠冲突导致(调用了非预期 webhook 被拒绝)。
可能原因:已有 CLB 实例和集群网络不在同一个 VPC 内,如果要跨VPC的话,需要使用云联网的 跨地域(跨VPC) 方案。
可能是 TKE 前端出于安全考虑,禁止用户通过 WEB 页面创建 CRD 资源, 如果需要创建,请通过 kubectl 或helm 客户端创建。
是的, 拉取chart 源的托管组件和用户集群网络不互通,只支持公网拉取。
可能原因: Nginx Ingress 组件在部署时选择了 Deployment + HPA 模式, 但是后续修改副本数方式为手动模式(会删除HPA),相关配置控制器会自动再创建 HPA 资源使用HPA模式导致。
解决方式:推荐通过修改HPA 扩缩容范围解决,即不影响 HPA 还能达到快速扩缩容需求。
查看创建的相关资源列表的【事件列表】 事件信息(1小时内,超过1个小时的事件查看需要开启 集群事件持久化),通过事件报错信息检查调度不了原因。
1. 解析本机 IP 获取:hostname -i
2. 通过 Downward 传环境变量:
env:
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
原因: kubelet 本身事件的限速,超过 25 条事件就会被限制成每 5 分钟两条
参考注解文档:Annotation 说明。
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# 先做判断有没有,没有再加
问题现象: 通过curl -v 127.0.0.1/xxx/xxx 请求没有问题,但是配置如下健康检查一直报refused
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 等。
事件报错信息:“Code=AuthFailure.UnauthorizedOperation, Message=CAM签名/鉴权错误: 请求未CAM授权”。
解决办法:给TKE_QCSRole
这个角色授予预设策略 QcloudAccessForTKERoleInCreatingCFSStorageclass 解决。
可以使用,但是还是建议使用Statefullset 多副本或者直接使用共享存储, 因为Deployment 类型工作负载一般会滚动更新,在滚动更新过程中,可能存在新本 Pod 已经创建,但是旧版本Pod 还没有销毁,导致新Pod 无法正常挂载 PVC(PVC 还被旧Pod 挂载)的情况。
解决办法:修改存储类的“卷绑定模式”为“等待调度”(WaitForFirstCustomer) ,控制台配置参考:创建 StorageClass。
可能原因:容器写入层可能挂载的是 emptyDir 卷, 只重启容器是无法释放的,只能重建 Pod 清理。
先查看 容器镜像服务常见问题 。
通过拉取超时日志查看解析的ip 是否正确,例如使用 TCR 且使用公网拉取,请确保拉取客户端 ip 在 TCR 公网访问百名单中。
私有仓库镜像拉取需要配置 内网免密拉取 或给工作负载配置拉取密钥 ,拉取密钥生成参考 TCR 镜像仓库 自动创建镜像密钥下发配置。
原始报错:"x509: certificate signed by unknown authority"
解决办法:超级节点可通过注解配置忽略证书校验。
查看请求解析容器的 /etc/resolv.conf 配置信息,确保配置无误。
1. 解析集群内域名超时/失败
2. 解析集群外域名超时/失败
查看 coredns 配置文件中的 forward 配置项是转发到具体上游 dns ,还是coredns 容器所在节点的 /etc/resolv.conf 文件中的上游,按照具体情况测试相关dns 上游是否可以正常解析。
推荐使用 Private DNS 配置解析,维护方便,配置方式类似:使用 Private DNS 实现内网访问集群时的自动域名解析。
可能原因:普通节点上pod (VPC-CNI 网络模式网卡)绑定默认安全组,默认安全组本身无规则是可以通的。
但调度在超级节点上后 pod 使用的是给超级节点绑定的安全组,该安全组可能没有放开公网访问
解决办法:开启公网 clb 默认后端放通功能,参考:开启后端默认放通。
可能原因:ingress nginx 需要显式将证书hosts 下域名和rules里的 host 对应,否则不生效。参考:Ingress 证书配置 。
这个需求有两种方式可以实现:
1. 如果使用TKE clb 类型 ingress ,一个ingress只能对应一个clb(但是一个ingress中可以配置多个host), 如果想多个ingress 绑定到同一个clb, 可以使用clb类型service 并开启 clb复用 (要注意每个service之间配置的端口不要冲突),通过四层clb协议扩展的方式监听7层,参考:Service协议扩展配置。
2. 直接安装一个 Nginx ingress 组件,使用ingress-nginx社区的能力。
两种方式相比较第二种配置比较简单易懂,比较推荐。
文档参考:https://github.com/kubernetes/ingress-nginx/tree/main/docs/examples/customization/custom-headers
关闭默认308注解:nginx.ingress.kubernetes.io/ssl-redirect: "false" 参考文档:TLS/HTTPS - Ingress-Nginx Controller
原因:Nginx controller 到证书 ca 被更新,与 admission中配置的 证书 Bundle 不匹配。
解决办法: 删除旧的 admission 更新下新的证书 Bundle,参考:issues 。
原因:可能是组件相关 pod 没有 ready 导致, 可以通过查看 kube-system(一般情况下)命名空间下的组件 Pod 状态。
例如目录结构为:/a/xx.log /a/folder1/yy.log /a/folder2/zz.log
,配置日志采集规则:logPath:/a,filePattern: *.log
,即可采集到,*.log 文件匹配式默认可以递归收集子目录下的日志。
检查是否缺少TKE_QCSLinkedRoleInEKSLog
角色权限,点一下 这个链接 可进入到该权限授权管理界面同意授权,参考文档:首次授权。
注意: 点击授权前的 Pods 需要重建后生效。
解决办法:formatType: 改成 fluent-bit 格式,会有个hostIp 字段就是 pod ip
相关文档参考:容器服务 使用 CRD 配置日志采集-TKE 标准集群指南-文档中心-腾讯云
超级节点 Pod rootfs(底层系统盘) 监控指标相关计算如下:
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空间总量
原因:相关组件 pod 因为是 hostNetwork 网络,所以 Pod 监控显示的是节点网络流量,并不是组件 Pod 真实流量大小。
可能原因: 1.在容器中请求目的端为所在 pod 导致(产品限制),需要在该 pod 之外的客户端才能访问。 2. 目的 Pod 安全组策略未放通。
“APIService "v1beta1.custom.metrics.k8s.io"in namespace "" exists and cannot be imported into the current release“ tke 的基础监控使用了,一般用于磁盘、网络等指标(非cpu、内存)的hpa, 如果要使用自建的话,建议先备份一下,删掉后再部署。
备份: kubectl get apiservice v1beta1.custom.metrics.k8s.io -o yaml > backup.yaml
删除:kubectl delete apiservice v1beta1.custom.metrics.k8s.io
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。