例子
前提
-
设置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端口。
验证
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 |