githubixx.traefik_kubernetes

traefik-kubernetes

该Ansible角色为Kubernetes安装Traefik边缘路由器作为Ingress控制器。它在幕后使用官方的Helm图表。目前支持安装、更新/升级和删除Traefik部署等操作。

提供的默认设置针对的是裸金属/本地Kubernetes集群进行优化,其中Traefik是Kubernetes服务的公共入口。虽然当然可以像使用任何Helm图表一样自定义配置,但默认设置将以以下配置设置Traefik:

  • Traefik实例将作为DaemonSet部署
  • Traefik pod使用hostPort
  • Traefik在主机的所有接口上监听端口80以接收HTTP请求
  • Traefik在主机的所有接口上监听端口443以接收HTTPS请求
  • Traefik仪表板已启用,但未公开到公共互联网
  • TLS证书由cert-manager提供(我的Ansible角色cert-manager-kubernetes可以用来安装cert-manager)

有关Helm图表设置的更多信息,请见下文。

版本

我为每个版本打上标签,尽量遵循语义化版本控制。如果您想使用该角色,建议查看最新标签。主分支基本上是开发,标签则标记稳定版本。但通常我也会保持主分支的良好状态。标签5.0.0+23.0.1表示这是该角色的版本5.0.0,并使用Helm图表版本23.0.1(使用的Traefik版本在值文件中指定[见下文])。如果角色本身发生更改,X.Y.Z+之前会增加。如果Traefik图表版本发生变化,X.Y.Z+之后也会增加。这允许对角色的bug修复和新主要版本进行标记,同时仍在特定的Traefik版本上开发。

要求

您需要在执行ansible-playbook的主机上安装Helm 3二进制文件,或者在您将playbook委托到的主机上(例如,使用traefik_delegate_to变量)。您可以选择

  • 如果您的发行版在其软件包仓库中包含helm,可以使用您喜欢的包管理器(例如Archlinux上使用sudo pacman -S helm)。
  • 或使用Ansible的Helm角色之一(例如helm - 在使用ansible-galaxy role install -vr requirements.yml时也会安装)。
  • 或者直接从Helm发布下载二进制文件,并将其放入/usr/local/bin/目录中。

还需要正确配置的KUBECONFIG(默认位于${HOME}/.kube/config)。通常,如果kubectl能与您的集群正常工作,您在这方面应该一切正常。

此外,还需要安装Ansible的kubernetes.core集合。可以使用此角色中包含的collections.yml文件来安装:ansible-galaxy install -r collections.yml

当然,您还需要一个Kubernetes集群;-)

变更日志

请见CHANGELOG.md

角色变量

# Helm图表版本
traefik_chart_version: "23.2.0"

# Helm发布名称
traefik_release_name: "traefik"

# Helm仓库名称
traefik_repo_name: "traefik"

# Helm图表名称
traefik_chart_name: "{{ traefik_repo_name }}/{{ traefik_release_name }}"

# Helm图表URL
traefik_chart_url: "https://helm.traefik.io/traefik"

# Kubernetes命名空间,Traefik资源将被安装在此处
traefik_namespace: "traefik"

# 包含Helm图表值文件的目录。如果您指定此变量,Ansible将尝试在指定目录中找到名为"values.yml.j2"或"values.yaml.j2"的文件(".j2"是因为您可以在其中使用普通的Jinja2模板)。该文件的内容将作为值文件提供给"helm install/template"命令。
# 默认目录是用户的"$HOME"目录加上"/traefik/helm"。如果任务没有找到这样的文件,它将默认使用"templates/traefik_values_default.yml.j2"中的值。
traefik_chart_values_directory: "{{ '~/traefik/helm' | expanduser }}"

# 默认情况下不安装CRDs(CustomResourceDefinitions)。如果应安装CRDs,请设置为"true"。另见:
# https://github.com/traefik/traefik-helm-chart/tree/master/traefik/crds
# 将安装以下CRDs:
#   - ingressroutes.traefik.containo.us
#   - ingressroutes.traefik.io
#   - ingressroutetcps.traefik.containo.us
#   - ingressroutetcps.traefik.io
#   - ingressrouteudps.traefik.containo.us
#   - ingressrouteudps.traefik.io
#   - middlewares.traefik.containo.us
#   - middlewares.traefik.io
#   - middlewaretcps.traefik.containo.us
#   - middlewaretcps.traefik.io
#   - serverstransports.traefik.containo.us
#   - serverstransports.traefik.io
#   - tlsoptions.traefik.containo.us
#   - tlsoptions.traefik.io
#   - tlsstores.traefik.containo.us
#   - tlsstores.traefik.io
#   - traefikservices.traefik.containo.us
#   - traefikservices.traefik.io
traefik_install_crds: false

