1. 程式人生 > 其它 >K8S ingress控制器

K8S ingress控制器

文章轉載自:
K8S ingress控制器 (一)https://blog.51cto.com/u_13760351/2728917
K8S ingress控制器 (二)https://blog.51cto.com/u_13760351/2744342
K8S ingress控制器 (三)https://blog.51cto.com/u_13760351/2764008

K8S ingress控制器 (一)

ingress controller可以為外網使用者訪問K8S叢集內部pod提供代理服務。

提供全域性訪問代理
訪問流程: 使用者–>ingress controller–>service–>pod

ingress控制器種類:

Kubernetes Ingress Controller

參考 http://github.com/kubernetes/ingress-nginx
實現:Go/Lua(nginx 是用 C 寫的)
許可證:Apache 2.0
Kubernetes 的“官方”控制器(之所以稱為官方,是想把它區別於 NGINX 公司的控制器)。這是社群開發的控制器,它基於 nginx Web 伺服器,並補充了一組用於實現額外功能的 Lua 外掛。
由於 NGINX 十分流行,再加上把它用作控制器時所需的修改較少,它對於 K8s 普通工程師來說,可能是最簡單和最直接的選擇。

NGINX Ingress Controller

參考 http://github.com/nginxinc/kubernetes-ingress
實現:Go
許可證:Apache 2.0
這是 NGINX 公司開發的官方產品,它也有一個基於 NGINX Plus 的商業版。NGINX 的控制器具有很高的穩定性、持續的向後相容性,且沒有任何第三方模組。
由於消除了 Lua 程式碼,和官方控制器相比,它保證了較高的速度,但也因此受到較大限制。相較之下,它的付費版本有更廣泛的附加功能,如實時指標、JWT 驗證、主動健康檢查等。
NGINX Ingress 重要的優勢是對 TCP/UDP 流量的全面支援,最主要缺點是缺乏流量分配功能。

Traefik

參考 http://github.com/containous/traefik
實現:Go
許可證:MIT
最初,這個代理是為微服務請求及其動態環境的路由而建立的,因此具有許多有用的功能:連續更新配置(不重新啟動)、支援多種負載均衡演算法、Web UI、指標匯出、對各種服務的支援協議、REST API、Canary 版本等。
支援開箱即用的 Let’s Encrypt 是它的另一個不錯的功能,但它的主要缺點也很明顯,就是為了控制器的高可用性,你必須安裝並連線其 Key-value store。
在 2019 年 9 月釋出的 Traefik v2.0 中,雖然它增加許多不錯的新功能,如帶有 SNI 的 TCP/SSL、金絲雀部署、流量映象/shadowing 和經過改進的 Web UI,但一些功能(如 WAF 支援)還在策劃討論中。
與新版本同期推出的還有一個名叫 Maesh 的服務網格,它建在 Traefik 之上。

Istio Ingress

參考 http://istio.io/docs/tasks/traffic-management/ingress
實現:Go
許可證:Apache 2.0
Istio 是 IBM、Google 和 Lyft 的聯合開發專案,它是一個全面的服務網格解決方案——不僅可以管理所有傳入的外部流量(作為 Ingress 控制器),還可以控制叢集內部的所有流量。
Istio 將 Envoy 用作每種服務的輔助代理。從本質上講,它是一個可以執行幾乎所有操作的大型處理器,其中心思想是最大程度的控制、可擴充套件性、安全性和透明性。
通過 Istio Ingress,你可以對流量路由、服務之間的訪問授權、均衡、監控、金絲雀釋出等進行優化。

Kong Ingress

參考 http://github.com/Kong/kubernetes-ingress-controller
實現:Go
許可證:Apache 2.0
Kong Ingress 由 Kong Inc 開發,有兩個版本:商業版和免費版。它基於 NGINX 構建,並增加了擴充套件其功能的 Lua 模組。
最初,Kong Ingress 主要用作 API 閘道器,用於 API 請求的處理和路由。現在,它已經成為成熟的 Ingress 控制器,主要優點是擁有大量易於安裝和配置的附加模組、外掛(包括第三方外掛)。它開啟了控制器具備大量附加功能的先河,其內建函式也提供了許多可能性。Kong Ingress 配置是用 CRD 執行的。
Kong Ingress 的一個重要特性是它只能在一個環境中執行(而不支援跨名稱空間)。這是一個頗有爭議的話題:有些人認為這是一個缺點,因為必須為每個環境生成例項;而另一些人認為這是一個特殊特性,因為它是更高級別的隔離,控制器故障的影響僅限於其所在的環境。

