众所周知,K8S具有出色的社区和良好的文档记录。 您可以在其中轻松找到许多问题的答案。 但是像任何其他文档一样,它不能涵盖所有内容。 在本文中,我将尝试提供有关如何部署和配置Traefik用作Ingress控制器的详细说明。

什么是Ingress?
Ingress是一个API对象,主要通过HTTP / HTTPS控制对集群中服务的外部访问。 为了使Ingress资源正常工作,您需要一个Ingress控制器。 如果使用GCE,则Ingress控制器已经部署到向导中。 但是,如果您自己将集群下载(例如,从kops
下载到AWS),则需要自己部署Ingress控制器。 在minikube上,这可以通过包含Ingress加载项来解决。
入口控制器
Ingress控制器的角色可以由NGINX Ingress控制器,Kong,Octavia Ingress控制器等执行。在本文中,我们将考虑Traefik之类的工具,并了解如何将其用作集群中服务的Ingress控制器。
怎么了
如果可以通过NodePort
或LoadBalancer
提供对每个服务的访问权限,为什么还要使用Ingress控制器? 简而言之,这允许一个中心点代理所有流量。 也就是说,使用Ingress控制器,您只需为Traefik安装一个LoadBalancer,仅此而已。 此捆绑包将解决所有流量。
Traefik组件
Traefik宣布在1.4版中支持Kubernetes Ingress。 但是,最近发布的Traefik 1.7具有publishedService,
选项publishedService,
该选项可以更新Ingress中的status
字段,而以前的版本中没有。 以下是操作所需的组件的列表。
创建:
- 命名空间
- 服务帐号
- TLS机密
- 集群角色
- 集群角色绑定
- 配置图
- 部署
- http和https服务
- Traefik仪表板服务
- 入口
命名空间
创建一个名称空间:
kubectl create namespace traefik
TLS秘密
(大约每个人-在下面的示例中,由于某种原因,作者重复了相同的配置,请参见下面链接提供的README文件中的当前配置)
首先创建一个证书:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com"
创建TLS证书:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com"
创建秘密:
kubectl create secret tls traefik-ui-tls-cert --key ./tls.key --cert ./tls.crt
为了方便起见,我使用这些命令制作了README文件,并将其上传到我的GitHub上 。
ConfigMap
--- apiVersion: v1 kind: ConfigMap metadata: name: traefik-configmap namespace: traefik data: traefik.toml: | defaultEntryPoints = ["http","https"] [entryPoints] [entryPoints.http] address = ":80" [entryPoints.https] address = ":443" [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] CertFile = "/ssl/tls.crt" KeyFile = "/ssl/tls.key" [entryPoints.traefik] address = ":8080" [entryPoints.traefik.auth.basic] users = ["admin:$apr1$zjjGWKW4$W2JIcu4m26WzOzzESDF0W/"] [kubernetes] [kubernetes.ingressEndpoint] publishedService = "traefik/traefik" [ping] entryPoint = "http" [api] entryPoint = "traefik"
默认情况下,EntryPoints是端口80
和443
。
EntryPoint http
侦听:80
,没有其他规则
EntryPoint https
监听:443
并包含用于连接TLS证书的规则。
EntryPoint traefik
侦听:8080
并使用基本身份验证。 用户名为admin
,密码为admin
。
Kubernetes中相应端点Ingress的定义是通过指定publishService来完成的,并且应由namespace
值和Traefik的service
名称组成。 在这种情况下,它是traefik / traefik
。
ping
或运行状况检查将使用entryPoint http
。
api
或dashboard / ui将使用entryPoint traefik
。
请注意,您可以使用端口定义其他entryPoint。 该端口可以将流量代理到任何端口,而不是动态端口和NodePort
。
集群角色
Traefik的服务帐户必须具有更新Ingress status
字段的权限。 这是一个重要参数,尚未在Traefik官方文档中提供 :
--- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller rules: - apiGroups: - "" resources: - services - endpoints - secrets verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses/status verbs: - update
最后6行对于正确操作非常重要。
部署方式
部署非常简单。 让我们简要介绍一下主要块:
volumes: - name: traefik-ui-tls-cert secret: secretName: traefik-ui-tls-cert - name: traefik-configmap configMap: name: traefik-configmap
为ConfigMap和Secret定义volumes
,然后可以在volumeMounts
使用volumeMounts
。
volumeMounts: - mountPath: "/ssl" name: "traefik-ui-tls-cert" - mountPath: "/config" name: "traefik-configmap"
根据ConfigMap中的定义,在端口80上执行运行状况检查。
打开配置文件中指定的所有entryPoints的端口:
ports: - name: http containerPort: 80 - name: https containerPort: 443 - name: dashboard containerPort: 8080
我提醒您,Internet上的一些示例和文档已经过时,因此请不要错过Traefik运作所需的args
部分:
args: - --logLevel=INFO - --configfile=/config/traefik.toml
不要传递其他标志和参数,例如-api,-ping或-kubernetes,因为这将覆盖配置文件中指定的设置。
服务专区
第一个服务为entryPoints http
和https
定义一个Loadbalancer。 如果您查看LoadBalancer的安全组(入口),则将看到端口80和443打开。K8将创建一个LoadBalancer,并将其连接到Traefik运行所在的节点。 如果要像我一样创建内部ELB,则需要定义注释:
--- kind: Service apiVersion: v1 metadata: name: traefik namespace: traefik annotations: # service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0 spec: selector: k8s-app: traefik-ingress ports: - protocol: TCP port: 80 name: http - protocol: TCP port: 443 name: https type: LoadBalancer
服务(用于仪表板)
现在有趣的部分! 由于Dashboard使用基本身份验证,因此我需要https
。 要使用SSL,我们需要将流量重定向到Dashboard起作用的端口:8080
。 如您所见,这非常简单。 所有魔力都发生在Ingress。
--- kind: Service apiVersion: v1 metadata: name: traefik-dashboard namespace: traefik spec: selector: k8s-app: traefik-ingress ports: - port: 8080 name: dashboard
入口(用于仪表板)
神奇之处在于,通过Traefik本身将安全流量代理到仪表板。 使用Traefik批注完成Ingress中Traefik的管理 :
--- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-dashboard-ingress namespace: traefik annotations: kubernetes.io/ingress.class: traefik traefik.ingress.kubernetes.io/frontend-entry-points: http,https traefik.ingress.kubernetes.io/redirect-entry-point: https traefik.ingress.kubernetes.io/redirect-permanent: "true" spec: rules: - host: traefik-ui.example.com http: paths: - path: / backend: serviceName: traefik-dashboard servicePort: 8080
只用了4个简单清晰的注释。
当然,要确保功能完整,您需要创建一个DNS记录traefik-ui.example.com
,该记录将指向您的ELB。
如果能自动完成会很好吗? 没问题,我将在下一篇文章中介绍自动创建DNS记录。
参考文献
可以从我的Github存储库下载完成的deployment.yaml文件。 如果在设置过程中遇到任何困难,请随时询问。
译者的分词
阅读我们博客上的其他文章:
Kubernetes中的状态备份
备份大量异构Web项目
Redmine的电报机器人。 如何简化自己和他人的生活