k3s 将 http 重定向到 https

dyw*_*666 8 kubernetes traefik k3s

我正在尝试在 k3s 上部署 AWX,一切正常,但我想强制执行 SSL - 因此,将 HTTP 重定向到 HTTPS。

我一直在尝试测试 SSL 强制部分,但它无法正常工作。这是我的 traefik 配置:

apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: traefik-crd
  namespace: kube-system
spec:
  chart: https://%{KUBERNETES_API}%/static/charts/traefik-crd-9.18.2.tgz
---
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: traefik
  namespace: kube-system
spec:
  chart: https://%{KUBERNETES_API}%/static/charts/traefik-9.18.2.tgz
  set:
    global.systemDefaultRegistry: ""
  valuesContent: |-
    ssl:
      enforced: true
    rbac:
      enabled: true
    ports:
      websecure:
        tls:
          enabled: true
    podAnnotations:
      prometheus.io/port: "8082"
      prometheus.io/scrape: "true"
    providers:
      kubernetesIngress:
        publishedService:
          enabled: true
    priorityClassName: "system-cluster-critical"
    image:
      name: "rancher/library-traefik"
    tolerations:
    - key: "CriticalAddonsOnly"
      operator: "Exists"
    - key: "node-role.kubernetes.io/control-plane"
      operator: "Exists"
      effect: "NoSchedule"
    - key: "node-role.kubernetes.io/master"
      operator: "Exists"
      effect: "NoSchedule"
Run Code Online (Sandbox Code Playgroud)

根据此处的 Helm 图表https://github.com/helm/charts/tree/master/stable/traefik#configuration, ssl.enforced 参数应该可以解决问题,但是当我使用 http 访问我的主机时,它仍然没有重定向我到https。我可以看到Rancher也在为traefik部署LB服务,我需要以某种方式修改它吗?

Ora*_*bîg 12

我努力使重定向工作,终于找到了一个工作配置。

您应该在 kubernetes 中定义一个 Middleware 对象,并且您的 Ingress 对象必须引用它。请注意,因为 traefik 中的文档在这里非常具有误导性,因为在许多页面上找到的中间件清单都忘记了“命名空间”注释,因此他们确保这是“默认”(顺便说一句,这是愚蠢的,没有认真的人在默认命名空间上工作)。

因此,这是一个工作配置:

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: redirect
  namespace: some_namespace
spec:
  redirectScheme:
    scheme: https
    permanent: true
Run Code Online (Sandbox Code Playgroud)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: wordpress
  namespace: your_app_namespace
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/router.middlewares: some_namespace-redirect@kubernetescrd
spec:
  tls:
    - secretName: your_certificate
      hosts:
        - www.your_website.com
  rules:
    - host: www.your_website.com
      http:
        paths:
          - path: /
            backend:
              service:
                name: your_service
                port:
                  number: 80
            pathType: ImplementationSpecific
Run Code Online (Sandbox Code Playgroud)

所以诀窍是:

  • 定义一个中间件对象(在您想要的任何名称空间中,但可能与您的应用程序位于同一名称空间中)
  • traefik.ingress.kubernetes.io/router.middlewares使用语法引用它<NAMESPACE>-<NAME>@kubernetescrd(其中 NAMESPACE 和 NAME 是 Middleware 对象的那些)

  • 谢谢,很高兴它对你有用,但是我找到了一个更简单的解决方案,但不幸的是我忘了发布它。我修改了 k3s 附带的原始 traefik 部署,并将其添加到 helm 图表 `ports.web.redirectTo: websecure` 中,它可以工作。 (3认同)

小智 6

GAmeScripting答案的补充。K3S 不建议更改源配置文件。您可以像这样应用 HelmChartConfig:

apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: traefik
  namespace: kube-system
spec:
  valuesContent: |-
    ports:
      websecure:
        tls:
          enabled: true
      web:
        redirectTo:
          port: websecure
Run Code Online (Sandbox Code Playgroud)