# 默认情况下,所有需要与Kubernetes集群通信的任务都在您的本地主机(127.0.0.1)上执行。但如果该主机无法直接连接到此集群,或需要在其他地方执行,可以相应地更改此变量。
traefik_delegate_to: 127.0.0.1

# 如果任务使用Helm安装、更新/升级或删除这样的资源,则显示执行的"helm"命令。
traefik_helm_show_commands: false

# 如果未定义"action"变量,此角色将仅渲染一个文件,其中包含将要安装或升级的所有资源。渲染后的文件将被称为"template.yml",并放置在下面指定的目录中。
traefik_template_output_directory: "{{ '~/traefik/template' | expanduser }}"

使用方法

首先要检查templates/traefik_values_default.yml.j2。此文件包含Traefik Helm图表的值/设置,这些设置与默认设置不同,默认设置位于这里。以下是使用的默认设置:

# 所有可能的Helm图表值在这里可以找到:
# https://github.com/traefik/traefik-helm-chart/blob/master/traefik/values.yaml

image:
  repository: traefik
  tag: "2.11.2"
  pullPolicy: IfNotPresent

# 这些参数传递给Traefik的二进制文件。有关所有选项,请参见:
# https://doc.traefik.io/traefik/reference/static-configuration/cli/
#
# 第一个设置相应的日志级别。
#
# 第二个设置要监视的"kubernetes.io/ingress.class"注释的值。如果将“标准”Kubernetes“Ingress”对象提交到Kubernetes API服务器(而不是Traefik自己的Ingress实现称为“IngressRoute”),Traefik将处理这些请求并进行相应的路由。
additionalArguments:
  - "--log.level=INFO"
  - "--providers.kubernetesingress.ingressclass=traefik"

# 传递给Traefik二进制文件的全局参数。
# https://doc.traefik.io/traefik/reference/static-configuration/cli/
#
# 第一个禁用定期检查是否发布了新版本。
#
# 第二个禁用匿名使用统计信息。
globalArguments:
  - "--global.checknewversion=false"
  - "--global.sendanonymoususage=false"

# 这将创建Traefik部署。由于这里指定为“DaemonSet”,,因此这将在所有Kubernetes工作节点上创建一个Traefik实例。如果仅应使用部分节点,则可以相应地指定“affinity”、“nodeSelector”或“toleration”。有关Helm图表值的链接请参见上文。
deployment:
  enabled: true
  kind: DaemonSet
  dnsPolicy: ClusterFirstWithHostNet

# 指示Traefik监听不同的端口。
ports:
  # 此名称无法更改,因为它用于就绪和存活探测,但您可以根据自己的喜好调整其配置。
  # 要访问仪表板,您可以使用"kubectl port-forward",例如:
  # kubectl -n traefik port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name -A | head -1) 9000:9000
  # 打开 http://localhost:9000/dashboard/ 应该会显示仪表板。
  traefik:
    port: 9000
    expose: false
    protocol: TCP
  # 未经保护的入站HTTP流量。如果您取消注释"redirectTo: websecure",则所有到达此端口的流量将重定向到"websecure"入口点,这意味着处理安全HTTPS流量的入口点。
  # 但请注意,这可能会对cert-manager造成问题。
  # 同样使用"hostPort"。由于上面指定为"DaemonSet",这基本上意味着Traefik pod将在所有Kubernetes工作节点的端口80和443上响应请求。因此,如果主机有公共IP并且端口80/443未被防火墙保护,Traefik将可以接受来自互联网的请求(通常希望在Traefik的情况下如此;-))。有关其他选项,请参见上文链接。这些设置适用于没有负载均衡器的裸金属或本地解决方案。
  web:
    port: 30080
    hostPort: 80
    expose: true
    protocol: TCP
    # redirectTo: websecure
  # HTTPS流量的入口点。
  websecure:
    port: 30443
    hostPort: 443
    expose: true
    protocol: TCP

# 这些安全设置基本上是限制攻击面的最佳实践。
# 通过"seccomp"进一步限制攻击面,自Kubernetes v1.19以来,该功能稳定,可以将系统调用限制到最低。请参见:
# https://kubernetes.io/docs/tutorials/clusters/seccomp/"
securityContext:
  capabilities:
    drop:
      - ALL
  readOnlyRootFilesystem: true
  runAsGroup: 65532
  runAsNonRoot: true
  runAsUser: 65532

# 容器的所有进程也是此附加组ID的一部分。
podSecurityContext:
  fsGroup: 65532

# 设置一般日志的日志级别并启用访问日志。
logs:
  general:
    level: INFO
  access:
    enabled: true

# 由于Traefik的web/websecure端口通过"hostPort"公开,因此不需要服务。
service:
  enabled: false

# CPU和RAM资源限制。这些设置在发生内存泄漏等情况下也应设置为合理的值。
resources:
  requests:
    cpu: "100m"
    memory: "50Mi"
  limits:
    cpu: "300m"
    memory: "150Mi"

