Traefik Ingress Controller

目录

1、简介

2、部署 nginx-ingress-controller


1、简介

Traefik 是一个为了让部署微服务更加便捷而诞生的现代 HTTP 反向代理、负载均衡工具。traefik 本身设计的就能够实时跟 kubernetes api 交互,感知后端 service,pod 等的变化,自动更新配置并重载。

traefik 是一个前端负载均衡器,对于微服务架构尤其是 kubernetes 等编排工具具有良好的支持;

同 nginx 等相比,traefik 能够自动感知后端容器变化,从而实现自动服务发现。

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


2、部署 nginx-ingress-controller


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-ingress-service   NodePort    10.96.241.13   <none>        80:32383/TCP,8080:32133/TCP   103m   k8s-apptraefik-ingress-lb
traefik-web-ui            ClusterIP   10.96.67.119   <none>        80/TCP                        101m   k8s-apptraefik-ingress-lb

//访问 Traefik UI,浏览器访问 http://Nodeip:NodePort/dashboard/
http://192.168.80.14:32133/dashboard/

//Ingress HTTP 代理访问
cd /opt/ingress-nodeport

#创建 deployment、Service、Ingress Yaml 资源
vim ingress-nginx.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
spec:
  replicas: 2
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-test
spec:
  rules:
    - host: www.benet.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service: 
              name: nginx-svc
              port:
                number: 80


kubectl apply -f ingress-nginx.yaml

kubectl get svc,pods -o wide
NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP   23d   <none>
service/nginx-svc    ClusterIP   10.96.89.181   <none>        80/TCP    88m   name=nginx

NAME                             READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
pod/nginx-app-65d7b99f6b-nnw7q   1/1     Running   0          88m   10.244.2.4   node02   <none>           <none>
pod/nginx-app-65d7b99f6b-x47l8   1/1     Running   0          88m   10.244.1.5   node01   <none>           <none>


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.89.181

kubectl get svc -o wide -n kube-system | grep traefik
traefik-ingress-service   NodePort    10.96.241.13   <none>        80:32383/TCP,8080:32133/TCP   103m   k8s-apptraefik-ingress-lb
traefik-web-ui            ClusterIP   10.96.67.119   <none>        80/TCP                        101m   k8s-apptraefik-ingress-lb

#本地 host 添加域名解析
vim /etc/hosts
192.168.80.10 master
192.168.80.11 node01
192.168.80.12 node02
192.168.80.12 www.kgc.com www.benet.com

#模拟外部访问
curl http://www.benet.com:32383

#再刷新查看 Traefik UI 界面,会生成刚创建的集群信息
http://192.168.80.14:32133/dashboard/


 

### IngressIngress Controller 的概念及区别 #### 概念解释 Ingress 是 Kubernetes 中的一种资源对象,主要用于管理进入集群的 HTTP 和 HTTPS 流量。它提供了一种方式来定义规则,这些规则决定了如何将外部流量路由到集群内的不同服务[^5]。例如,在一个典型的场景中,可以通过配置 Ingress 规则将 `example.com/api` 路由到某个后端服务 `api-service`。 Ingress Controller 则是一种具体的实现工具或组件,负责监听和处理 Ingress 资源的变化,并根据其定义的规则动态更新自身的配置以完成流量的实际转发[^1]。常见的 Ingress Controller 实现有 NGINX、Traefik 和 HAProxy 等。 #### 主要区别 以下是 IngressIngress Controller 的主要区别: 1. **功能定位** - Ingress 定义的是静态的流量路由规则,描述了应该如何分配流量给不同的服务。 ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: cafe.example.com http: paths: - path: /coffee pathType: Prefix backend: service: name: coffee-svc port: number: 80 - path: /tea pathType: Prefix backend: service: name: tea-svc port: number: 80 ``` 上述 YAML 文件展示了如何通过路径 `/coffee` 和 `/tea` 将请求分别发送至对应的 Service[^3]。 - Ingress Controller 执行这些规则,实时调整自己的代理逻辑以满足 Ingress 资源的要求。 2. **部署位置** - Ingress 只是一个 API 对象,存储在 Kubernetes 集群的 etcd 数据库中。 - Ingress Controller 是运行在集群中的实际进程或 Pod,通常会暴露一个公共 IP 或负载均衡器以便接收外部流量[^4]。 3. **灵活性与扩展性** - 不同类型的 Ingress Controller 支持的功能可能有所差异,某些高级特性(如重试策略、限流等)取决于具体控制器的支持情况[^2]。 - Ingress 自身仅关注基本的路由规则,不涉及底层实现细节。 4. **工作流程** - 用户创建 Ingress 资源后,相应的 Ingress Controller 会检测到这一变化并重新加载配置文件以应用新的规则。 - 如果未安装合适的 Ingress Controller,则即使存在有效的 Ingress 资源也无法正常工作[^1]。 ```python from kubernetes import client, config config.load_kube_config() v1 = client.NetworkingV1Api() # 创建一个新的 Ingress 对象 ingress_spec = { 'rules': [ {'host': 'cafe.example.com', 'http': { 'paths': [ {'path': '/coffee', 'backend': {'service': {'name': 'coffee-svc', 'port': {'number': 80}}}}, {'path': '/tea', 'backend': {'service': {'name': 'tea-svc', 'port': {'number': 80}}}} ] }} ] } body = client.V1Ingress( api_version="networking.k8s.io/v1", kind="Ingress", metadata=client.V1ObjectMeta(name="example-ingress"), spec=client.V1IngressSpec(rules=[client.V1IngressRule(host='cafe.example.com', http=...)])) v1.create_namespaced_ingress(namespace="default", body=body) ``` 此 Python 示例演示了如何利用 Kubernetes SDK 动态生成 Ingress 资源。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曦雨天梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值