Ingress Controller(Traefik)与Kubernetes后端服务之间的安全通信

时间:2018-04-13 12:28:53

标签: proxy kubernetes apache-nifi traefik kubernetes-ingress

我正在尝试在Trakerik代理后面的Kubernetes群集中保护Nifi。两者都在K8S中作为服务运行。 Traefik获得公共证书。我希望它将呼叫重定向到nifi,同时确保Traefik(作为Ingress Controller)和后端pod之间的通信:Nifi。

看起来安全配置应该在我的Ingress YAML描述符中使用。看起来我应该发出一个CA root来生成Nifi自签名证书并在Traefik中加载这个CA Root,以便它可以验证Nifi发送的证书,同时与它握手。

但是......我无法弄清楚1)这是不是很好的方法,2)我如何使用CA Root为NiFi生成我的商店(信任,...),3)我应该如何设置我的YAML(insecureSkipVerify似乎不受支持,......)

提前,谢谢你的帮助。

干杯,

奥利弗

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,可以使用insecureSkipVerify标志来解决。
traefik的问题在于,NiFi从traefik获取请求并将其自签名证书发送回traefik进行握手。 Traefik不接受它,因此握手失败,从而导致NiFi中的bad_certificate异常(日志级别为DEBUG,因此您必须更改logback.xml文件)。

因此,一种解决方案是将您的自签名证书添加到traefik中,目前see this (currently) open issue无法实现。

另一个解决方案是在traefik和NiFi之间添加一个nginx,而不会“确保”您现有的traefik。因此,traefik与nginx进行了HTTP的对话,而与NiFi进行了HTTPS的对话(这是我接下来要尝试的事情)。

或者您可以像在此insecureSkipVerify中一样在traefik中设置daemonset.yaml标志:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  creationTimestamp: 2018-06-21T16:18:46Z
  generation: 4
  labels:
    k8s-app: traefik-internal
    release: infrastructure
  name: traefik-internal
  namespace: infrastructure
  resourceVersion: "18860064"
  selfLink: /apis/extensions/v1beta1/namespaces/infrastructure/daemonsets/traefik-internal
  uid: c64a20e1-776e-11f8-be83-42010a9c0ff6
spec:
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: traefik-internal
      name: traefik-internal
      release: infrastructure
  template:
    metadata:
      creationTimestamp: null
      labels:
        k8s-app: traefik-internal
        name: traefik-internal
        release: infrastructure
    spec:
      containers:
      - args:
        - --api
        - --ping
        - --defaultEntryPoints=http,https
        - --logLevel=INFO
        - --accessLog
        - --kubernetes
        - --kubernetes.ingressClass=traefik-internal
        - --metrics.prometheus=true
        - --entryPoints=Name:https Address::443 TLS:/certs/cert.pem,/certs/cert.key
          CA:/certs/clientca.pem
        - --entryPoints=Name:http Address::80 Redirect.EntryPoint:https
        - --insecureSkipVerify=true
        image: traefik:1.6.0-rc6-alpine
        imagePullPolicy: IfNotPresent
        name: traefik-internal
        resources: {}
        securityContext:
          privileged: true
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /certs
          name: traefik-internal-certs
          readOnly: true
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: sa-traefik
      serviceAccountName: sa-traefik
      terminationGracePeriodSeconds: 60
      volumes:
      - name: traefik-internal-certs
        secret:
          defaultMode: 420
          secretName: traefik-internal
  templateGeneration: 4
  updateStrategy:
    rollingUpdate:
      maxUnavailable: 1
    type: RollingUpdate
status:
  currentNumberScheduled: 3
  desiredNumberScheduled: 3
  numberAvailable: 3
  numberMisscheduled: 0
  numberReady: 3
  observedGeneration: 4
  updatedNumberScheduled: 3

insecureSkipVerify标志在spec.containers.args中已更改。

希望有帮助!