专栏首页python3traefik Ingress https配置

traefik Ingress https配置

一、概述

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版本

docker

ip

主机名

配置

centos 7.6

1.18.1

19.03.5

10.212.20.94

k8s-master

2核4G

centos 7.6

1.18.1

19.03.5

10.212.20.240

k8s-node01

2核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

效果如下:

三、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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Traefik-v2.x快速入门

    traefik 与 nginx 一样,是一款优秀的反向代理工具,或者叫 Edge Router。至于使用它的原因则基于以下几点

    py3study
  • python 文件处理

    python 读取一个文件,使用内置函数open() 通过下边的语法可以看到一个函数调用的东西,那就是传参数,如果有关键字指定,那么就写指定的,如果没有就按默认...

    py3study
  • python 创建自己的包

    创建一个文件夹:mymath,在该文件夹下创建三个python 文件,分别为:__init__.py   getMax.py     getMin.py

    py3study
  • 「走进k8s」Kubernetes1.15.1的外部服务发现 ingress(35)

    3.现在可以供大家使用的 Ingress controller 有很多,比如 traefik、nginx-controller、Kubernetes Ingre...

    IT故事会
  • python 文件处理

    python 读取一个文件,使用内置函数open() 通过下边的语法可以看到一个函数调用的东西,那就是传参数,如果有关键字指定,那么就写指定的,如果没有就按默认...

    py3study
  • 13-部署traefik-ingress插件

    程序员同行者
  • Kubernetes 中 traefik ingress 的使用

    简单的说,ingress就是从kubernetes集群外访问集群的入口,将用户的URL请求转发到不同的service上。Ingress相当于nginx、apac...

    kubernetes中文社区
  • 高负载下tokudb环境下sync_binlog 不同设置的影响

    今天上午在排查主库的sync_binlog的时候,发现之前有几台tokudb的sync_binlog不为1,于是修改为1了。 

    二狗不要跑
  • DAY93:阅读Coherency and Concurrency

    Simultaneous access to managed memory on devices of compute capability lower tha...

    GPUS Lady
  • FlinkConsumer是如何保证一个partition对应一个thread的

    版权声明:本文为博主原创,欢迎转载,转载请标明出处 Blog Address:http://blog.csdn...

    shengjk1

扫码关注云+社区

领取腾讯云代金券