一、Traefik与Ingress在Kubernetes环境中的对比
1.1、Ingres
Ingres,它充当了集群外部访问集群内部服务的入口,相当于service的service
ingress就是ingress控制器,用yaml文件或者配置一个资源对象,通过ingtoss资源对象来告诉在哪一个控制器上,用户请求的这个域名。然后对接哪一个service
Ingress Controller是Ingress的实现,用于处理进入集群的流量,并根据Ingress规则将流量路由到相应的Service。
核心目的就是把数据搞到service上
Ingress Controller可以基于不同的技术实现,如nginx、haproxy等。其中,nginx作为最常用的反向代理服务器之一,通过Ingress Controller与Kubernetes API交互,实时获取后端Service、Pod等的变化,并动态更新nginx配置,以实现服务发现。
然而,Ingress在动态配置和微服务集成方面存在一定的局限性。Ingress Controller需要不断与Kubernetes API交互,获取后端服务的最新状态,并在nginx配置中进行更新。这个过程可能会带来一定的延迟,影响服务发现的效率。此外,Ingress对于微服务的支持相对较弱,需要额外的配置和集成工作。
有延迟在微服务方面不友好
1.2、Traefik
Traefik在动态配置和微服务集成方面具有更好的表现。
Traefik本身设计为一个开源的反向代理与负载均衡工具,能够与常见的微服务系统直接整合,实现自动化动态配置。
Traefik能够实时跟Kubernetes API交互,感知后端Service、Pod等的变化,自动发现并自动更新配置并重载。这个过程更加快速方便,减少了人工干预和配置错误的可能性。
但是,由于Traefik本身是一个独立的工具,需要单独部署和管理,可能会增加一定的运维成本。此外,虽然Traefik对微服务架构的支持较好,但在某些情况下可能需要额外的配置和集成工作,而且目前资料比较少。
二、traefik 部署
2.1、部署方式
traefik 部署在 k8s 上分为 daemonset 和 deployment 两种方式,各有优缺点:
- daemonset 能确定有哪些 Node 在运行 traefik,所以可以确定的知道后端 ip,但是不能方便的伸缩。
- deployment 可以更方便的伸缩,但是不能确定有哪些 Node 在运行 traefik 所以不能确定的知道后端 ip。
一般部署两种不同类型的 traefik:
面向内部(internal)服务的 traefik,建议可以使用 deployment 的方式。
面向外部(external)服务的 traefik,建议可以使用 daemonset 的方式。
建议使用 traffic-type 标签
traffic-type: external
traffic-type: internal
traefik 相应地使用 labelSelector
traffic-type=internal
traffic-type=external
官方网址: https://docs.traefik.io/
下载源码:git clone https://github.com/containous/traefik.git
国内下载地址https://gitee.com/mirrors/traefik/tags
2.2、部署
1、获取配置文件
mkdir /opt/traefik
cd /opt/traefik
官方下载地址:
wget https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-rbac.yaml
wget https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-deployment.yaml
wget https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-ds.yaml
wget https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/ui.yaml
国内的 gitee:
wget https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-deployment.yaml
wget https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-rbac.yaml
wget https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-ds.yaml
wget https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/ui.yaml
也可以用【前置资源】
2、依次执行
启用RBAC
kubectl apply -f traefik-rbac.yaml
部署 Traefik 到 Kubernetes 集群,为外部访问创建 NodePorts
kubectl apply -f traefik-deployment.yaml
部署 Traefik Web UI
kubectl apply -f ui.yaml
查看结果
kubectl get svc -o wide -n kube-system | grep traefik
访问 Traefik UI,浏览器访问 http://Nodeip:NodePort/dashboard/
http://192.168.88.21:32020/dashboard/
ingress HTTP 代理访问
cd /opt/ingress-nodeport
创建 deployment、Service、Ingress Yaml 资源
vim ingress-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: traefik-app
spec:
replicas: 2
selector:
matchLabels:
name: traefik-nginx
template:
metadata:
labels:
name: traefik-nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: traefik-svc
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
name: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: traefik-nginx-test
spec:
rules:
- host: www.yc.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: traefik-svc
port:
number: 80
kubectl apply -f ingress-nginx.yaml
kubectl get svc,pods -o wide
kubectl exec -it pod/nginx-app-65d7b99f6b-nnw7q bash
cd /usr/share/nginx/html/
echo 'this is web1' >> index.html
kubectl exec -it pod/nginx-app-65d7b99f6b-x47l8 bash
cd /usr/share/nginx/html/
echo 'this is web2' >> index.html
#测试访问
curl 10.96.35.5
kubectl get svc -o wide -n kube-system | grep traefik
本地 host 添加域名解析
vim /etc/hosts
192.168.88.21 node02
192.168.88.21 www.yc.com
模拟外部访问
再刷新查看 Traefik UI 界面,会生成刚创建的集群信息