博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用traefik作为kubernetes的ingress
阅读量:7088 次
发布时间:2019-06-28

本文共 5962 字,大约阅读时间需要 19 分钟。

目录

说明

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

部署

创建一个独立的命名空间

kubectl create ns ingress

配置rbac授权

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

traefik.rbac.yaml示例如下:

apiVersion: v1kind: ServiceAccountmetadata:  labels:    k8s-app: traefik-ingress-controller  name: traefik-ingress-controller  namespace: ingress---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:  name: traefik-ingress-controller  labels:    k8s-app: traefik-ingress-controllerroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: cluster-adminsubjects:- 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: v1kind: ConfigMapmetadata:  name: traefik-conf  namespace: ingressdata:  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/v1beta1kind: Deploymentmetadata:  name: traefik-ingress-lb  namespace: ingress  labels:    k8s-app: traefik-ingress-lbspec:  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: v1kind: Servicemetadata:  name: traefik-web-ui  namespace: ingressspec:  clusterIP: None  selector:    k8s-app: traefik-ingress-lb  ports:  - name: web    port: 8580    targetPort: 8580

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

apiVersion: extensions/v1beta1kind: Ingressmetadata:  annotations:    kubernetes.io/ingress.class: traefik  name: traefik-web-ui  namespace: ingressspec:  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.yamlkubectl 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中查看:

prometheus-target

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

grafana-traefik

转载于:https://www.cnblogs.com/lifeliker0086/p/10332684.html

你可能感兴趣的文章
【分享】开源富文本编辑器之间的较量
查看>>
logback的使用和logback.xml详解
查看>>
Android Studio -- 关联源码
查看>>
leetcode Majority Element
查看>>
去除sql的前后半角全角空格
查看>>
图片在容器里水平垂直居中
查看>>
015PHP文件处理——文件处理flock 文件锁定 pathinfo realpath tmpfile tempname
查看>>
关系型数据库之MySQL
查看>>
算法笔记-二叉树
查看>>
编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,并输出计算结果总是100的所有可能性。...
查看>>
Java异常处理课后作业
查看>>
hrtf 旋转音效matlab实现
查看>>
__attribute__
查看>>
【Android每日一讲】2012.11.06 Android变脸 - 主题(Theme)实现
查看>>
redis 系列12 哈希对象
查看>>
QTP使用心得
查看>>
js/jq ajax+数组。个人整理
查看>>
mac 下批量转换文件类型
查看>>
何为DOM对象
查看>>
linux的yum仓库配置
查看>>