traefik Ingress https配置

发布时间:2020-05-27 14:21:51编辑:admin阅读(2946)

    一、概述

    1、理解Ingress

    简单的说,ingress就是从kubernetes集群外访问集群的入口,将用户的URL请求转发到不同的service上。Ingress相当于nginx、apache等负载均衡方向代理服务器,其中还包括规则定义,即URL的路由信息,路由信息得的刷新由Ingress controller来提供。

    2、理解Ingress Controller

    Ingress Controller 实质上可以理解为是个监视器,Ingress Controller 通过不断地跟 kubernetes API 打交道,实时的感知后端 service、pod 等变化,比如新增和减少 pod,service 增加与减少等;当得到这些变化信息后,Ingress Controller 再结合下文的 Ingress 生成配置,然后更新反向代理负载均衡器,并刷新其配置,达到服务发现的作用。

    3、RBAC

    在开始之前,需要先了解一下什么是RBAC。RBAC(基于角色的访问控制)使用 rbac.authorization.k8s.io API 组来实现权限控制,RBAC 允许管理员通过 Kubernetes API 动态的配置权限策略。在 1.6 版本中 RBAC 还处于 Beat 阶段,如果想要开启 RBAC 授权模式需要在 apiserver 组件中指定 --authorization-mode=RBAC 选项。

    在 RBAC API 的四个重要概念: 

    Role:是一系列的权限的集合,例如一个角色可以包含读取 Pod 的权限和列出 Pod 的权限 

    ClusterRole: 跟 Role 类似,但是可以在集群中到处使用( Role 是 namespace 一级的) 

    RoloBinding:把角色映射到用户,从而让这些用户继承角色在 namespace 中的权限。 

    ClusterRoleBinding: 让用户继承 ClusterRole 在整个集群中的权限。

     

    二、部署traefik

    环境介绍

    系统k8s版本dockerip主机名配置
    centos 7.61.18.119.03.510.212.20.94k8s-master2核4G
    centos 7.61.18.119.03.510.212.20.240k8s-node012核8G

     

     

     

     

     

     

    traefik版本

    traefik目前主要有2个版本,分别是1.x和2.x。因为2个版本之间,配置文件差异比较大,目前网络上的博客文章都是基于1.x编写的。

    因此,本文采用1.x最后一个版本,镜像名为:traefik:v1.7.24-alpine

     

    配置证书

    https证书,是从阿里云购买的,买的通配符证书,1年1千多块钱左右。

    登录master节点,创建证书目录。

    mkdir /etc/kubernetes/ssl

    将证书上传到此目录,并重命名文件。

    目录结构如下:

    ./
    ├── tls.crt
    └── tls.key

    创建secret

    创建secret,保存https证书,注意操作目录,如果不是在此目录下操作,须指定绝对路径。

    cd /etc/kubernetes/ssl
    kubectl create secret generic ssl --from-file=tls.crt --from-file=tls.key -n kube-system

    如果需要配置traefik多域名证书形式,traefik能够自动识别证书。请参考文章底部提供的参考链接!

     

    打label标签

    为 k8s-node01 节点指定label标签为edgenode=true

    kubectl label nodes k8s-node01 edgenode=true

    配置yaml

    traefik.yaml

    这里面包含了rbac,DaemonSet,controller,traefik UI,https配置,configmap

    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: traefik-ingress-controller
    rules:
      - apiGroups:
          - ""
        resources:
          - services
          - endpoints
          - secrets
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - extensions
        resources:
          - ingresses
        verbs:
          - get
          - list
          - watch
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: traefik-ingress-controller
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: traefik-ingress-controller
    subjects:
    - kind: ServiceAccount
      name: traefik-ingress-controller
      namespace: kube-system
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: traefik-ingress-controller
      namespace: kube-system
    ---
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: traefik-conf
      namespace: kube-system
    data:
      traefik.toml: |
        insecureSkipVerify = true
        defaultEntryPoints = ["http","https"]
        [entryPoints]
          [entryPoints.http]
          address = ":80"
          [entryPoints.https]
          address = ":443"
            [entryPoints.https.tls]
              [[entryPoints.https.tls.certificates]]
              CertFile = "/ssl/tls.crt"
              KeyFile = "/ssl/tls.key"
    ---
    kind: DaemonSet
    apiVersion: apps/v1
    metadata:
      name: traefik-ingress-controller
      namespace: kube-system
      labels:
        k8s-app: traefik-ingress-lb
    spec:
      selector:
          matchLabels:
            k8s-app: traefik-ingress-lb
            name: traefik-ingress-lb
      template:
        metadata:
          labels:
            k8s-app: traefik-ingress-lb
            name: traefik-ingress-lb
        spec:
          serviceAccountName: traefik-ingress-controller
          tolerations:
          - key: node-role.kubernetes.io/master
            effect: NoSchedule
          terminationGracePeriodSeconds: 60
          hostNetwork: true
          #nodeSelector:
          #   ingress: traefik
          volumes:
          - name: ssl
            secret:
              secretName: ssl
          - name: config
            configMap:
              name: traefik-conf
          containers:
          - image: traefik:v1.7.24-alpine
            name: traefik-ingress-lb
            ports:
            - name: http
              containerPort: 80
              hostPort: 80
            - name: admin
              containerPort: 8080
            securityContext:
              privileged: true
            args:
            - --configfile=/config/traefik.toml
            - -d
            - --web
            - --kubernetes
            volumeMounts:
            - mountPath: "/ssl"
              name: "ssl"
            - mountPath: "/config"
              name: "config"
          nodeSelector:
            edgenode: "true"
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: traefik-ingress-service
    spec:
      selector:
        k8s-app: traefik-ingress-lb
      ports:
        - protocol: TCP
          port: 80
          name: web
        - protocol: TCP
          port: 8080
          name: admin
        - protocol: TCP
          port: 443
          name: https
      type: NodePort
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: traefik-web-ui
      namespace: kube-system
    spec:
      selector:
        k8s-app: traefik-ingress-lb
      ports:
      - port: 80
        targetPort: 8080
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: traefik-web-ui
      namespace: kube-system
      annotations:
        kubernetes.io/ingress.class: traefik
    spec:
      rules:
      - host: traefikui.test.com
        http:
          paths:
          - backend:
              serviceName: traefik-web-ui
              servicePort: 80

    使用DaemonSet类型来部署Traefik,并使用nodeSelector来限定Traefik所部署的主机。如果有dns,将域名解析到这所部署的主机即可。

     

    开始部署

    kubectl apply -f traefik.yaml

     

    访问traefik ui

    由于内网没有dns服务器,直接修改windows10的hosts文件,添加一条记录。

    10.212.20.240  traefikui.test.com

    注意:这里的10.212.20.240是Traefik所部署的主机。不是master节点ip

     

    访问http和https

    http://traefikui.test.com
    https://traefikui.test.com

    效果如下:

    1.png

     

     

    三、traefik发布应用

    现在k8s环境中,有一个vue开发的web后台。

    查看pod

    # kubectl get pods -n test
    NAME                           READY   STATUS    RESTARTS   AGE
    web-wxbweb-845994566c-4dcxt    1/1     Running   2          2d23h

    查看svc

    # kubectl get svc -n test
    NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)             AGE
    web-wxbweb   ClusterIP   10.1.43.224   <none>        7000/TCP,7001/TCP   2d23h

    目前的service类型是ClusterIP

     

    新建一个yaml,通过traefik来暴露访问。

    wxbweb-traefik.yaml

    kind: Ingress
    metadata:
      name: web-wxbweb
      namespace: test
      annotations:
        kubernetes.io/ingress.class: traefik
        traefik.frontend.rule.type: PathPrefixStrip
    spec:
      rules:
      - host: wxbweb.test.com
        http:
          paths:
          - path: /
            backend:
              serviceName: web-wxbweb
              servicePort: 7000

     

    发布一下

    kubectl apply -f wxbweb-traefik.yaml

     

    新增一条hosts记录

    10.212.20.240  wxbweb.test.com

     

    访问页面是否正常。

     

     

    2.0配置,请参考

    https://docs.traefik.io/user-guides/crd-acme/

     

    本文参考链接:

    https://www.cnblogs.com/cptao/p/10911918.html


关键字