# 当DaemonSet升级时,逐个更新Pods
updateStrategy:
  type: RollingUpdate
  rollingUpdate:
    maxUnavailable: 1

但没有什么是石碑上刻的;-)要使用您自己的值,只需创建一个名为values.yml.j2values.yaml.j2的文件,并将其放入traefik_chart_values_directory中指定的目录中(默认是$HOME/traefik/helm)。然后此角色将使用该文件来渲染Helm值。您可以使用templates/traefik_values_default.yml.j2作为模板,或从头开始创建。正如上面所提到的,您可以修改与这里中默认设置不同的Helm图表的所有设置。

在值文件就位并检查了defaults/main.yml的值后,该角色可以安装。大多数角色任务在本地主机上执行,因为有很多任务需要与Kubernetes API服务器通信或执行Helm命令。

默认操作只是渲染Kubernetes资源的YAML文件,在替换所有Jinja2变量和诸如此类之后。在下面的示例Playbook部分,有一个示例2(为角色分配标签)。角色githubixx.traefik-kubernetes被分配了标签role-traefik-kubernetes。假设Helm图表的值应该被渲染(在这种情况下不会安装任何内容),并且playbook称为k8s.yml,则执行以下命令:

ansible-playbook --tags=role-traefik-kubernetes k8s.yml

要将模板渲染到不同目录,请使用traefik_template_output_directory变量,例如:

ansible-playbook --tags=role-traefik-kubernetes --extra-vars traefik_template_output_directory="/tmp/traefik" k8s.yml

如果您想在日志中查看执行的helm命令和参数,您也可以指定--extra-vars traefik_helm_show_commands=true

最后一个任务叫做TASK [githubixx.traefik_kubernetes : Write templates to file]。这将渲染将要创建的资源的模板到指定在traefik_template_output_directory中的目录。该文件将被称为template.yml,目录/文件将放在您的本地机器上以便您查看。

如果渲染的模板包含您所需的所有内容,则可以安装该角色,这样最终将部署Traefik:

ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=install k8s.yml

要检查是否所有内容均已部署,可以使用常规的kubectl命令,例如kubectl -n <traefik_namespace> get pods -o wide

由于Traefik每几周/月发布更新,角色也可以进行更新/升级。此方法也可用于在不升级Traefik版本的情况下更改现有值,例如。在更新Traefik之前,请查看Traefik发布。Helm图表的更改可以在提交历史中找到。

如果您想升级Traefik/Helm图表,基本上只需将traefik_chart_version变量更改,例如,从10.21.1更改为10.24.2。您可能还需要在templates/traefik_values_default.yml.j2中更改image.tag值。如果只需更改参数,请相应地更新值。

因此,要执行Traefik更新或推出新值,请运行

ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=upgrade k8s.yml

最后,如果您想删除Traefik,可以再次删除所有资源:

ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=delete k8s.yml

示例Playbook

示例1(没有角色标签):

- hosts: traefik
  roles:
    - githubixx.traefik_kubernetes

示例2(为角色分配标签):

-
  hosts: traefik
  roles:
    -
      role: githubixx.traefik-kubernetes
      tags: role-traefik-kubernetes

示例Playbook中的主机traefik很可能只是Ansible的hosts文件中指定的localhost,或者您想用作“运行者”的任何主机。只需确保此主机已安装helm并具有有效的kubeconfig(通常在kubectl命令能够与Kubernetes集群正常工作时就是如此)。

测试

此角色有一个小的测试设置,使用Molecule、libvirt(vagrant-libvirt)和QEMU/KVM创建。请参见我的博客文章使用Molecule、libvirt(vagrant-libvirt)和QEMU/KVM测试Ansible角色了解如何设置。测试配置在这里

之后,可以执行molecule。Molecule将设置一些具有完整Kubernetes集群的虚拟机,这使得能够测试所有Traefik功能。

以下命令将进行基本设置,并创建将要创建资源的模板(默认操作请参见上文):

molecule converge

安装Traefik及所需资源:

molecule converge -- --extra-vars action=install

升级Traefik或更改参数:

molecule converge -- --extra-vars action=upgrade

删除Traefik及其资源:

molecule converge -- --extra-vars action=delete

要运行一些测试,请使用

molecule verify

要清理,可运行

molecule destroy

许可证

GNU通用公共许可证 第3版

作者信息

http://www.tauceti.blog

关于项目

Ansible role to install Traefik ingress controller in a Kubernetes cluster

安装
ansible-galaxy install githubixx.traefik_kubernetes
许可证
gpl-3.0
下载
1.5k
拥有者
Senior System Engineer - Python, Go, Cloud, Kubernetes, Commodore, Retro, 80's ;-)