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集群;-)
变更日志
角色变量
# 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.j2
或values.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版
作者信息
Ansible role to install Traefik ingress controller in a Kubernetes cluster
ansible-galaxy install githubixx.traefik_kubernetes