traefix 前篇是可以使用,这里k8s v1.14 之前的拿来用不上,然后折腾了一下,参考官方的折腾起来了
基于角色的访问控制配置(仅限Kubernetes 1.6+)
Kubernetes在1.6+中引入了基于角色的访问控制(RBAC),以允许对Kubernetes资源和API进行细粒度控制。群集配置了RBAC,则需要授权Traefik使用Kubernetes API。有两种方法可以设置适当的权限:通过特定于命名空间的RoleBindings或单个全局ClusterRoleBinding。
每个命名空间的RoleBinding可以限制授予权限,只有Traefik正在监视的名称空间才能使用,从而遵循最小权限原则。如果Traefik不应该监视所有名称空间,并且名称空间集不会动态更改,那么这是首选方法。否则,必须使用单个ClusterRoleBinding。
准备工作
下载trarfix代码,然后切换到v1.7的分支
1 | # git clone https://github.com/containous/traefik.git |
安装部署
使用ClusterRoleBinding
1 | # kubectl apply -f traefik-rbac.yaml |
对于命名空间限制,每个监视命名空间需要一个RoleBinding以及Traefik kubernetes.namespaces参数的相应配置。
使用Deployments部署或部署DaemonSet
可以将Traefik与Deployment或DaemonSet对象一起使用,而这两个选项各有利弊:
- 使用部署时,可伸缩性可以更好,因为在使用DaemonSet时您将拥有每个节点的Single-Pod模型,而在使用部署时,可能需要更少的基于环境的副本。
- 当节点加入群集时,DaemonSet会自动扩展到新节点,而部署窗格仅在需要时在新节点上进行调度。
- DaemonSets确保只有一个pod副本在任何单个节点上运行。如果要确保两个pod不在同一节点上,则部署需要关联设置
- 可以使用该NET_BIND_SERVICE功能运行DaemonSet ,这将允许它绑定到每个主机上的端口80/443 / etc。这将允许绕过kube-proxy,并减少流量跳跃。请注意,这违反了Kubernetes最佳实践指南,并提出了调度/扩展问题的可能性。尽管存在潜在问题,但这仍然是大多数入口控制器的选择。
Deployments部署
- 修改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
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---
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:
hostNetwork: true
serviceAccountName: traefik-ingress-controller
terminationGracePeriodSeconds: 60
containers:
- image: traefik:v1.7
name: traefik-ingress-lb
ports:
- name: http
containerPort: 80
hostPort: 80
- name: https
containerPort: 443
hostPort: 443
- name: admin
containerPort: 8080
securityContext:
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
args:
- --api
- --kubernetes
- --logLevel=INFO
- --web.metrics
- --metrics.prometheus
- --web.metrics.prometheus
- --kubernetes
- --traefiklog
- --traefiklog.format=json
- --accesslog
- --accesslog.format=json
- --accessLog.fields.headers.defaultMode=redact
- --insecureskipverify=true
- --defaultentrypoints=http,https
- --entrypoints=Name:https Address::443 TLS
- --entrypoints=Name:http Address::80
---
kind: Service
apiVersion: v1
metadata:
name: traefik-ingress-service
namespace: kube-system
labels:
k8s-app: traefik-ingress
spec:
selector:
k8s-app: traefik-ingress-lb
clusterIP: None
ports:
- protocol: TCP
port: 80
name: web
- protocol: TCP
port: 8080
name: admin
type: ClusterIP
参数:
- hostNetwork: 映射到本地网络
- name: https 增加443端口的映射
- securityContext,args: 参考官方
- Service: 增加labels标签,用于后期的prometheus监控
- 部署traefik-deployment
1 | # kubectl apply -f traefik-deployment.yaml |
DaemonSets 部署(可选)
1 | # kubectl apply -f traefik-ds.yaml |
- Deployments和DaemonSets之间存在一些显着差异:
- 部署具有更容易的向上和向下扩展可能性。它可以实现完整的pod生命周期,并支持Kubernetes 1.2的滚动更新。运行部署至少需要一个Pod。
- DaemonSet会自动扩展到满足特定选择器的所有节点,并保证一次填充一个节点。Kubernetes 1.7也完全支持滚动更新,适用于DaemonSets
检查部署
查看pod
1
2
3
4
5
6
7# kubectl --namespace=kube-system get pods
NAME READY STATUS RESTARTS AGE
coredns-5579b8778b-xw8m9 1/1 Running 2 3d21h
kubernetes-dashboard-65dfbf6f4f-hcgbb 1/1 Running 0 2d16h
metrics-server-94ff5d4cc-b97l5 1/1 Running 1 3d
tiller-deploy-5cbcf75545-rbzld 1/1 Running 0 17h
traefik-ingress-controller-c595665d6-cm7kh 1/1 Running 0 3m20s查看services
1
2
3
4
5
6
7# kubectl get services --namespace=kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.254.0.2 <none> 53/UDP,53/TCP,9153/TCP 3d21h
kubernetes-dashboard NodePort 10.254.214.153 <none> 443:32533/TCP 3d21h
metrics-server ClusterIP 10.254.61.132 <none> 443/TCP 3d
tiller-deploy ClusterIP 10.254.207.227 <none> 44134/TCP 17h
traefik-ingress-service NodePort 10.254.246.158 <none> 80:32146/TCP,8080:30455/TCP 3m53s
这里使用的是nodeport模式进行部署的,可以看到端口为32146,这里访问会返回404 page not found
,那是因为我们还没有给Traefik任何配置。
- 查看services 1
1
2
3# kubectl get services --namespace=kube-system |grep "traefik"
traefik-ingress-service ClusterIP None <none> 80/TCP,8080/TCP 7m55s
traefik-web-ui ClusterIP 10.254.78.17 <none> 80/TCP 21h
这个例子是修改过 traefik-deployment.yaml
的结果,明显没有nodeport的端口
创建一个服务和一个将公开Traefik Web UI的Ingres
1 | # kubectl apply -f ui.yaml |
在/etc/hosts 文件设置一个路由条目traefik-ui.minikube
在浏览器进行访问可以看到Traefik Web UI