注意这篇文档有个错误,须要改正一下: 一、nginx1-7.yaml nginx1-8.yaml traefik.yaml 这三个文件里面的80端口须要改为8080端口,不然报错,其余的文件不变。 2、若是忽然不能访问了,就把 8080从新改回来80 就能够访问了
三、严格按照下面的过程操做,先建立测试的nginx,再建立traefik全部相关的yaml文件, 在Kubernetes上使用Traefik Traefik介绍 部署测试用的两个服务 Role Based Access Control configuration (Kubernetes 1.6+ only) 部署Traefik 部署 Ingress 部署Traefik UI 访问测试 健康检查 提早下载镜像: docker pull nginx:1.7.9 docker pull nginx:1.8 docker pull traefik 1、Traefik介绍 traefik 是一个前端负载均衡器,对于微服务架构尤为是 kubernetes 等编排工具具备良好的支持;同 nginx 等相比,traefik 可以自动感知后端容器变化,从而实现自动服务发现。 因为微服务架构以及 Docker 技术和 kubernetes 编排工具最近几年才开始逐渐流行,因此一开始的反向代理服务器好比 nginx、apache 并未提供其支持,毕竟他们也不是先知; 因此才会出现 Ingress Controller 这种东西来作 kubernetes 和前端负载均衡器如 nginx 之间作衔接; 即 Ingress Controller 的存在就是为了能跟 kubernetes 交互,又能写 nginx 配置,还能 reload 它,这是一种折中方案; 而 traefik 天生就是提供了对 kubernetes 的支持,也就是说 traefik 自己就能跟 kubernetes API 交互,感知后端变化, 所以能够得知: 在使用 traefik 时,Ingress Controller 已经没什么用了, 2、部署测试用的两个服务 部署两个服务nginx1-7和nginx1-8,后面用Traefik去负载这两个服务:
注意:下面每一个service都是对应了两个pod副本,这样才能够实现service负载这两个pod cat>nginx1-7.yaml<<EOF apiVersion: v1 kind: Service metadata: name: frontend spec: ports: - port: 80 targetPort: 80 selector: app: nginx1-7 --- apiVersion: apps/v1beta1 kind: Deployment metadata: name: nginx1-7-deployment spec: replicas: 2 template: metadata: labels: app: nginx1-7 spec: containers: - name: nginx image: nginx:1.7.9 imagePullPolicy: IfNotPresent ports: - containerPort: 80 EOF cat>nginx1-8.yaml<<EOF apiVersion: v1 kind: Service metadata: name: my-nginx spec: ports: - port: 80 targetPort: 80 selector: app: nginx1-8 --- apiVersion: apps/v1beta1 kind: Deployment metadata: name: nginx1-8-deployment spec: replicas: 2 template: metadata: labels: app: nginx1-8 spec: containers: - name: nginx image: nginx:1.8 imagePullPolicy: IfNotPresent ports: - containerPort: 80 EOF 运行两个服务: [root@node1 nginx_ingress]# kubectl create -f nginx1-7.yaml service "frontend" created deployment "nginx1-7-deployment" created [root@node1 nginx_ingress]# kubectl create -f nginx1-8.yaml service "my-nginx" created deployment "nginx1-8-deployment" created 3、Role Based Access Control configuration (Kubernetes 1.6+ only) 这里部署的是1.13.0 集群,开启了RBAC,受权须要使用角色和绑定角色 cat>ingress-rbac.yaml<<EOF apiVersion: v1 kind: ServiceAccount metadata: name: ingress namespace: kube-system --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: ingress subjects: - kind: ServiceAccount name: ingress namespace: kube-system roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io EOF 4、部署Traefik cat>traefik-deploy.yaml<<EOF apiVersion: extensions/v1beta1 kind: Deployment metadata: name: traefik-ingress-lb namespace: kube-system labels: k8s-app: traefik-ingress-lb spec: template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb spec: terminationGracePeriodSeconds: 60 hostNetwork: true restartPolicy: Always serviceAccountName: ingress containers: - image: traefik imagePullPolicy: IfNotPresent name: traefik-ingress-lb resources: limits: cpu: 200m memory: 30Mi requests: cpu: 100m memory: 20Mi ports: - name: http containerPort: 80 hostPort: 80 - name: admin containerPort: 8580 hostPort: 8580 args: - --web - --web.address=:8580 - --kubernetes EOF
其中 traefik 监听 node 的 80 和 8580 端口,80 提供正常服务,8580 是其自带的 UI 界面,本来默认是 8080,由于环境里端口冲突了,因此这里临时改一下。 注意:这里用的是Deploy类型,没有限定该pod运行在哪一个主机上。 5、部署 Ingress
部署ingress这一步是核心。从下面的yaml文件里 host: traefik.nginx.io在traefik界面上是能够看到的,它对应前面的service名字my-nginx,而service里面的my-nginx对应两个pod副本,起到负载均衡做用html
一样:host: traefik.nginx.io在traefik界面上是能够看到的,它对应前面的service里面的frontend,而service名字frontend对应两个pod副本,起到负载均衡做用前端
cat>traefik.yaml<<EOF apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-ingress namespace: default spec: rules: - host: traefik.nginx.io http: paths: - path: / backend: serviceName: my-nginx servicePort: 80 - host: traefik.frontend.io http: paths: - path: / backend: serviceName: frontend servicePort: 80 EOF 其中的backend中要配置default namespace中启动的service名字,若是你没有配置namespace名字,默认使用default namespace,若是你在其余namespace中建立服务想要暴露到kubernetes集群外部,能够建立新的ingress.yaml文件,同时在文件中指定该namespace,其余配置与上面的文件格式相同。path就是URL地址后的路径,如traefik.frontend.io/path,service将会接受path这个路径,host最好使用service-name.filed1.filed2.domain-name这种相似主机名称的命名方式,方便区分服务。 根据实际环境中部署的service的名字和端口自行修改,有新service增长时,修改该文件后可使用kubectl replace -f traefik.yaml来更新。 6、部署Traefik UI traefik 自己还提供了一套 UI 供咱们使用,其一样以 Ingress 方式暴露,只须要建立一下便可。 cat>traefik-ui-service.yaml<<EOF 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: 8580 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-web-ui namespace: kube-system spec: rules: - host: traefik-ui.local http: paths: - path: / backend: serviceName: traefik-web-ui servicePort: web EOF
最后一块儿建立: [root@node1 traefik]# kubectl create -f . serviceaccount "ingress" created clusterrolebinding "ingress" created deployment "traefik-ingress-lb" created service "traefik-web-ui" created ingress "traefik-web-ui" created ingress "traefik-ingress" created 7、访问测试 一、查看traefik pod被分配到了哪台主机上: [root@node1 traefik]# kubectl get pods -n kube-system -l k8s-app=traefik-ingress-lb -o wide NAME READY STATUS RESTARTS AGE IP NODE traefik-ingress-lb-4237248072-1dg9n 1/1 Running 0 2m 172.16.7.152 172.16.7.152 浏览器输入http://172.16.7.152:8580/,将能够看到dashboard。以下图所示:左侧蓝色部分部分列出的是全部的rule,右侧绿色部分是全部的backend。 在Kubernetes集群的任意一个节点上执行。假如如今我要访问nginx的"/"路径。 curl -H Host:traefik.nginx.io http://172.16.7.152/ 若是须要在kubernetes集群之外访问就须要设置DNS,或者修改本机的hosts文件。 172.16.7.152 traefik.nginx.io 172.16.7.152 traefik.frontend.io 全部访问这些地址的流量都会发送给172.16.7.152这台主机,就是咱们启动traefik的主机。 Traefik会解析http请求header里的Host参数将流量转发给Ingress配置里的相应service。 修改hosts后就就能够在kubernetes集群外访问以上两个service。
二、下图左侧 Host:traefik.frontend.io 就是上面部署 Ingress里面定义的host,对应着下图右侧第二个框里面的内容node
三、下图右侧traefik.frontend.io/下面的service下面的两个连接就是最开始定义的第一个deopoyment里面的两个pod副本访问地址,而后负载这两个pod副本,至关于nginx负载后面两个相同的服务同样,以下所示:nginx
http://10.244.0.119:80 1
http://10.244.0.118:80 1web
四、查看traefik.frontend.io对应的负载均衡策略,默认是 Load Balancer Method wrr 轮询负载均衡机制,以下图所示,docker
8、健康检查 关于健康检查,测试可使用 kubernetes 的 Liveness Probe 实现,若是 Liveness Probe检查失败,则 traefik 会自动移除该 pod。 【示例】:咱们定义一个 test-health 的 deployment,健康检查方式是 cat /tmp/health,容器启动 2 分钟后会删掉这个文件,模拟健康检查失败。 test-health的deployment: [root@node1 traefik]# cat test-health-deploy.yaml apiVersion: v1 kind: Deployment apiVersion: extensions/v1beta1 metadata: name: test namespace: default labels: test: alpine spec: replicas: 1 selector: matchLabels: test: alpine template: metadata: labels: test: alpine name: test spec: containers: - image: mritd/alpine:3.4 name: alpine resources: limits: cpu: 200m memory: 30Mi requests: cpu: 100m memory: 20Mi ports: - name: http containerPort: 80 args: command: - "bash" - "-c" - "echo ok > /tmp/health;sleep 120;rm -f /tmp/health" livenessProbe: exec: command: - cat - /tmp/health initialDelaySeconds: 20 test-health-deploy.yaml test-health 的 service: [root@node1 traefik]# vim test-health-service.yaml apiVersion: v1 kind: Service metadata: name: test labels: name: test spec: ports: - port: 8123 targetPort: 80 selector: name: test test-health-service.yaml test-health的 Ingress: [root@node1 traefik]# vim test-health-ingress.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: test spec: rules: - host: test.com http: paths: - path: / backend: serviceName: test servicePort: 8123 test-health-ingress.yaml 所有建立好之后,进入 traefik ui 界面,能够观察到每隔 2 分钟健康检查失败后,kubernetes 重建 pod,同时 traefik 会从后端列表中移除这个 pod。
报错解决:
一、出现下面状况属于正常,刷新界面、或者等几分钟,过一会本身就会恢复。不要乱改yaml文件,越改越乱。多是笔记本的磁盘空间小了,如今还剩20G,也可能笔记本配置低![]()
二、过一会只看到frontend,my-nginx会挂掉。不用管,只看frontend就行,这就是负载后面两个pod副本,达到了目的
参照:http://www.mamicode.com/info-detail-2109270.html 原文地址:http://www.cnblogs.com/zhaojiankai/p/7898282.htmltraefik实现负载均衡参照:https://www.cnblogs.com/aguncn/p/7210830.html