新钛云服已为您服务912

Traefik 2.0于2019年9月在GA上发布,发布了许多新功能,包括对SNI路由的TCP支持,中间件,canary/traffic镜像和IngressRoute Kubernetes CRD。

尽管Containous的团队(Traefik的创建者)在规划从v1到v2的迁移步骤方面做得很出色,但除了官方网站上的“ Traefik&CRD和Let's Encrypt ”用户指南,目前依然缺少大量的Kubernetes用户案例

因此,特意整理了以下5分钟Traefik之旅:基于Let's Encrypt和Cloudflare的HTTPS,用于处理Kubernetes上的HTTPS请求。

先决条件

要学习本教程,您将需要一个已安装Helm 3.x的Kubernetes集群(例如minikube,GKE,EKS,AKS或k3s)。

将Traefik chat的存储库添加到Helm:

helm repo add traefik https://containous.github.io/traefik-helm-chart

如果您是Traefik的初始用户,以下是traefik的一些基本概念需要了解:

  • EntryPoints:监听传入流量;

  • Routers:分析传入的请求并连接到后端服务;

  • Middleware:修改/更新请求(例如,速率限制,HTTPS重定向等);

  • Services: 将请求转发到相应的服务器/负载均衡器/应用程序。

最后,我将Cloudflare用作DNS provider,但您也可以使用任何Let's Encrypt支持的provider。

Let’s Encrypt的设置

Traefik v2 Helm chart引导了三个EntryPoints:

  • traefik端口9000(用于readiness和liveness探针);

  • web端口80(HTTP);

  • websecure端口443(HTTPS)。

定义了EntryPoints后,我们可以扩展chart以将Let's Encrypt用作证书解析器,并自动为您的域名生成和更新证书。

letsencrypttraefik-values.yaml
additionalArguments:
- "--certificatesresolvers.letsencrypt.acme.email=<your-email-here>"
- "--certificatesresolvers.letsencrypt.acme.storage=/data/acme.json"
- "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-v02.api.letsencrypt.org/directory"
- "--certificatesResolvers.letsencrypt.acme.dnschallenge=true"
- "--certificatesResolvers.letsencrypt.acme.dnschallenge.provider=cloudflare"
- "--api.insecure=true"
- "--accesslog=true"
- "--log.level=INFO"

我们正在使用dnsChallenge选项生成ACME证书,但是您也可以选择使用tls Challenge或http Challenge。

Cloudflare设置

Create TokenEdit zone DNS
Active:

现在在Kubernetes上,让我们创建一个secret,以便Traefik可以将其作为环境变量来进行安装:

$ kubectl create secret generic cloudflare --from-literal=dns-token=<my-cloudflare-token-here>
traefik-values.yaml:
env:
- name: CF_DNS_API_TOKEN
  valueFrom:
    secretKeyRef:
      name: cloudflare
      key: dns-token

安装Traefik

现在,通过Helm安装Traefik:

$ helm install traefik traefik/traefik -f traefik/traefik-values.yaml

pod健康之后,您可以通过端口转发访问Traefik Dashboard:

$ kubectl port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name) 9000:9000

Helm chart还将创建一个LoadBalancer,以将流量路由到Kubernetes。记下此IP地址(或AWS上的ELB DNS名称),因为我们稍后将需要它来配置DNS条目。

添加Ingress Routes

最后,让我们添加一个IngressRoute来查看Traefik的运行情况。我将使用Grafana作为示例服务,然后通过HTTPS进行访问测试。

通过helm安装Grafana:

$ helm install grafana stable/grafana
grafana.yaml:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: grafana-ingress
spec:
entryPoints:
  - websecure
routes:
- match: Host(`grafana.example.com`)
  kind: Rule
  services:
  - name: grafana
    port: 3000
tls:
  certResolver: letsencrypt

确保根据“Let’s Encrypt”设置更改主机名并应用更改:

$ kubectl apply -f grafana.yaml

当Traefik创建新的路由逻辑并生成Let's Encrypt证书时,切换回Cloudflare并添加指向Traefik的LoadBalancer(或用于ELB DNS条目的CNAME)的IP地址的A记录(grafana)。

grafana.example.com

最后

现在我们有了一个基本的证书自动申请的配置示例,以用来研究通过中间件启用HTTPS重定向或实现IP白名单以保护对Grafana的访问。您可以在YAML文件中扩展其他参数,也可以通过Helm挂载config.toml。

*本文部分图片源于网络,如有侵权请联系删除

了解新钛云服

往期技术干货