HAProxy Ingress

參考 http://github.com/jcmoraisjr/haproxy-ingress
實現:Go(HAProxy 是用 C 寫的)
許可證:Apache 2.0
HAProxy 是眾所周知的代理伺服器和負載均衡器。作為 Kubernetes 叢集的一部分,它提供了“軟”配置更新(無流量損失)、基於 DNS 的服務發現和通過 API 進行動態配置。 HAProxy 還支援完全自定義配置檔案模板(通過替換 ConfigMap)以及在其中使用 Spring Boot 函式。
通常,工程師會把重點放在已消耗資源的高速、優化和效率上。而 HAProxy 的優點之一正是支援大量負載均衡演算法。值得一提的是,在今年 6 月釋出的 v2.0 中,HAProxy 增加了許多新功能,其即將推出的 v2.1 有望帶來更多新功能(包括 OpenTracing 支援)。

Voyager

參考 http://github.com/appscode/voyager
實現:Go
許可證:Apache 2.0
Voyager 基於 HAProxy,並作為一個通用的解決方案提供給大量供應商。它最具代表性的功能包括 L7 和 L4 上的流量負載均衡,其中,TCP L4 流量負載均衡稱得上是該解決方案最關鍵的功能之一。
在今年早些時候,儘管 Voyager 在 v9.0.0 中推出了對 HTTP/2 和 gRPC 協議的全面支援,但總的來看,對證書管理(Let’s Encrypt 證書)的支援仍是 Voyager 整合的最突出的新功能。

Contour

參考 http://github.com/heptio/contour
實現:Go
許可證:Apache 2.0
Contour 和 Envoy 由同一個作者開發,它基於 Envoy。它最特別的功能是可以通過 CRD(Ingreoute)管理 Ingress 資源,對於多團隊需要同時使用一個叢集的組織來說,這有助於保護相鄰環境中的流量,使它們免受 Ingress 資源更改的影響。
它還提供了一組擴充套件的負載均衡演算法(映象、自動重複、限制請求率等),以及詳細的流量和故障監控。對某些工程師而言,它不支援粘滯會話可能是一個嚴重缺陷。

Ambassador

參考 http://github.com/datawire/ambassador
實現:Python
許可證:Apache 2.0
Ambassador 也是一個基於 Envoy 的解決方案,它有免費版和商業版兩個版本。
Ambassador 被稱為“Kubernetes 原生 API 微服務閘道器”,它與 K8s 原語緊密整合,擁有你所期望的從 Ingress controller 獲得的功能包,它還可以與各種服務網格解決方案,如 Linkerd、Istio 等一起使用。
順便提一下,Ambassador 部落格日前釋出了一份基準測試結果,比較了 Envoy、HAProxy 和 NGINX 的基礎效能。

Gloo

參考 http://github.com/solo-io/gloo
實現:Go
許可證:Apache 2.0
Gloo 是在 Envoy 之上構建的新軟體(於 2018 年 3 月釋出),由於它的作者堅持認為“閘道器應該從功能而不是服務中構建 API”,它也被稱為“功能閘道器”。其“功能級路由”的意思是它可以為後端實現是微服務、無伺服器功能和遺留應用的混合應用路由流量。
由於擁有可插拔的體系結構,Gloo 提供了工程師期望的大部分功能,但是其中一些功能僅在其商業版本(Gloo Enterprise)中可用。

Skipper

參考 http://github.com/zalando/skipper
實現:Go
許可證:Apache 2.0
Skipper 是 HTTP 路由器和反向代理,因此不支援各種協議。從技術上講,它使用 Endpoints API(而不是 Kubernetes Services)將流量路由到 Pod。它的優點在於其豐富的過濾器集所提供的高階 HTTP 路由功能,工程師可以藉此建立、更新和刪除所有 HTTP 資料。
Skipper 的路由規則可以在不停機的情況下更新。正如它的作者所述,Skipper 可以很好地與其他解決方案一起使用,比如 AWS ELB。

