如何创建到通过Traefik和Kubernetes监听Https的服务的HTTPS路由

时间:2020-05-04 09:56:05

标签: kubernetes traefik

我是kubernetes和Traefik的新手。

我继续学习该教程: https://docs.traefik.io/user-guides/crd-acme/

我将其更改为在Scala中使用我的服务,该服务位于https和9463端口下。 我正在尝试使用kubernetes和traefik部署我的Scala服务。

当我直接转到服务时:

kubectl port-forward service/core-service 8001:9463

然后我执行curl -k 'https://localhost:8001/health'

我得到了"{Message:Ok}"

但是当我执行端口转移到traefik

kubectl port-forward service/traefik 9463:9463 -n default

并执行curl -k 'https://ejemplo.com:9463/tls/health' 我得到一个"Internal server error"

我想问题是我的“核心服务”正在通过HTTPS协议进行监听,这就是我添加的scheme:https。 我试图在文档中找到解决方案,但这很令人困惑。

这些是我的yml文件:

Services.yaml

apiVersion: v1  
kind: Service  
metadata:  
  name: traefik

spec:  
  ports:
    - protocol: TCP
      name: admin
      port: 8080
    - protocol: TCP
      name: websecure
      port: 9463
  selector:
    app: traefik

---
apiVersion: v1  
kind: Service  
metadata:  
  name: core-service

spec:  
  ports:
    - protocol: TCP
      name: websecure
      port: 9463
  selector:
    app: core-service

Deployment.yaml

apiVersion: v1  
kind: ServiceAccount  
metadata:  
  namespace: default
  name: traefik-ingress-controller

---
kind: Deployment  
apiVersion: apps/v1  
metadata:  
  namespace: default
  name: traefik
  labels:
    app: traefik

spec:  
  replicas: 1
  selector:
    matchLabels:
      app: traefik
  template:
    metadata:
      labels:
        app: traefik
    spec:
      serviceAccountName: traefik-ingress-controller
      containers:
        - name: traefik
          image: traefik:v2.0
          args:
            - --api.insecure
            - --accesslog
            - --entrypoints.websecure.Address=:9463
            - --providers.kubernetescrd
            - --certificatesresolvers.default.acme.tlschallenge
            - --certificatesresolvers.default.acme.email=foo@you.com
            - --certificatesresolvers.default.acme.storage=acme.json
            # Please note that this is the staging Let's Encrypt server.
            # Once you get things working, you should remove that whole line altogether.
            - --certificatesresolvers.default.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory
          ports:
            - name: websecure
              containerPort: 9463
            - name: admin
              containerPort: 8080

---
kind: Deployment  
apiVersion: apps/v1  
metadata:  
  namespace: default
  name: core-service
  labels:
    app: core-service

spec:  
  replicas: 1
  selector:
    matchLabels:
      app: core-service
  template:
    metadata:
      labels:
        app: core-service
    spec:
      containers:
        - name: core-service
          image: core-service:0.1.4-SNAPSHOT
          ports:
            - name: websecure
              containerPort: 9463
          livenessProbe:
            httpGet:
              port: 9463
              scheme: HTTPS
              path: /health
            initialDelaySeconds: 10

IngressRoute2.yaml

apiVersion: traefik.containo.us/v1alpha1  
kind: IngressRoute  
metadata:  
  name: ingressroutetls
  namespace: default
spec:  
  entryPoints:
    - websecure
  routes:
  - match: Host(`ejemplo.com`) && PathPrefix(`/tls`)
    kind: Rule
    services:
    - name: core-service
      port: 9463
      scheme: https
  tls:
    certResolver: default

1 个答案:

答案 0 :(得分:2)

docs

默认情况下,TLS路由器将终止TLS连接。然而, 可以指定passthrough选项设置请求是否 应该“按原样”转发,并保持所有数据加密。

在您的情况下,由于Pod需要HTTPS流量,因此需要启用SSL Passthrough。

apiVersion: traefik.containo.us/v1alpha1  
kind: IngressRoute  
metadata:  
  name: ingressroutetls
  namespace: default
spec:  
  entryPoints:
    - websecure
  routes:
  - match: Host(`ejemplo.com`) && PathPrefix(`/tls`)
    kind: Rule
    services:
    - name: core-service
      port: 9463
      scheme: https
  tls:
    certResolver: default
    passthrough: true