Traefik Ingress истекает при подключении с другого хоста, отлично работает с localhost - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь заставить кластер Kubernetes работать на одном сервере Redhat 7.7.

Мне ранее удалось заставить его работать на Centos 7 и Redhat 7.7 AMI на AWS.

Контроллер входа HTTP Traefik появляется и работает, однако все запросы http истекли на узле PortTort для traefik-ingress-controller-http-service.

Вывод kubectl get services | grep traefik

Output of kubectl get services | grep traefik

Сначала я предположил, что что-то не так с самим Ingress, но если вы попытаетесь свернуться изнутри сервера, он будет работать нормально.

Чтобы устранить какую-то проблему с брандмауэром, я добавил nodePort к некоторым моим службам, и их можно легко получить.

Отладочное сообщение появляется в журнале от модуля traefik-ingress-controller всякий раз, когда я использую curl внутри сервера:

level=debug msg="vulcand/oxy/roundrobin/rr: begin ServeHttp on request"

Нет сообщений отладки для запросов, которые истекли.

После использования netstat -anp я заметил, что kube-proxy принадлежит порт, который я пытаюсь поэтому я также взглянул на журнал модуля kube-proxy и сравнил его с журналом моей успешной установки, с той лишь разницей, что эта строка отображается только при сбое установки сервера:

узел. go: 135] IP-адрес узла успешно получен: 192.168.215.172

Временно я сделал переадресацию портов, и она работает нормально:

nohup kubectl port-forward --address 0.0.0.0 svc/traefik-ingress-controller-http-service 30225:443 -n traefik &

Мои версии:

* 102 9 * Kubernetes: 1.17.3 Traefik: 1.7

Конфигурация Traefik:

apiVersion: v1
kind: ConfigMap
metadata:
  name: traefik-ingress-configmap
  namespace: traefik
data:
  traefik.toml: |
    defaultEntryPoints = ["https","http"]
    [entryPoints]
      [entryPoints.http]
      address = ":80"
      [entryPoints.https]
      address = ":443"
        [entryPoints.https.tls]
          [[entryPoints.https.tls.certificates]]
          CertFile = "/ssl/tls.crt"
          KeyFile = "/ssl/tls.key"
    [kubernetes]
      [kubernetes.ingressEndpoint]
        publishedService = "traefik/traefik-ingress-controller-http-service"
    [ping]
    entryPoint = "http"

Служба:

---
kind: Service
apiVersion: v1
metadata:
  name: traefik-ingress-controller-http-service
  namespace: traefik
  annotations: {}
spec:
  selector:
    k8s-app: traefik-ingress-controller
  ports:
  - protocol: TCP
    port: 80
    name: http
  - protocol: TCP
    port: 443
    name: https
    nodePort: 30220
  type: NodePort

Развертывание Traefik:

---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: traefik-ingress-controller
  namespace: traefik
  labels:
    k8s-app: traefik-ingress-controller
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: traefik-ingress-controller
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-controller
        name: traefik-ingress-controller
    spec:
      serviceAccountName: traefik-ingress-serviceaccount
      terminationGracePeriodSeconds: 35
      volumes:
        - name: traefik-ui-tls-cert
          secret:
            secretName: traefik-ui-tls-cert
        - name: traefik-ingress-configmap
          configMap:
            name: traefik-ingress-configmap
      containers:
      - image: traefik:v1.7
        name: traefik-ingress-controller
        imagePullPolicy: Always
        resources:
          limits:
            cpu: 200m
            memory: 384Mi
          requests:
            cpu: 25m
            memory: 128Mi
        livenessProbe:
          failureThreshold: 2
          httpGet:
            path: /ping
            port: 80
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 5
        readinessProbe:
          failureThreshold: 2
          httpGet:
            path: /ping
            port: 80
            scheme: HTTP
          periodSeconds: 5
        volumeMounts:
          - mountPath: "/ssl"
            name: "traefik-ui-tls-cert"
          - mountPath: "/config"
            name: "traefik-ingress-configmap"
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443
        - name: dashboard
          containerPort: 8080
        args:
        - --logLevel=DEBUG
        - --configfile=/config/traefik.toml
        - --insecureskipverify

Любые идеи приветствуются:)

1 Ответ

0 голосов
/ 10 марта 2020

Я начал отслеживать пакеты tcp по всем соответствующим сетевым интерфейсам и понял, что IP-адрес кластера службы traefik, которая выполняет поиск DNS и балансировку через таблицы DNAT и IP, не может ответить на исходный пакет SYN. ​​

В этом случае мне пришлось установить для externalTrafficPolicy значение Local, чтобы модуль входного контроллера HTTP Traefik мог использовать для ответа фактический IP-адрес клиента вместо маскированного IP-адреса / порта NAT.

---
kind: Service
apiVersion: v1
metadata:
  name: traefik-ingress-controller-http-service
  namespace: traefik
  annotations: {}
spec:
  selector:
    k8s-app: traefik-ingress-controller
  ports:
  - protocol: TCP
    port: 80
    name: http
  - protocol: TCP
    port: 443
    name: https
    nodePort: 30220
  type: NodePort
  externalTrafficPolicy: Local
...