从另一个主机连接时,Traefik Ingress超时,可以从本地主机正常工作

时间:2020-02-28 14:40:58

标签: kubernetes traefik traefik-ingress

我正试图让Kubernetes集群在单个Redhat 7.7服务器上运行。

我以前设法使其能够在AWS上的Centos 7和Redhat 7.7 AMI上运行。

Traefik HTTP入口控制器启动并运行,但是所有http请求在traefik-ingress-controller-http-service的nodePort上超时。

kubectl get服务的输出| grep traefik

Output of kubectl get services | grep traefik

起初我以为Ingress本身有问题,但是如果您尝试从服务器内部卷曲,它会很好地工作。

要丢弃某种防火墙问题,我在一些服务中添加了一个nodePort,可以正常使用它们。

每当我在服务器内部使用curl时,traefik-ingress-controller窗格中的调试消息就会出现在日志中:

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

对于超时的请求,没有调试消息。

使用netstat -anp之后,我注意到kube-proxy拥有我要使用的端口,因此我还查看了kube-proxy pod的日志,并与成功安装的日志进行了比较,唯一的不同这行,仅在失败的服务器安装上显示:

node.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 &

我的版本是:

Kubernetes:1.17.3 特拉菲克: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 :(得分:0)

我开始跟踪所有相关网络接口上的tcp包,我意识到traefik服务的群集IP(通过DNAT和IP表进行DNS查找和平衡)无法回复SYN初始包。

在这种情况下,我必须将externalTrafficPolicy设置为Local,以允许Traefik HTTP入口控制器Pod使用实际的客户端IP来应答,而不是使用掩码的NAT IP /端口。

---
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