Kubernetes中Graylog日志发送失败及Ingress暴露NodePort问题排查
解决Graylog无法通过HTTPS域名发送GELF UDP日志的问题
问题根源
你遇到的核心问题是Nginx Ingress Controller默认不支持UDP协议,而你当前的Ingress配置试图在HTTP规则里添加UDP端口,这完全无效——Ingress资源本身仅用于处理HTTP/HTTPS流量,UDP需要单独的配置流程。
具体解决方案
要通过域名发送GELF UDP日志,你需要为Nginx Ingress Controller配置UDP转发,步骤如下:
1. 创建UDP转发配置的ConfigMap
这个配置会告诉Ingress Controller,把外部的UDP端口12201转发到Graylog服务的UDP端口:
apiVersion: v1 kind: ConfigMap metadata: name: nginx-ingress-udp namespace: kube-system # 注意:要和Ingress Controller所在命名空间一致 data: 12201: "default/logs-graylog:12201" # 格式:外部端口:服务所在命名空间/服务名:服务内部UDP端口
2. 更新Ingress Controller的运行参数
确保Ingress Controller加载上面的UDP配置:
- 如果是手动部署的Ingress Controller,需要在容器启动参数中添加:
--udp-configmap=kube-system/nginx-ingress-udp - 如果是通过Helm安装的,可在values.yaml中设置:
controller: config: udp: 12201: "default/logs-graylog:12201"
3. 暴露Ingress Controller的UDP端口
更新Ingress Controller的Service,添加UDP端口转发:
apiVersion: v1 kind: Service metadata: name: nginx-ingress-controller namespace: kube-system spec: ports: # 保留原有的TCP端口配置 - name: http port: 80 protocol: TCP targetPort: 80 - name: https port: 443 protocol: TCP targetPort: 443 # 添加UDP端口 - name: udp-graylog-gelf port: 12201 protocol: UDP targetPort: 12201 type: LoadBalancer # 或根据你的集群环境用NodePort
4. 修正无效的Ingress配置
删除Ingress中多余的UDP/TCP路径——Ingress只负责Web界面的HTTPS转发:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: logs-graylog-ingress annotations: kubernetes.io/ingress.class: nginx certmanager.k8s.io/cluster-issuer: graylog nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: tls: - hosts: - logs.example.io secretName: graylog rules: - host: logs.example.io http: paths: - backend: serviceName: logs-graylog servicePort: 80
验证与使用
配置完成后:
- Web界面依然通过
https://logs.example.io访问 - GELF UDP日志需要发送到
logs.example.io:12201(确保域名解析指向Ingress Controller的外部IP/节点IP) - 确认Graylog已创建监听12201端口的GELF UDP输入
内容的提问来源于stack exchange,提问作者Harsh Manvar
相关产品推荐
相关产品推荐

