使用traefik作为kubernetes的ingress

[toc]

说明

关于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,添加后效果如下:

原文地址:https://www.cnblogs.com/breezey/p/9113951.html

时间: 2024-10-08 22:34:19

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

kubernetes nginx ingress 使用记录

前言 ingress是一种可以暴露k8s集群内部service的方式,用户编辑配置文件定义一个ingress资源即可实现外部网络访问内网service. ingress controller是来管理所有的Ingress的对象,ingress controller内部其实是一个nginx的容器,当ingress controll 通过与 Kubernetes API 交互,感知集群中Ingress规则变化时会按照模板文件生成nginx.conf文件,然后reload该配置文件. 相对于kubern

kubernetes之Ingress部署

1,如何访问K8S中的服务: 1,Ingress介绍 Kubernetes 暴露服务的方式目前只有三种:LoadBlancer Service.NodePort Service.Ingress:前两种估计都应该很熟悉,下面详细的了解下这个 Ingress Ingress由两部分组成:Ingress Controller 和 Ingress 服务. Ingress Contronler 通过与 Kubernetes API 交互,动态的去感知集群中 Ingress 规则变化,然后读取它,按照自定义

Kubernetes之Ingress和Ingress Controller

目录 Kubernetes之Ingress和Ingress Controller 概念 Ingress资源类型 单Service资源型Ingress Ingress Nginx部署 部署Ingress controller 配置ingress后端服务 部署ingress-nginx service 部署Ingress 增加tomcat服务 总结 构建TLS站点 Kubernetes之Ingress和Ingress Controller 概念 通常情况下,service和pod的IP仅可在集群内部

12、kubernetes之ingress及Ingress Controller

一.概念 ClusterIP:例如svc所分配的ip地址 NodePort:k8s集群物理机机通信地址,client --> NodeIP:NodePort --> ClusterIP:ServicePort --> PodIP:containerPort No ClusterIP:Headless Service ,ServiceName --> PodIP Ingress:负责7层调度 二.ingress-nginx部署 # cat mandatory.yaml apiVers

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

1.部署 Traefik 由于我们需要将外部对于kubernetes的http请求全都转换成https,不想更改服务的配置以及代码,那我们可以选择在traefik上配置域名证书,这样通过域名对服务的访问将会自动转换成https请求. 1.1创建ClusterRole以及ClusterRoleBinding(Kubernetes1.6+) ingress-rbac.yaml文件: apiVersion: v1 kind: ServiceAccount metadata:   name: ingre

Kubernetes 使用 ingress 配置 https 集群(十五)

目录 一.背景 1.1 需求 1.2 Ingress 1.3 环境介绍 二.安装部署 2.1.创建后端 Pod 应用 2.2 创建后端 Pod Service 2.3.创建 ingress 资源 2.4.为 Nginx Pod 创建 Service 三.升级为 https 3.1 首先我们要制作证书 3.2.创建 secret 资源 3.3 更改 ingress 资源 3.4 浏览器访问验证 四.ingress 资源介绍 4.1.通过访问路径过滤 4.2.基于名称解析的虚拟主机 4.3.http

[系统集成] 用 Kubernetes Nginx Ingress 实现 HTTP 服务发布与负载均衡

用户在 Kubernetes 上部署的服务一般运行于私有网络,Pod和Service 提供了 hostPort,NodePort等参数用于暴露这些服务端口到K8S节点上,供使用者访问.这样的方法有明显缺点: 1)容易占用过多的主机端口: 2)服务端口暴露到多台主机会增加防火墙和安全配置的难度 3)默认的hostPort,NodePort方式没有负载均衡的作用 K8S的 Ingress 资源提供了另一种服务暴露的方法,它可以获取各个服务的状态,传递给nginx等工具进行配置修改.重新加载等工作,实

kubernetes 之ingress

1.Ingress组件介绍 Ingress解决的是新的服务加入后,域名和服务的对应问题,基本上是一个ingress的对象,通过yaml进行创建和更新进行加载. Ingress Controller是将Ingress这种变化生成一段Nginx的配置,然后将这个配置通过Kubernetes API写到Nginx的Pod中,然后reload. 2.生成一个默认的后端,如果遇到解析不到的URL就转发到默认后端页面 apiVersion: extensions/v1beta1 kind: Deployme

kubernetes 学习 ingress

1:查看ingress kubectl get ing -n default 2:   编辑ingress,而后会自动重启.         kubectl edit ing  XXXXXXXXX    3:    查看pod  kubectl get pods -n namespace 4:    查看log kubectl logs -f pod_name  -n namespace 原文地址:https://www.cnblogs.com/liufei1983/p/9280746.html