本文介绍用traefik作为Ingress Controller的实现。
Traefik简介
官网: https://traefik.io/
Traefik是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。
可以通过Deployment或DaemonSet对象部署Traefik,而这两个选项各有利弊。
DaemonSet部署Traefik
- traefik-rbac.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller rules: - apiGroups: - "" resources: - services - endpoints - secrets verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses/status verbs: - update --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: traefik-ingress-controller subjects: - kind: ServiceAccount name: traefik-ingress-controller namespace: kube-system
|
- traefik-ds.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| --- apiVersion: v1 kind: ServiceAccount metadata: name: traefik-ingress-controller namespace: kube-system --- kind: DaemonSet apiVersion: extensions/v1beta1 metadata: name: traefik-ingress-controller namespace: kube-system labels: k8s-app: traefik-ingress-lb spec: template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 containers: - image: traefik:v1.7.14-alpine name: traefik-ingress-lb ports: - name: http containerPort: 80 hostPort: 80 - name: admin containerPort: 8080 hostPort: 8080 securityContext: capabilities: drop: - ALL add: - NET_BIND_SERVICE args: - --api - --kubernetes - --logLevel=INFO --- kind: Service apiVersion: v1 metadata: name: traefik-ingress-service namespace: kube-system spec: selector: k8s-app: traefik-ingress-lb ports: - protocol: TCP port: 80 name: web - protocol: TCP port: 8080 name: admin
|
- traefik-ui.yaml
- 此配置文件配置一条访问traefik-ui的ingress规则
- 然后访问traefik-ui.yfming.com即可查进入traefik-ui界面,记得配本地hosts映射
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| --- apiVersion: v1 kind: Service metadata: name: traefik-web-ui namespace: kube-system spec: selector: k8s-app: traefik-ingress-lb ports: - name: web port: 80 targetPort: 8080 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-web-ui namespace: kube-system spec: rules: - host: traefik-ui.yfming.com http: paths: - path: / backend: serviceName: traefik-web-ui servicePort: web
|
Deployment部署Traefik
- traefik-rbac.yaml,同上
- traefik-deployment.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| --- apiVersion: v1 kind: ServiceAccount metadata: name: traefik-ingress-controller namespace: kube-system --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: traefik-ingress-controller namespace: kube-system labels: k8s-app: traefik-ingress-lb spec: replicas: 1 selector: matchLabels: k8s-app: traefik-ingress-lb template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 containers: - image: traefik:v1.7.14-alpine name: traefik-ingress-lb ports: - name: http containerPort: 80 - name: admin containerPort: 8080 args: - --api - --kubernetes - --logLevel=INFO --- kind: Service apiVersion: v1 metadata: name: traefik-ingress-service namespace: kube-system spec: selector: k8s-app: traefik-ingress-lb type: NodePort ports: - protocol: TCP port: 80 name: web nodePort: 30800 - protocol: TCP port: 8080 name: admin nodePort: 30808
|
- traefik-ui.yaml同上
- 访问traefik-ui.yfming.com:30808,即可进入traefik-ui界面
部署测试服务
- stilton: 访问/路径会展示stilton
- cheddar:访问/路径会展示cheddar
- wensleydale:访问/路径会展示wensleydale
- cheese-deployments.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: stilton labels: app: cheese cheese: stilton spec: replicas: 2 selector: matchLabels: app: cheese task: stilton template: metadata: labels: app: cheese task: stilton version: v0.0.1 spec: containers: - name: cheese image: errm/cheese:stilton resources: requests: cpu: 100m memory: 50Mi limits: cpu: 100m memory: 50Mi ports: - containerPort: 80 --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: cheddar labels: app: cheese cheese: cheddar spec: replicas: 2 selector: matchLabels: app: cheese task: cheddar template: metadata: labels: app: cheese task: cheddar version: v0.0.1 spec: containers: - name: cheese image: errm/cheese:cheddar resources: requests: cpu: 100m memory: 50Mi limits: cpu: 100m memory: 50Mi ports: - containerPort: 80 --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: wensleydale labels: app: cheese cheese: wensleydale spec: replicas: 2 selector: matchLabels: app: cheese task: wensleydale template: metadata: labels: app: cheese task: wensleydale version: v0.0.1 spec: containers: - name: cheese image: errm/cheese:wensleydale resources: requests: cpu: 100m memory: 50Mi limits: cpu: 100m memory: 50Mi ports: - containerPort: 80
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| --- apiVersion: v1 kind: Service metadata: name: stilton spec: ports: - name: http targetPort: 80 port: 80 selector: app: cheese task: stilton --- apiVersion: v1 kind: Service metadata: name: cheddar spec: ports: - name: http targetPort: 80 port: 80 selector: app: cheese task: cheddar --- apiVersion: v1 kind: Service metadata: name: wensleydale spec: ports: - name: http targetPort: 80 port: 80 selector: app: cheese task: wensleydale
|
1 2 3 4 5
| 192.168.11.130 wensleydale.yfming.com 192.168.11.130 stilton.yfming.com 192.168.11.130 cheddar.yfming.com
192.168.11.130 cheeses.yfming.com
|
Name-based Routing
实验目标:
- 访问wensleydale.yfming.com,到wensleydale页面
- 访问stilton.yfming.com,到stilton页面
- 访问cheddar.yfming.com,到cheddar页面
- 如果Traefik是用deployment部署的,域名后要加端口30800,如果是通过DaemonSet部署的则不用加
- cheese-ingress-host.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| apiVersion: extensions/v1beta1 kind: Ingress metadata: name: cheese-ingress-host spec: rules: - host: stilton.yfming.com http: paths: - path: / backend: serviceName: stilton servicePort: http - host: cheddar.yfming.com http: paths: - path: / backend: serviceName: cheddar servicePort: http - host: wensleydale.yfming.com http: paths: - path: / backend: serviceName: wensleydale servicePort: http
|
- 访问测试
Path-based Routing
实验目标:
- 访问cheeses.yfming.com/stilton,到stilton页面
- 访问cheeses.yfming.com/cheddar,到cheddar页面
- 访问cheeses.yfming.com/wensleydale,到wensleydale页面
- 如果Traefik是用deployment部署的,域名后要加端口30800,如果是通过DaemonSet部署的则不用加
- cheese-ingress-path.yaml
下面annotations中的traefik.frontend.rule.type: PathPrefixStrip,作用剥离匹配路径的前缀,然后请求目标服务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| apiVersion: extensions/v1beta1 kind: Ingress metadata: name: cheese-ingress-path annotations: traefik.frontend.rule.type: PathPrefixStrip spec: rules: - host: cheeses.yfming.com http: paths: - path: /stilton backend: serviceName: stilton servicePort: http - path: /cheddar backend: serviceName: cheddar servicePort: http - path: /wensleydale backend: serviceName: wensleydale servicePort: http
|
- 访问测试
参考资料