K8S ingress控制器 (二)

nginx ingress controller

參考連結:https://www.nginx.com/products/nginx/kubernetes-ingress-controller

一、nginx ingress controller部署

專案地址:https://github.com/kubernetes/ingress-nginx
安裝文件地址: https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/docs/deploy/index.md

1.下載並修改配置檔案

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: tcp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: udp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nginx-ingress-serviceaccount
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: nginx-ingress-clusterrole
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
rules:
  - apiGroups:
      - ""
    resources:
      - configmaps
      - endpoints
      - nodes
      - pods
      - secrets
    verbs:
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - nodes
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - services
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - events
    verbs:
      - create
      - patch
  - apiGroups:
      - "extensions"
      - "networking.k8s.io"
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - "extensions"
      - "networking.k8s.io"
    resources:
      - ingresses/status
    verbs:
      - update
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
  name: nginx-ingress-role
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
rules:
  - apiGroups:
      - ""
    resources:
      - configmaps
      - pods
      - secrets
      - namespaces
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - configmaps
    resourceNames:
      - "ingress-controller-leader-nginx"
    verbs:
      - get
      - update
  - apiGroups:
      - ""
    resources:
      - configmaps
    verbs:
      - create
  - apiGroups:
      - ""
    resources:
      - endpoints
    verbs:
      - get
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: nginx-ingress-role-nisa-binding
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: nginx-ingress-role
subjects:
  - kind: ServiceAccount
    name: nginx-ingress-serviceaccount
    namespace: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: nginx-ingress-clusterrole-nisa-binding
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: nginx-ingress-clusterrole
subjects:
  - kind: ServiceAccount
    name: nginx-ingress-serviceaccount
    namespace: ingress-nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/part-of: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
      annotations:
        prometheus.io/port: "10254"
        prometheus.io/scrape: "true"
    spec:
      terminationGracePeriodSeconds: 300
      hostNetwork: true  	# 需要新增這句,使用主機網路
      serviceAccountName: nginx-ingress-serviceaccount
      nodeSelector:
        kubernetes.io/os: linux
      containers:
        - name: nginx-ingress-controller
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
          args:
            - /nginx-ingress-controller
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --publish-service=$(POD_NAMESPACE)/ingress-nginx
            - --annotations-prefix=nginx.ingress.kubernetes.io
          securityContext:
            allowPrivilegeEscalation: true
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
            runAsUser: 101
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
            - name: https
              containerPort: 443
              protocol: TCP
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
          lifecycle:
            preStop:
              exec:
                command:
                  - /wait-shutdown
---
apiVersion: v1
kind: LimitRange
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  limits:
  - min:
      memory: 90Mi
      cpu: 100m
    type: Container

2.應用配置檔案

kubectl apply -f mandatory.yaml

驗證部署結果,注意映象較大,可提前下載至叢集node節點中。

kubectl get pods -n ingress-nginx
hostNetwork: true的補充說明:
此引數為true表示pod使用主機網路,也就是pod的IP就是node的IP
但同一個deployment裡的pod副本數如果為2或越過2,在同一個node上只能啟一個pod *
# vim deployment-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
spec:
  replicas: 2		# 副本數為2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      hostNetwork: true	   # 加上這一句
      containers:
      - name: c1
        image: nginx:1.15-alpine
kubectl apply -f deployment-nginx.yaml
kubectl get pods -o wide

可以看到pod-IP就是node-IP,而且只能啟動成功一個副本

二、ingress-http案例

1.建立deployment

# vim nginx.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: ingress-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: c1
        image: nginx:1.15-alpine
        imagePullPolicy: IfNotPresent

2.應用YAML

kubectl create namespace ingress-nginx
kubectl apply -f nginx.yml

3.驗證pod

kubectl get pods -n ingress-nginx

4.建立service

# vim nginx-service.yml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: ingress-nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx

5.應用YAML

kubectl apply -f nginx-service.yml

6.驗證service

kubectl get svc -n ingress-nginx

7.建立ingress

# vim ingress-nginx.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx        #自定義ingress名稱
  namespace: ingress-nginx
spec:
  rules:
  - host: www.daniel.com      # 自定義域名
    http:
      paths:
      - backend:
          serviceName: nginx-service  # 對應上面建立的service名稱
          servicePort: 80

