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
View Code

 

使用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM