k8s之Traefik

一、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

模拟外部访问

curl http://www.yc.com:30893

再刷新查看 Traefik UI 界面,会生成刚创建的集群信息

http://192.168.88.21:32020/dashboard/

相关推荐
吃苹果的牛顿顿35 分钟前
Docker本地搭建WordPress
运维·docker·容器
Goboy4 小时前
K8s 环境下搭建 Docker + Harbor 私有镜像仓库:部署SpringBoot应用与配置指南
后端·云原生·架构
daizikui5 小时前
docker使用阿里云容器镜像服务下载公共镜像
阿里云·docker·容器
lexusv8ls600h5 小时前
微服务设计模式 - 物化视图模式(Materialized View Pattern)
微服务·设计模式·云原生·架构
Eternal-Student6 小时前
【docker了解】如何将x86镜像转换为适用于Jetson的ARM镜像
arm开发·docker·容器
探索云原生6 小时前
大模型推理指南:使用 vLLM 实现高效推理
ai·云原生·kubernetes·gpu·vllm
飘散风中7 小时前
Docker+PostgreSQL数据库
数据库·docker·容器
vvw&8 小时前
如何使用 Docker Compose 安装 WireGuard UI
linux·服务器·ui·docker·容器·wireguard·异地组网
加勒比海涛9 小时前
服务架构的演进:从单体到微服务的探索之旅
微服务·云原生·架构
求积分不加C10 小时前
zookeeper is not a recognized option--解决方案
分布式·zookeeper·云原生