【发布时间】:2020-11-30 21:50:52
【问题描述】:
我刚刚开始在 Azure Linux VM 上实施 Kubernetes 集群。我对这一切都很陌生。集群在一个小型 VM(2 核,16GB)上运行。我使用他们的在线教程设置了 ECK 堆栈,并使用 Nginx Ingress 控制器来公开它。
一天中的大部分时间,一切都运行良好。我可以访问 Kibana 仪表板,运行 Elastic 查询,Nginx 正在工作。但大约每天都会发生一次,导致匹配 Kibana 服务的 Kibana Endpoint 没有任何 IP 地址。因此,服务无法正确路由到容器。发生这种情况时,Kibana pod 的状态为 Running,但表示 0/1 正在运行。它永远不会触发任何重新启动,因此,Kibana 仪表板变得无法访问。我尝试通过关闭 Docker 容器、强制终止 pod 来重现此问题,但无法可靠地重现它。
查看 Kibana pod 上的日志,由于超时,出现一堆错误。 Nginx 日志说它找不到服务的端点。看起来这可能是source。有没有人遇到过这个?有谁知道防止这种情况的可靠方法?
这可能应该是一个单独的问题,但这导致的另一个问题是完全阻止所有 Nginx Ingress。日志中看不到任何新请求,并且在有关未找到端点的消息之后日志完全停止。结果,通常由 Ingress 负责的所有 URL 都会超时,整个集群在外部变得不可用。这可以通过删除 Nginx 控制器 pod 来解决,但 pod 不会自行重启。有人可以解释为什么这样的问题会完全阻止 Nginx 吗?以及为什么 Nginx pod 检测不到这一点并重启?
编辑:
Nginx 日志以此结尾:
W1126 16:20:31.517113 6 controller.go:950] Service "default/gwam-kb-http" does not have any active Endpoint.
W1126 16:20:34.848942 6 controller.go:950] Service "default/gwam-kb-http" does not have any active Endpoint.
W1126 16:21:52.555873 6 controller.go:950] Service "default/gwam-kb-http" does not have any active Endpoint.
任何进一步的请求都会超时并且不会出现在日志中。
我没有 kibana pod 的日志,但它们只是 kibana 服务default/gwam-kb-http 的一致超时(与上面的 Nginx 日志相同)。这导致就绪探测失败,并显示0/1 Running,但没有触发 Pod 的重启。
一切正常时的 Kibana Endpoints
Name: gwam-kb-http
Namespace: default
Labels: common.k8s.elastic.co/type=kibana
kibana.k8s.elastic.co/name=gwam
Annotations: endpoints.kubernetes.io/last-change-trigger-time: 2020-11-26T16:27:20Z
Subsets:
Addresses: 10.244.0.6
NotReadyAddresses: <none>
Ports:
Name Port Protocol
---- ---- --------
https 5601 TCP
Events: <none>
遇到这个问题,Addresses为空,pod IP在NotReadyAddresses下
我正在使用 ECK 设置教程中非常基本的 YAML:
弹性(这里没有问题)
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: gwam
spec:
version: 7.10.0
nodeSets:
- name: default
count: 3
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: elasticsearch
Kibana:
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: gwam
spec:
version: 7.10.0
count: 1
elasticsearchRef:
name: gwam
Kibana 服务的入口:
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: nginx-ingress-secure-backend-no-rewrite
annotations:
kubernetes.io/ingress.class: nginx
nginx.org/proxy-connect-timeout: "30s"
nginx.org/proxy-read-timeout: "20s"
nginx.org/proxy-send-timeout: "60s"
nginx.org/client-max-body-size: "4m"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
tls:
- hosts:
- <internal company site>
secretName: gwam-tls-secret
rules:
- host: <internal company site>
http:
paths:
- path: /
backend:
serviceName: gwam-kb-http
servicePort: 5601
更多环境细节:
Kubernetes 版本:1.19.3
操作系统:Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-1031-azure x86_64)
编辑 2:
似乎我在这里遇到了某种网络错误。我的所有 pod 都不能为 kubernetes.default 进行 dnslookup。所有网络 pod 都在运行,但在将日志添加到 CoreDNS 后,我看到以下内容:
[ERROR] plugin/errors: 2 1699910358767628111.9001703618875455268. HINFO: read udp 10.244.0.69:35222->10.234.44.20:53: i/o timeout
我正在为我的网络使用 Flannel。考虑尝试重置并切换到 Calico 并按照一些答案的建议增加 nf_conntrack_max。
【问题讨论】:
-
请添加您收到的 YAML 清单、日志和错误。请详细说明您的环境。
-
更换 Calico 是否解决了您的问题?
kubectl get events有什么有趣的事情吗?有没有配置防火墙?您是否尝试手动重启此 pod?
标签: elasticsearch kubernetes kibana nginx-ingress