跳转至

例子

前提

  • 设置DNS解析指向traefik的SVC地址

  • 当前解析knginx.ncaca.cn - 172.30.24.211

traefik    traefik    LoadBalancer   10.103.115.112   172.30.24.211   80:30336/TCP,443:30487/TCP      15

创建Deployment

# whoami.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami
spec:
  replicas: 2
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: docker.io/traefik/whoami:latest
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
  • 拉不到镜像执行
ctr -n k8s.io images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/traefik/whoami:latest
ctr -n k8s.io images tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/traefik/whoami:latest  docker.io/traefik/whoami:latest
root@master:~/k8s/traefik/whoami# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
whoami-6576876557-4gtmf   1/1     Running   0          2m13s
whoami-6576876557-xlp2g   1/1     Running   0          2m13s

创建SVC

# whoami-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: whoami
spec:
  ports:
    - port: 80
  selector:
    app: whoami
root@master:~/k8s/traefik/whoami# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   133d
whoami       ClusterIP   10.109.226.135   <none>        80/TCP    2s

创建Ingressroute

# whoami-ingressroute.yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: whoami
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`knginx.ncaca.cn`) && PathPrefix(`/whoami`)
      kind: Rule
      services:
        - name: whoami
          port: 80
root@master:~/k8s/traefik/whoami# kubectl get ingressroute
NAME     AGE
whoami   5m55s

为了彻底理清逻辑,我们可以把整个过程看作是一次“快递分拣”

1. entryPoints(大门):收货口

  • 配置意义:你在服务器上开了一个叫 web 的收货口,专门接收从 80 端口送进来的快递。
  • 物理属性:不管包裹最终去哪里,所有快递员都必须把车开到 80 号货位(即 web 门)。

2. IngressRoute(分拣员):看单派送

  • 配置意义:分拣员守在 web 这扇门后。
  • 分拣逻辑
  • 看到包裹上写着 PathPrefix(/whoami),分拣员就把它扔到 A 传送带
  • 看到包裹上写着 PathPrefix(/app2),分拣员就把它扔到 B 传送带

3. services(传送带):送到仓库

  • 配置意义:这是包裹离开 Traefik 后的路径。
  • 端口解耦
  • A 传送带连接的是 whoami 仓库,这个仓库的后门开在 80 端口。
  • B 传送带连接的是 app2 仓库,这个仓库的后门开在 8080 端口。

验证

直接访问knginx.ncaca.cn/whoami

Q&A

1. entrypoint是什么,web这个名字是固定的么

  • entryPoints(大门):收货口,web 就是这扇“大门”的名字,而这扇门在物理上绑定了服务器的某个端口(通常是 80)。这个80不是后端的具体服务,而是这扇门本身的端口

2. 如何查看traefik默认设定的entrypoint

  • 直接看deployment的yaml
kubectl edit deployment -n traefik traefik
   spec:
      automountServiceAccountToken: true
      containers:
      - args:
        - --entryPoints.metrics.address=:9100/tcp
        - --entryPoints.traefik.address=:8080/tcp
        - --entryPoints.web.address=:8000/tcp
        - --entryPoints.websecure.address=:8443/tcp
        - --api.dashboard=true
        - --ping=true
        - --metrics.prometheus=true
        - --metrics.prometheus.entrypoint=metrics
        - --providers.kubernetescrd
        - --providers.kubernetescrd.allowEmptyServices=true
        - --providers.kubernetesingress
        - --providers.kubernetesingress.allowEmptyServices=true
        - --providers.kubernetesingress.ingressendpoint.publishedservice=traefik/traefik
        - --providers.kubernetesgateway
        - --providers.kubernetesgateway.statusaddress.service.name=traefik
        - --providers.kubernetesgateway.statusaddress.service.namespace=traefik
        - --entryPoints.websecure.http.tls=true
        - --log.level=INFO
EntryPoint 端口 用途
web 8000 HTTP 流量(注意不是标准 80)
websecure 8443 HTTPS 流量(不是标准 443)
metrics 9100 Prometheus 监控指标
traefik 8080 Traefik Dashboard/API