Traefik作为K8S的入口控制器

众所周知,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控制器。


怎么了


如果可以通过NodePortLoadBalancer提供对每个服务的访问权限,为什么还要使用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是端口80443


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 httphttps定义一个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的电报机器人。 如何简化自己和他人的生活

Source: https://habr.com/ru/post/zh-CN427655/


All Articles