8.應用YAML

kubectl apply -f ingress-nginx.yaml

9.驗證ingress

kubectl get ingress -n ingress-nginx

檢視ingress資訊

kubectl describe ingress ingress-nginx -n ingress-nginx

nginx-service:80 (172.20.104.48:80,172.20.166.190:80) 與下面查詢的兩個pod的IP對應

kubectl get pods -o wide -n ingress-nginx

可以看到兩個pod的IP正好對應ingress域名對應的IP

確認nginx-ingress-controller的podIP為192.168.154.139

模擬客戶端訪問

1, 確認nginx-ingress-controller的podIP,

下面命令查詢的結果為192.168.154.139
kubectl get pods -o wide -n ingress-nginx |grep ingress

2, 在叢集之外任一主機中(我這裡為hostos)新增上述域名與IP地址解析(模擬公網DNS)

[root@hostos ~]# vim /etc/hosts

192.168.154.139 www.daniel.com

3, 準備pod內容器執行的web主頁

kubectl get pods -n ingress-nginx

kubectl exec -it nginx-79654d7b8-6vn4v -n ingress-nginx  -- /bin/sh
/ # echo "ingress web1" > /usr/share/nginx/html/index.html
/ # exit

kubectl exec -it nginx-79654d7b8-vtqrl -n ingress-nginx  -- /bin/sh
/ # echo "ingress web2" > /usr/share/nginx/html/index.html
/ # exit

4, 訪問及結果展示

[root@hostos ~]# curl www.daniel.com

三、 ingress-https案例

1.建立自簽證書

mkdir ingress-https
cd ingress-https/
openssl genrsa -out nginx.key 2048
openssl req -new -x509 -key nginx.key -out nginx.pem -days 365
ls

2.將證書建立成secret

kubectl create secret tls nginx-tls-secret --cert=nginx.pem --key=nginx.key -n ingress-nginx
kubectl get secrets -n ingress-nginx |grep nginx-tls-secret

3.編排YAML並建立

# vim ingress-https.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx2
  namespace: ingress-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx2
  template:
    metadata:
      labels:
        app: nginx2
    spec:
      containers:
      - name: c1
        image: nginx:1.15-alpine
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service2
  namespace: ingress-nginx
  labels:
    app: nginx2
spec:
  ports:
  - name: http
    port: 80
    targetPort: 80
  - name: https
    port: 443
    targetPort: 443
  selector:
    app: nginx2
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx2
  namespace: ingress-nginx
spec:
  tls:
  - hosts:
    - www.daniel2.com		 # 域名
    secretName: nginx-tls-secret	  # 呼叫前面建立的secret
  rules:
  - host: www.daniel2.com	  # 域名
    http:
      paths:
      - backend:
          serviceName: nginx-service2		  # 對應服務名
          servicePort: 80
kubectl apply -f ingress-https.yml

4.驗證

kubectl get ingress -n ingress-nginx

5.模擬客戶端訪問

[root@hostos ~]# vim /etc/hosts

192.168.154.139 www.daniel2.com 新增這行模擬DNS

[root@hostos ~]# firefox https://www.daniel2.com &

