Nginx-Ingress для точки входа TCP не работает - PullRequest
0 голосов
/ 25 октября 2019

Я использую Nginx в качестве контролера Kubernetes Ingress. После выполнения этого простого примера я смог настроить этот пример

Теперь я пытаюсь настроить точку входа TCP для logstash со следующей конфигурацией

Logstash :

apiVersion: v1
kind: Secret
metadata:
  name: logstash-secret
  namespace: kube-logging
type: Opaque
data:
  tls.crt: "<base64 encoded>" #For logstash.test.domain.com
  tls.key: "<base64 encoded>" #For logstash.test.domain.com

---

apiVersion: v1
kind: ConfigMap
metadata:
  name: logstash-config
  namespace: kube-logging
  labels:
    app: logstash
data:
  syslog.conf: |-
    input {
      tcp {
          port => 5050
          type => syslog
      }
    }

    filter {
        grok {
          match => {"message" => "%{SYSLOGLINE}"}
        }
    }

    output {
      elasticsearch {
        hosts => ["http://elasticsearch:9200"] #elasticsearch running in same namespace (kube-logging)
        index => "syslog-%{+YYYY.MM.dd}"
      }
      stdout { codec => rubydebug }
    }

---

kind: Deployment
apiVersion: apps/v1
metadata:
  name: logstash
  namespace: kube-logging
  labels:
    app: logstash
spec:
  replicas: 1
  selector:
    matchLabels:
      app: logstash
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: logstash
    spec:
      #serviceAccountName: logstash
      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: 5050
          protocol: TCP
        securityContext:
          runAsUser: 0
        volumeMounts:
        - name: config
          mountPath: /usr/share/logstash/pipeline/syslog.conf
          readOnly: true
          subPath: syslog.conf
      volumes:
      - name: config
        configMap:
          defaultMode: 0600
          name: logstash-config

---

kind: Service
apiVersion: v1
metadata:
  name: logstash
  namespace: kube-logging
  labels:
    app: logstash
spec:
  ports:
    - name: tcp-port
      protocol: TCP
      port: 5050
      targetPort: 5050
  selector:
    app: logstash

Nginx-Ingress :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-ingress
  namespace: kube-ingress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-ingress
  template:
    metadata:
      labels:
        app: nginx-ingress
    spec:
      serviceAccountName: nginx-ingress
      containers:
      - image: nginx/nginx-ingress:1.5.7
        imagePullPolicy: Always
        name: nginx-ingress
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443
        - name: tcp5050
          containerPort: 5050
        securityContext:
          allowPrivilegeEscalation: true
          runAsUser: 101 #nginx
          capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        args:
          - -nginx-configmaps=$(POD_NAMESPACE)/nginx-config
          - -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret
          - -v=3 # Enables extensive logging. Useful for troubleshooting.
         #- -report-ingress-status
         #- -external-service=nginx-ingress
         #- -enable-leader-election
         #- -enable-prometheus-metrics
         #- -enable-custom-resources

LoadBalancer :

apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress-external
  namespace: kube-ingress
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "tcp"
    service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  type: LoadBalancer
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  - name: https
    protocol: TCP
    port: 443
    targetPort: 443
  - name: tcp5050
    protocol: TCP
    port: 5050
    targetPort: 5050
  selector:
    app: nginx-ingress

Ingress:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: logstash-ingress
  namespace: kube-logging
spec:
  tls:
  - hosts:
    - logstash.test.domain.com
    secretName: logstash-secret #This has self-signed cert for logstash.test.domain.com
  rules:
  - host: logstash.test.domain.com
    http:
      paths:
      - path: /
        backend:
          serviceName: logstash
          servicePort: 5050

В этой конфигурации показано следующее:

NAME               HOSTS                         ADDRESS   PORTS     AGE
logstash-ingress   logstash.test.domain.com                 80, 443   79m

Почему порт 5050 здесь не указан?

Просто хотите предоставить logstash службучерез публичную конечную точку. Когда я использую openssl s_client -connect logstash.kube-logging.svc.cluster.local:5050 внутри кластера, я получаю

$ openssl s_client -connect logstash.kube-logging.svc.cluster.local:5050
CONNECTED(00000005)

Но снаружи кластера openssl s_client -connect logstash.test.domain.com:5050 я получаю

$ openssl s_client -connect logstash.test.domain.com:5050
connect: Connection refused
connect:errno=61

и

$ openssl s_client -cert logstash_test_domain_com.crt -key logstash_test_domain_com.key -servername logstash.test.domain.com:5050
connect: Connection refused
connect:errno=61

Что мне нужно сделать, чтобы это работало?

1 Ответ

2 голосов
/ 27 октября 2019

Кажется, вы немного растеряны. Итак, начнем с заказа ваших услуг и доступа.

Во-первых, в Куберне есть 3 вида услуг. ClusterIP, который позволяет вам представить ваши развертывания внутри в k8s. Nodeport, который совпадает с ClusterIP, но также предоставляет ваше развертывание через каждый внешний IP-адрес узла и PORT , который находится в диапазоне ~ 30K-32K. Наконец, существует служба LoadBalancer, которая аналогична ClusterIP, но также предоставляет вашему приложению определенный внешний IP-адрес, назначенный провайдером облака LoadBalancer.

Созданная вами служба NodePort сделает logstashдоступны через каждый узел внешний IP в случайном порту в диапазоне от 30K до 32K;найдите порт под управлением kubectl get services | grep nginx-ingress и проверьте последний столбец. Чтобы получить внешние ip-адреса вашего узла, запустите kubectl get node -o wide. Созданная вами служба LoadBalancer сделает logstash доступным через внешний IP-адрес в порту 5050. Чтобы узнать IP, запустите kubectl get services | grep nginx-ingress-external. Наконец, вы также создали входной ресурс для доступа к logstash. Для этого вы определили хост, для которого данный порт TLS будет доступен через порт 443, и входящий трафик будет перенаправлен на тип службы logstash ClusterIP на порт 5050. Итак, у вас есть 3 способа достичь logstash. Я бы пошел на LoadBalancer, учитывая, что это определенный порт.

...