说明

关于kubernetes的服务暴露方式以及traefik的原理篇这里不作详细说明。traefik的原理可以参考官方文档:https://docs.traefik.io/ ,而关于kubernetes的服务暴露方式以及将traefik作为kubernetes的ingress使用的基本原理也可以参考这篇文档:https://mritd.me/2016/12/06/try-traefik-on-kubernetes/ 。这篇文档主要阐述将traefik作为kubernetes的ingress的实际操作,包括在traefik中启用https,将traefik的日志输出为json并通过filebeat收集,以及通过prometheus监控traefik。

部署

创建一个独立的命名空间

kubectl create ns ingress

配置rbac授权

我这里kubernetes使用1.8且启用了rbac授权。官方的traefik-rbac.yaml文件可以参考:https://raw.githubusercontent.com/containous/traefik/master/examples/k8s/traefik-rbac.yaml ,但在我实际测试中,还是有问题。我这里直接采用了一个偷懒的做法,直接给了最大权限。 下面的配置文件中,先创建了一个serviceaccount名称为traefik-ingress-controller,然后直接为这个serviceaccount授予了cluster-admin的权限

traefik.rbac.yaml示例如下:

apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: traefik-ingress-controller
name: traefik-ingress-controller
namespace: ingress
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: traefik-ingress-controller
labels:
k8s-app: traefik-ingress-controller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: traefik-ingress-controller
namespace: ingress

配置secret

我们将traefik作为ingress时,需要其同时处理https请求,所以需要为traefik配置证书文件。在这里将证书文件和key文件放入到secret中。我这里两个文件的名称分别是dz11.com.crt和dz11.com.key。创建secret方法如下:

kubectl create secret tls dz11-ingress-secret --key dz11.com.key --cert dz11.com.crt -n ingress

创建一个configmap用于存放traefik的配置文件

traefik.configmap.yaml配置如下:

apiVersion: v1
kind: ConfigMap
metadata:
name: traefik-conf
namespace: ingress
data:
traefik.toml: |
defaultEntryPoints = ["http", "https"]
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[[entryPoints.https.tls.certificates]]
certFile = "/keys/dz11.com.crt"
keyFile = "/keys/dz11.com.key"
#traefikLogsFile = "log/traefik.log"
[accessLog]
filePath = "/logs/traefik.access.log"
format = "json"

需要说明的是,我这里同时支持http和https,并没有做http强制跳转到https。如果需要http强制跳转到https,可以参考如下配置:

defaultEntryPoints = ["http", "https"]
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[[entryPoints.https.tls.certificates]]
certFile = "/keys/dz11.com.crt"
keyFile = "/keys/dz11.com.key"
#traefikLogsFile = "log/traefik.log"
[accessLog]
filePath = "/logs/traefik.access.log"
format = "json"

另外,在上面的配置中,我启动了traefik的访问日志,并将格式指定为json,这是为了方便后面直接通过filebeat作收集。这里也需要说明下,traefik的两种日志,一种是traefik服务自身的日志,另一种是访问日志。我这里只启用了访问日志。默认traefik的服务日志会通过容器的标准输出打印。

配置traefik的deployment文件

在这里我采用nodeSelecter的方式将traefik固定在指定的两个节点上,如果采用deployment的方式部署,需要在选定的节点上先打好标签。

traefik.dm.yaml配置如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: traefik-ingress-lb
namespace: ingress
labels:
k8s-app: traefik-ingress-lb
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 0
replicas: 2
selector:
matchLabels:
k8s-app: traefik-ingress-lb
template:
metadata:
labels:
k8s-app: traefik-ingress-lb
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8580"
spec:
terminationGracePeriodSeconds: 60
hostNetwork: true
restartPolicy: Always
volumes:
- name: traefik-config
configMap:
name: traefik-conf
- name: traefik-key
secret:
secretName: dz11-ingress-secret
- name: traefik-log
hostPath:
path: /mnt/srvlogs
- name: localtime
hostPath:
path: /etc/localtime
containers:
- image: dyhub.douyucdn.cn/library/traefik:v1.4.3
name: traefik-ingress-lb
# resources:
# limits:
# cpu: 200m
# memory: 30Mi
# requests:
# cpu: 100m
# memory: 20Mi
securityContext:
privileged: true
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
- name: admin
containerPort: 8580
volumeMounts:
- mountPath: "/config"
name: "traefik-config"
- mountPath: "/logs"
name: "traefik-log"
- mountPath: "/keys"
name: "traefik-key"
- mountPath: "/etc/localtime"
name: "localtime"
args:
- --configfile=/config/traefik.toml
- --web
- --web.address=:8580
- --kubernetes
- --web.metrics.prometheus
serviceAccountName: traefik-ingress-controller
nodeSelector:
proxy: "true"
ingress: "traefik"

需要说明的是,通过volumeMounts的方式将访问日志以及https证书及密钥进行了相关挂载。然后在启动参数中,指定--web.metrics.prometheus参数以暴露metrics供prometheus收集,另外指定了管理端口为8580。

最后创建上面配置的所有资源:

kubectl create -f ./

到此,traefik在kubernetes上部署完成。

配置服务

这里是一个将traefik-ui作为traefik的代理后端的示例。

先创建一个service文件traefik-ui.svc.yaml示例如下:

apiVersion: v1
kind: Service
metadata:
name: traefik-web-ui
namespace: ingress
spec:
clusterIP: None
selector:
k8s-app: traefik-ingress-lb
ports:
- name: web
port: 8580
targetPort: 8580

再创建一个traefik-ui.ingress.yaml文件如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: traefik
name: traefik-web-ui
namespace: ingress
spec:
tls:
# - hosts:
# - traefik-ui.dz11.com
- secretName: dz11-ingress-secret
rules:
- host: traefik-ui.dz11.com
http:
paths:
- path: /
backend:
serviceName: traefik-web-ui
servicePort: web

创建相关资源:

kubectl create -f ./traefik-ui.svc.yaml
kubectl create -f ./traefik-ui.ingress.yaml

配置好dns解析,即可通过traefik-ui.dz11.com来访问traefik-ui服务,http和https同时支持,且不会强制跳转。

通过prometheus监控traefik

在启动traefik时,使用了--web.metrics.prometheus选项,这时只需要将traefik服务的ip及admin端口添加至prometheus的配置文件中即可。如下:

  - job_name: 'traefik'
static_configs:
- targets: ['10.1.61.147:8580','10.1.61.138:8580']

重启prometheus:

systemctl restart prometheus

在本次示例中,prometheus未运行于kubernetes中,而是独立部署

在prometheus的status的target中查看:

在grafana中添加dashboard,这里采用的官方的id为2870的dashboard,添加后效果如下:

使用traefik作为kubernetes的ingress的更多相关文章

  1. Traefik实现Kubernetes集群服务外部https访问

    转载请注明出处:http://www.cnblogs.com/wayneiscoming/p/7707942.html traefik 是一个前端http反向代理服务器以及负载均衡器,支持多种微服务后 ...

  2. 【转】Kubernetes的Ingress控制器比较

    Kubernetes的Ingress控制器比较 fiisio Kubernetes/云计算/资源调度/Go语言 21 人赞同了该文章 翻译:https://medium.com/flant-com/c ...

  3. kubernetes nginx ingress 使用记录

    前言 ingress是一种可以暴露k8s集群内部service的方式,用户编辑配置文件定义一个ingress资源即可实现外部网络访问内网service. ingress controller是来管理所 ...

  4. kubernetes之ingress及ingress controller

    什么是ingress Ingress是授权入站连接到达集群服务的规则集合. 从外部流量调度到nodeprot上的service 从service调度到ingress-controller ingres ...

  5. kubernetes nginx ingress controller部署

    Kubernetes nginx ingress controller部署 1.下载kubernetes nginx的yaml文件 Wget https://raw.githubusercontent ...

  6. 为什么我不使用Kubernetes的Ingress

    为什么我不使用Kubernetes的Ingress 很不幸,据我所知Kubernetes的文档不是很完美,这就是为什么有很多同学在使用它的时候会遇到很多的坑,Ingress这个组件就是这些坑中的一个. ...

  7. 【转帖】kubernetes 部署ingress

    kubernetes 部署ingress https://www.cnblogs.com/dingbin/p/9754993.html 明天尝试一下 之前的文档里面一直没有提 需要改host文件 我有 ...

  8. kubernetes 部署ingress

    kubernetes Ingess 是有2部分组成,Ingress Controller 和Ingress服务组成,常用的Ingress Controller 是ingress-nginx,工作的原理 ...

  9. 干货分享:如何使用Kubernetes的Ingress API

    您可以通过使用诸如Kong for Kubernetes的Ingress控制器(使用自定义资源定义并提供许多插件)来极大地扩展Ingress资源的功能. Kubernetes正在整个技术行业中得到采用 ...

随机推荐

  1. Scrum立会报告+燃尽图(Final阶段第三次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2481 项目地址:https://coding.net/u/wuyy694 ...

  2. Daily Scrum (2015/10/29)

    今天晚上我们学霸项目的三个小组在一起开会,讨论如何能在后期使我们三个项目更好地结合在一起.为了三个小组的能够同时工作,不出现某一小组因需要其他小组成果而停滞的情况,我们决定围绕lucene,solr, ...

  3. 福大软工1816 · 评分结果 · Alpha冲刺答辩总结

    作业地址:https://edu.cnblogs.com/campus/fzu/Grade2016SE/homework/2462 作业提交准则 按时交 - 有分 晚交 - 0分 迟交一周以上 - 倒 ...

  4. Leetcode题库——11.盛最多水的容器

    @author: ZZQ @software: PyCharm @file: maxArea.py @time: 2018/10/11 21:47 说明:给定 n 个非负整数 a1,a2,...,an ...

  5. String 类 常用函数

    构造方法摘要: String(byte[] bytes)           通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String. String(char[] value) ...

  6. angularJS1笔记-(5)-过滤器练习

    html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  7. [至顶网] Win2019 发布 LTSC 10年支持期

    Windows Server 2019新特性:Linux.HCI…… Windows Server 2019是微软公司长期服务渠道(简称LTSC)之下新一轮的迭代产品,其中囊括大量新的特性以及部分管理 ...

  8. java异常处理常见处理

    反例之一:丢弃异常结论一:既然捕获了异常,就要对它进行适当的处理.不要捕获异常之后又把它丢弃,不予理睬. 反例之二:不指定具体的异常 结论二:在catch语句中尽可能指定具体的异常类型,必要时使用多个 ...

  9. 惭愧, eclipse 之 build path

    算下来大学到现在已近用了很久的 eclipse 了, 包括 myeclipse, 但是今天碰到的问题让我很惭愧, 一个老项目的编译都搞了好久. 环境: Myeclipse 6.X Struts 1.X ...

  10. 9款最佳的Linux文件比较工具

    程序员和撰稿人在编写程序文件或平常的文本文件时,有时想知道两个文件或同一文件的两个版本之间的差异.你在Linux上比较两个计算机文件时,文件内容之间的差异就叫diff.这一描述来源于提到diff的输出 ...