![](https://img2020.cnblogs.com/blog/794174/202107/794174-20210707155057530-1300704669.png)

四、ingress+nodeport服務

vim ingress-nodeport.yml

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx3
namespace: ingress-nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx3
template:
metadata:
labels:
app: nginx3
spec:
containers:
- name: c1
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent

apiVersion: v1
kind: Service
metadata:
name: nginx-service3
namespace: ingress-nginx
labels:
app: nginx3
spec:
type: NodePort # NodePort型別服務
ports:

  • port: 80
    targetPort: 80
    selector:
    app: nginx3

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-nginx3
namespace: ingress-nginx
spec:
rules:

  • host: www.daniel3.com
    http:
    paths:
    • backend:
      serviceName: nginx-service3
      servicePort: 80

kubectl apply -f ingress-nodeport.yml
kubectl get svc -n ingress-nginx


nginx-service3是nodeport型別

[root@hostos ~]# vim /etc/hosts

192.168.154.139 www.daniel3.com 新增這行模擬DNS

[root@hostos ~]# curl www.daniel3.com

![](https://img2020.cnblogs.com/blog/794174/202107/794174-20210707155138019-211985027.png)

[root@hostos ~]# curl www.daniel3.com

![](https://img2020.cnblogs.com/blog/794174/202107/794174-20210707155204237-477900613.png)
![](https://img2020.cnblogs.com/blog/794174/202107/794174-20210707155213717-762719301.png)

# K8S ingress控制器 (三)
## 認識traefik

參考: https://traefik.cn/
是一個為了讓部署微服務更加便捷而誕生的現代HTTP反向代理、負載均衡工具。 它支援多種後臺 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 來自動化、動態的應用它的配置檔案設定。

![](https://img2020.cnblogs.com/blog/794174/202107/794174-20210707155408922-1337014879.png)

## traefik部署

mkdir traefik/
cd traefik/

編排ConfigMap

vim traefik-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
name: traefik-config
namespace: kube-system
data:
traefik.toml: |
defaultEntryPoints = ["http","https"]
debug = false
logLevel = "INFO"
InsecureSkipVerify = true
[entryPoints]
[entryPoints.http]
address = ":80"
compress = true
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
address = ":8080"
[kubernetes]
[metrics]
[metrics.prometheus]
buckets=[0.1,0.3,1.2,5.0]
entryPoint = "traefik"
[ping]
entryPoint = "http"

編排SA與DaemonSet

vim traefik-ds.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
name: traefik-ingress-controller
namespace: kube-system

kind: DaemonSet
apiVersion: apps/v1
metadata:
name: traefik-ingress-controller-v2
namespace: kube-system
labels:
k8s-app: traefik-ingress-lb
spec:
selector:
matchLabels:
name: traefik-ingress-lb-v2
template:
metadata:
labels:
k8s-app: traefik-ingress-lb
name: traefik-ingress-lb-v2
spec:
serviceAccountName: traefik-ingress-controller
terminationGracePeriodSeconds: 60
containers:
- image: traefik:2.1.6
name: traefik-ingress-lb-v2
ports:
- name: http
containerPort: 80
hostPort: 80
- name: admin
containerPort: 8080
hostPort: 8080
securityContext:
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
args:
- --api
- --api.insecure=true
- --providers.kubernetesingress=true
- --log.level=INFO
volumes:
- configMap:
name: traefik-config
name: config

kind: Service
apiVersion: v1
metadata:
name: traefik-ingress-service-v2
namespace: kube-system
labels:
k8s-app: traefik-ingress-lb-v2
spec:
selector:
k8s-app: traefik-ingress-lb-v2
ports:
- protocol: TCP
port: 80
name: web
- protocol: TCP
port: 8080
name: admin

編排rbac

vim traefik-rbac.yaml

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
  • apiGroups:
    • extensions
      resources:
    • ingresses/status
      verbs:
    • update

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

編排dashborad

vim traefik-dashboard.yaml

apiVersion: v1
kind: Service
metadata:
name: traefik-web-ui
namespace: kube-system
spec:
selector:
k8s-app: traefik-ingress-lb
ports:

  • name: web
    port: 80
    targetPort: 8080

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: traefik-web-ui
namespace: kube-system
spec:
rules:

  • host: traefik-daniel.com # 這裡換成自己的域名(實驗環境模擬一個就OK)
    http:
    paths:
    • path: /
      backend:
      serviceName: traefik-web-ui
      servicePort: 80

應用YAML

kubectl apply -f .

![](https://img2020.cnblogs.com/blog/794174/202107/794174-20210707155652859-275287564.png)

驗證

kubectl get pods -n kube-system |grep traefik

![](https://img2020.cnblogs.com/blog/794174/202107/794174-20210707155725392-1393383311.png)

kubectl get svc -n kube-system |grep traefik

![](https://img2020.cnblogs.com/blog/794174/202107/794174-20210707155802353-749904133.png)

訪問

1.用宿主機模擬客戶端
vim /etc/hosts
192.168.154.139 traefik-daniel.com # 新增域名與任意k8s叢集節點的繫結
2.客戶端firefox訪問traefik-daniel.com

![](https://img2020.cnblogs.com/blog/794174/202107/794174-20210707155847063-794419304.png)

3.或者使用任意k8s叢集節點IP:8080訪問

![](https://img2020.cnblogs.com/blog/794174/202107/794174-20210707155908646-453657450.png)