Thank you for reading this post, don't forget to subscribe!
Есть задача запустить в кластере kubernetes - logstash.
filebeat отправляют логи с множества серверов
logstash (он в кубере) фильтрует входящие логи и отправляет их в elasticsearch (отдельные сервера)
Наши действия:
git clone https://github.com/elastic/helm-charts.git
cd helm-charts/
git checkout 7.9
Копируем оттуда только logstash и правим valuses.yaml
Так как конфиги мы будем подкидывать сами то комментируем всё что относится к
logstashConfig и logstashPipeline
Добавляем секреты:
1 2 3 4 5 6 7 |
secretMounts: - name: logstash-configs secretName: logstash-configs path: /usr/share/logstash/config/ - name: logstash-configs-sample secretName: logstash-sample-config path: /usr/share/logstash/pipeline/ |
Проверяем что раздел service имеет вид:
1 2 3 4 5 6 7 8 |
service: annotations: {} type: ClusterIP ports: - name: beats port: 5044 protocol: TCP targetPort: 5044 |
Создаём секреты:
1. создаём секрет который будет добавляться в pipline
kubectl create secret generic logstash-sample-config -n НАШname_space --from-file=config/logstash-sample.conf
2.создаём секрет который будет добавляться в config, там много наших конфиг файлов поэтому команда такая большая:
kubectl create secret generic logstash-configs -n НАШname_space --from-file=config/jvm.options --from-file=config/log4j2.properties --from-file=config/logstash-sample.conf --from-file=config/logstash.yml --from-file=config/pipelines.yml --from-file=config/startup.options
Всё можно запускать установку через HELM
helm upgrade --install --atomic --timeout 2m -n НАШname_space logstash logstash/ --values logstash/values.yaml
Так как filebeat отправляет только на уровне tcp а ingress работает на уровне http.ТО создаём configmap
cat ConfigMap.yml
1 2 3 4 5 6 7 |
apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: ingress-nginx data: 5050: "m-logstash-megabuilder/logstash-logstash:5044" |
В нём порт 5050 должен быть прокинут наружу,
m-logstash-megabuilder - это наш неймспей
logstash-logstash - это наш сервис
5044 - это порт на котором слушает сервис
Применяем:
kubectl apply -f ConfigMap.yml
Правим сервис ingress
kubectl edit service -n ingress-nginx ingress-nginx
А именно добавляем новый порт 5050
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
spec: clusterIP: 13.100.150.207 ports: - name: http port: 80 protocol: TCP targetPort: 80 - name: https port: 443 protocol: TCP targetPort: 443 - name: prometheus port: 10254 protocol: TCP targetPort: 10254 - name: proxied-tcp-5050 port: 5050 protocol: TCP targetPort: 5050 |
После этого правим deployment ingress в нашем случае это daemonsets
kubectl edit daemonsets.apps -n ingress-nginx ingress-nginx-controller
Добавляем наш порт:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
ports: - containerPort: 80 hostPort: 80 name: http protocol: TCP - containerPort: 443 hostPort: 443 name: https protocol: TCP - containerPort: 5050 hostPort: 5050 name: test-5050 protocol: TCP |
И проверяем что есть аргумент:
tcp-services-configmap
Вот в этом блоке:
1 2 3 4 5 6 7 8 9 |
spec: containers: - args: - /nginx-ingress-controller - --configmap=$(POD_NAMESPACE)/ingress-nginx - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services - --udp-services-configmap=$(POD_NAMESPACE)/udp-services - --annotations-prefix=nginx.ingress.kubernetes.io - --report-node-internal-ip-address |
После правки daemonsets поды ingress будут перезапущены и появится наш порт
1 2 3 4 |
[root@prod-srv-kubeworker1 ~]# netstat -ntpl | grep 5050 tcp 0 0 0.0.0.0:5050 0.0.0.0:* LISTEN 1354571/nginx: mast tcp6 0 0 :::5050 :::* LISTEN 1354571/nginx: mast |
проверим что всё нормально добавилось:
[root@prod-vsrv-kubemaster1 ~]# kubectl exec -ti -n ingress-nginx ingress-nginx-controller-dtb2q bash
bash-5.0$ cat /etc/nginx/nginx.conf | tail -20
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# TCP services server { preread_by_lua_block { ngx.var.proxy_upstream_name="tcp-m-logstash-megabuilder-logstash-logstash-5044"; } listen 5050; listen [::]:5050; proxy_timeout 600s; proxy_pass upstream_balancer; } # UDP services } |
Всё, теперь всё что прилетит на порт 5050 пойдёт на наш logstash
подробнее можно глянуть тут:
https://minikube.sigs.k8s.io/docs/tutorials/nginx_tcp_udp_ingress/
и тут:
https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/exposing-tcp-udp-services.md