traefik ingress Controller使用
Kubernetes Ingress
Kubernetes Ingress是路由规则的集合,这些规则控制外部用户如何访问Kubernetes集群中运行的服务。
在Kubernetes中,有三种方式可以使内部Pod公开访问。
- NodePort:使用Kubernetes Pod的
NodePort,将Pod内应用程序公开到每个节点上的端口上。 - Service LoadBalancer:使用Kubernetes Service,改功能会创建一个外部负载均衡器,使流量转向集群中的Kubernetes Pod。
- Ingress Controller:

Node Port是在Kubernetes集群中每个节点(Node)上开放端口,Kubernetes直接将流量转向集群中Pod。Kubernetes集群中使用NodePort,则需要编辑防火墙规则,但是NodePort是范围在Kubernetes集群中默认设置的范围为 30000–32767,最终导致流量端口暴露在非标准端口之上。
LoadBalancer一般应用于云厂商提供的Kubernetes服务,如果自行在机器上部署Kubernetes集群,则需要自行配置LoadBalancer的实现,
Kubernetes Ingress,为Kubernetes中的抽象概念,实现为第三方代理实现,这种三方实现集合统称为Ingress Controller。Ingress Controller负责引入外部流量并将流量处理并转向对应的服务。
Kubernetes IngressController功能实现
上面只是说道,在Kubernetes集群中,如何将外部流量引入到Kubernetes集群服务中。
负载均衡
无论在Kubernetes集群中,无论采用什么方式进行流量引入,都需要在外部负载均衡完成,而后负载均衡将流量引入Kubernetes集群入口或内部中,
通常情况下,NodePort方式管理繁琐,一般不用于生产环境。
服务的Ingress选择
Kubernetes Ingress是选择正确的方法来管理引入外部流量到服务内部。一般选择也是具有多样性的。
- Nginx Ingress Controller,Kubernetes默认推荐的Ingress,弊端①最终配置加载依赖
config reload,②定制化开发较难,配置基本来源于config file。 - Envoy & traefik api网关,支持tcp/udp/grpc/ws等多协议,支持流量控制,可观测性,多配置提供者。
- 云厂商提供的Ingress。AWS ALB,GCP GLBG/GCE,Azure AGIC
Traefik介绍
traefik-现代反向代理,也可称为现代边缘路由;traefik原声兼容主流集群,Kubernetes,Docker,AWS等。官方的定位traefik是一个让开发人员将时间花费在系统研发与部署功能上,而非配置和维护。并且traefik官方也提供自己的服务网格解决方案
作为一个 modern edge router ,traefik拥有与envoy相似的特性
- 基于go语言研发,目的是为了简化开发人员的配置和维护
- tcp/udp支持
- http L7支持
- GRPC支持
- 服务发现和动态配置
- front/ edge prory支持
- 可观测性
- 流量管理
- ...
traefik 术语
要了解trafik,首先需要先了解一下 有关trafik中的一些术语。
- EntryPoints 入口点,是可以被下游客户端连接的命名网络位置,类似于envoy 的listener和nginx的listen
- services 服务,负载均衡,上游主机接收来自traefik的连接和请求并返回响应。 类似于nginx upstream envoy的clusters
- Providers 提供者,提供配置文件的后端,如file,kubernetes,consul,redis,etcd等,可使traefik自动更新
- routers 路由器,承上启下,分析请求,将下游主机的请求处理转入到services
- middlewares: 中间件,在将下游主机的请求转入到services时进行的流量调整
在Kubernetes中使用traefik网关作为Ingress
Traefik于2019年9月发布2.0 GA版,增加了很多新特性,包括IngressRoute Kubernetes CRD,TCP,最新版增加UDP等。
安装traefik
Traefik 支持两种方式创建路由规则,一是Traefik 自定义 Kubernetes CRD ,还有一种是 Kubernetes Ingress 。
创建traefik使用的Kubernetes CRD 资源
traefik官网提供了创建时所需要的 yaml文件,这里仅需要使用官网提供的Definitions与RBAC即可。
在官网提供的yaml文件缺少 ServiceAccount,需要自行创建。
apiVersion: v1
kind: ServiceAccount
metadata:
namespace: default
name: traefik-ingress-controller
创建控制器
官方文件中,暂未找到所需运行traefik的控制器,需要自己创建一个。
traefik配置一般分为静态和动态配置,此处的静态是指,大部分时间内,不改变的配置(如nginx.conf),动态配置指,经常情况下改变的配置(可以理解为 nginx中 virtual host的每个独立配置文件)。
traefik提供配置的提供者也有很多种,此处使用命令行方式设置不长改变静态配置,也可以使用配置文件方式进行配置提供。
apiVersion: v1
kind: Service
metadata:
name: traefik
spec:
selector:
app: traefik-ingress
type: NodePort
ports:
- name: web
port: 80
targetPort: 80
- name: ssl
port: 443
targetPort: 443
- name: dashboard
port: 8080
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: traefik-ingress-controller-deployment
labels:
app: traefik-ingress
spec:
replicas: 1
selector:
matchLabels:
app: traefik-ingress
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
template:
metadata:
name: traefik-ingress
labels:
app: traefik-ingress
spec:
serviceAccountName: traefik-ingress-controller
volumes:
- name: ssl
hostPath:
path: /etc/kubernetes/pki
type: DirectoryOrCreate
containers:
- image: traefik:v2.3.3
name: traefik-ingress-lb
imagePullPolicy: IfNotPresent
volumeMounts:
- name: ssl
mountPath: /usr/local/pki
ports:
- name: web
containerPort: 80
hostPort: 1880
- name: ssl
containerPort: 443
hostPort: 18443
securityContext:
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
args:
- --entrypoints.web.address=:80
- --entrypoints.ssl.address=:443
- --providers.kubernetescrd
- --providers.kubernetesingress
- --api=true
- --ping=true
- --api.dashboard=true
- --serverstransport.insecureskipverify=true
- --serverstransport.rootcas=/usr/local/pki/ca.crt
- --accesslog
livenessProbe:
httpGet:
path: /ping
port: 8080
failureThreshold: 3
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /ping
port: 8080
failureThreshold: 3
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
配置文件方式,仅需参考官网,把--agrs中的参数转换为配置文件并引入到pod后。替换启动参数
args:
- --configfile=/config/traefik.yaml
使用CRD配置Traefik的流量管理
官网提供的基于Kubernetes CRD方式配置不是很多,可以参考动态配置中Kubernetes CRD Resources小结。
基于traefik dashboard方式配置增加HTTP router
前面使用官方提供CRD文件注册了Kubernetes CRD资源,所以traefik 中的资源类型,可作为kubernetes中资源使用。如 kubectl get Middleware
dashboard是traefik自己提供的服务所需的services为自己,traefik的entryPoints,当开启--api.dashboard=true 会增加一个8080端口作为traefik dashboard使用。而 api@internal 是traefik自己提供的services资源。
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard-route
spec:
entryPoints:
- traefik
routes:
- match: Host(`10.0.0.5`)
kind: Rule
services:
- name: api@internal
port: 8080
kind: TraefikService
为Kubernetes dashboard增加HTTP路由
基于kubernetes crd作为提供者运行的traefik中,后端service可以是traefik的services也可以是kubernetes资源中的service。
基于kubernetes sevices
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: kubernetes-dashboard-route
namespace: kubernetes-dashboard
annotations:
traefik.ingress.kubernetes.io/ssl-redirect: "true"
spec:
entryPoints:
- ssl
tls:
secretName: k8s-ca
routes:
- match: PathPrefix(`/ui`)
kind: Rule
middlewares:
- name: strip-ui
services:
- name: kubernetes-dashboard # kubernetes中的service对应的名称
kind: Service # kubernetes中的service
port: 443
namespace: kubernetes-dashboard # kubernetes中的service对应的名称空间。
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: strip-ui
namespace: kubernetes-dashboard
spec:
stripPrefix:
prefixes:
- "/ui"
- "/ui/"
此处使用了TLS的,开启了TLS,默认traefik是进行双向认证的,而kubernetes的dashboard的证书的ca并不知道,在访问时会出现Internal Server Error,目前没有找到有效的双向认证方法,普遍使用的方法都是调过认证--serverstransport.insecureskipverify=true
reference
https://github.com/traefik/traefik/issues/6821
负载均衡
负载均衡使用到的是traefik的services部分。
apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
name: LoadBalancer
spec:
weighted:
services:
- name: prod-v1.2
port: 443
weight: 1
kind: Service
- name: prod-v1
port: 443
weight: 2
kind: Service
---
流量镜像
apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
name: mirror1
spec:
mirroring:
name: s1
port: 80
mirrors:
- name: s3
percent: 20
port: 80
- name: mirror2
kind: TraefikService
percent: 20
traefik ingress Controller使用的更多相关文章
- 实操教程丨如何在K8S集群中部署Traefik Ingress Controller
注:本文使用的Traefik为1.x的版本 在生产环境中,我们常常需要控制来自互联网的外部进入集群中,而这恰巧是Ingress的职责. Ingress的主要目的是将HTTP和HTTPS从集群外部暴露给 ...
- Kubernetes 服务入口管理 Traefik Ingress Controller
前面部署了 kubernetes/ingress-nginx 作为 Ingress Controller,使用 Nginx 反向代理与负载,通过 Ingress Controller 不断的跟 Kub ...
- Kubernetes Ingress Controller的使用及高可用落地
Kubernetes Ingress Controller的使用及高可用落地 看懂本文要具备一下知识点: Service实现原理和会应用 知道反向代理原理,了解nginx和apache的vhost概念 ...
- Kubernetes 服务入口管理与 Nginx Ingress Controller
Kubernetes 具有强大的副本,动态扩容等特性,每一次 Pod 的变化 IP 地址都会发生变化,所以 Kubernetes 引进了 Service 的概念.Kubernetes 中使用 Serv ...
- k8s之ingress及ingress controller
1.ingress概述 图解:第一个service起到的作用是:引入外部流量,也可以不用此方式,以DaemonSet控制器的方式让Pod共享节点网络,第二个service的作用是:对后端pod分组,不 ...
- kubernetes Traefik ingress配置详解
理解Ingress 简单的说,ingress就是从kubernetes集群外访问集群的入口,将用户的URL请求转发到不同的service上.Ingress相当于nginx.apache等负载均衡方向代 ...
- Kubernetes 系列(三):Kubernetes使用Traefik Ingress暴露服务
一.Kubernetes 服务暴露介绍 从 kubernetes 1.2 版本开始,kubernetes提供了 Ingress 对象来实现对外暴露服务:到目前为止 kubernetes 总共有三种暴露 ...
- Kubernetes 学习11 kubernetes ingress及ingress controller
一.上集回顾 1.Service 3种模型:userspace,iptables,ipvs 2.Service类型 ClusterIP,NodePort NodePort:client -> N ...
- 11. Ingress及Ingress Controller(主nginx ingress controller)
11. Ingress,Ingress Controller拥有七层代理调度能力 什么是Ingress: Ingress是授权入站连接到达集群服务的规则集合 Ingress是一个Kubernetes资 ...
随机推荐
- PAT (Basic Level) Practice (中文)1065 单身狗 (25 分) 凌宸1642
PAT (Basic Level) Practice (中文)1065 单身狗 (25 分) 凌宸1642 题目描述: "单身狗"是中文对于单身人士的一种爱称.本题请你从上万人的大 ...
- HTML5和CSS3提高
一.HTML5的新特性 HTML5 的新增特性主要是针对于以前的不足,增加了一些新的标签.新的表单和新的表单属性等. 这些新特性都有兼容性问题,基本是 IE9+ 以上版本的浏览器才支持,如果不考虑兼容 ...
- Lucas(卢卡斯)定理
Lucas(卢卡斯)定理 定义 若 \(p\) 为质数,且\(a\ge b\ge1\),则有: \[C_{a}^{b}\equiv C_{a/p}^{b/p}\cdot C_{a (mod\,p)}^ ...
- 自学转行JAVA,没有项目经历怎么找工作?
应届生或者是刚参加工作的转行人员都有这样一个疑惑,刚学出来没有工作经验,但是企业又要求你必须要有工作经验,但是刚毕业找不到工作就不可能有工作经验,感觉陷入一个死循环.其实这种情况那些企业是不可能不知道 ...
- 大学四年,总结一套适合小白的Java自学路线和方法
前言篇 大家好,我是bigsai 好久不见,甚是想念,文章同时收录在回车课堂(文底阅读原文可达). 无论你是大学生还是在职人员,想学Java时,都会面临两个选择,自学或者报班.报班通常太费钱,时间又不 ...
- Android通过Web与后台数据库交互
2021.1.27 更新 已更新新版本博客,更新内容与原文章相比有点多,因此新开了一篇博客,请戳这里. 1 背景 开发一个App与后台数据库交互,基于MySQL+原生JDBC+Tomcat,没有使用D ...
- 自定义grub主题
1 概述 自定义grub引导菜单的主题,笔者的linux是deepin,感觉默认的grub主题不太好看,嗯,没办法,就是想改了. 这篇文章主要是修改/boot/grub/grub.cfg以及/boot ...
- Day05_17_面向对象编程
Java面向对象 面向对象编程 和 面向过程编程 举个例子: 用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭. 面向过程编程: 主要关注事物因果关系的实现,面向过程就是 ...
- python 匿名函数,内置函数
一 :匿名函数 匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使 ...
- 软件调研——GoodNotes 5与Notability
项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 作业要求 我在这个课程的目标是 积累软件开发经验,提高工程能力 这个作业在哪个具体方面帮助我实现目标 深入调 ...