kubernetes - traefik 入口不转发 tcp 消息
问题描述
我正在尝试将树莓派日志(物联网设备)聚合到在 EKS 中运行的 Logstash/ElasticSearch 中。
filebeat
已在 EKS 中运行以聚合容器日志。
这是我的清单文件
apiVersion: v1
kind: ConfigMap
metadata:
name: logstash-config
namespace: kube-logging
labels:
app: logstash
data:
logstash.conf: |-
input {
tcp {
port => 5000
type => syslog
}
}
filter {
grok {
match => {"message" => "%{SYSLOGLINE}"}
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "syslog-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
---
kind: Deployment
apiVersion: apps/v1beta1
metadata:
name: logstash
namespace: kube-logging
labels:
app: logstash
spec:
template:
metadata:
labels:
app: logstash
spec:
containers:
- name: logstash
image: docker.elastic.co/logstash/logstash:7.2.1
imagePullPolicy: Always
env:
- name: ELASTICSEARCH_HOST
value: elasticsearch
- name: ELASTICSEARCH_PORT
value: "9200"
- name: ELASTICSEARCH_USERNAME
value: elastic
- name: ELASTICSEARCH_PASSWORD
value: changeme
- name: ELASTIC_CLOUD_ID
value:
- name: ELASTIC_CLOUD_AUTH
value:
ports:
- name: logstash
containerPort: 5000
protocol: TCP
securityContext:
runAsUser: 0
resources:
limits:
memory: 800Mi
requests:
cpu: 100m
memory: 100Mi
volumeMounts:
- name: config
mountPath: /usr/share/logstash/pipeline/logstash.conf
readOnly: true
subPath: logstash.conf
volumes:
- name: config
configMap:
defaultMode: 0600
name: logstash-config
---
kind: Service
apiVersion: v1
metadata:
name: logstash
namespace: kube-logging
labels:
app: logstash
spec:
selector:
app: logstash
clusterIP: None
ports:
- name: tcp-port
protocol: TCP
port: 5000
targetPort: 5000
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: logstash-external
namespace: kube-logging
labels:
app: logstash
annotations:
kubernetes.io/ingress.class: traefik
traefik.ingress.kubernetes.io/frontend-entry-points: tcp
spec:
rules:
- host: logstash.dev.domain.com
http:
paths:
- backend:
serviceName: logstash
servicePort: 5000
能够发送测试消息:
echo -n "test message" | nc logstash.dev.domain.com 5000
但是tcpdump port 5000
在 logstash 容器中看不到任何东西。
如果我echo -n "test message" | nc logstash.dev.domain.com 5000
从 logstash 容器运行,那么我会tcpdump port 5000
在 logstash 容器上看到此消息。
在EKS
任何容器中,我都可以发送测试消息echo -n "test message 4" | nc -q 0 logstash 5000
,并将其接收logstash
并推送到ElasticSearch
.
但不是来自集群外部。所以看起来traefik
入口控制器是这里的问题。
我有traefik
EKS 的入口控制器。
traefik.toml: |
defaultEntryPoints = ["http","https"]
logLevel = "INFO"
[entryPoints]
[entryPoints.http]
address = ":80"
compress = true
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.http.whiteList]
sourceRange = ["0.0.0.0/0""]
[entryPoints.https]
address = ":443"
compress = true
[entryPoints.https.tls]
[entryPoints.https.whiteList]
sourceRange = ["0.0.0.0/0"]
[entryPoints.tcp]
address = ":5000"
compress = true
和服务:
kind: Service
apiVersion: v1
metadata:
name: ingress-external
namespace: kube-system
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
type: LoadBalancer
externalTrafficPolicy: Local
selector:
app: traefik-ingress-lb
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 443
- name: tcp-5000
protocol: TCP
port: 5000
targetPort: 5000
这里有什么问题?
解决方案
如果您以前没有使用过 logstash,那么您可能需要手动创建一个 logstash 索引。数据不会出现在 filebeat 下,因为 elasticsearch 不是从 filebeat 接收数据,而是从 logstash 本身接收数据。这个答案我可能完全错了。但是,如果你去:
设置>索引模式>创建索引模式然后继续输入logstash,它要求一个名称并从下面选择logstash,如下所示:
创建后,您应该会在 Discover 页面上看到一个显示 logstash 的下拉菜单。在 logstash 下拉菜单下,您应该看到您正在推送的所有数据
您可能已经设置了 logstash 索引,这可能根本不是问题
推荐阅读
- tensorflow - 获取卷积算法失败。这可能是因为 cuDNN 初始化失败,所以尝试查看是否有警告 [Op:Conv2D]
- cisco - 在 PE 上通过环回的 IBGP,仍然需要全网格吗?
- python - 从 Python 便利函数返回空字符串 "" 而不是 0x0
- python - Python:如何从另一个类调用一个类
- google-apps-script - 在其中一个工作表选项卡中执行排序时,Google 应用程序脚本 onchange(e) 触发器没有给我正确的活动工作表名称
- reactjs - 为 setState 通用类型设置打字稿
- javascript - 在非服务器 JS 文件(节点)中使用环境变量
- html - 使用引导程序进行 Flex 对齐
- android - 在更多模块项目中,我在 androd databingding 中有错误
- javascript - 开玩笑的单元测试“期望模拟函数最后被调用,但没有被调用”