91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

kubernetes部署Traefik Ingress Controller的教程

發布時間:2020-06-10 13:11:38 來源:億速云 閱讀:1134 作者:元一 欄目:云計算

Kubernetes概述

Kubernetes是Google開源的一個容器編排引擎,它支持自動化部署、大規模可伸縮、應用容器化管理。在生產環境中部署一個應用程序時,通常要部署該應用的多個實例以便對應用請求進行負載均衡

在Kubernetes中,我們可以創建多個容器,每個容器里面運行一個應用實例,然后通過內置的負載均衡策略,實現對這一組應用實例的管理、發現、訪問,而這些細節都不需要運維人員去進行復雜的手工配置和處理。

Kubernetes 特點

可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)

可擴展: 模塊化,插件化,可掛載,可組合

自動化: 自動部署,自動重啟,自動復制,自動伸縮/擴展

背景

Ingress是一個規則,可以繪制出在集群內部的服務如何彌合鴻溝,暴露到客戶可以使用它的外部世界。本文中,作者將幫助你了解Ingress模式背后的驅動力。

不知道你是否注意到一個奇怪的現象,盡管Kubernetes Ingress API仍然處于bata狀態,但是已經有許多公司使用它來暴露Kubernetes服務。從事相關項目的工程師表示,Kubernetes Ingress API越來越有可能摘下其beta標簽。

實際上,Kubernetes Ingress API處于beta狀態已經持續了幾年的時間,準確來說,是在2015年秋季開始進入該階段的。但是,漫長的beta階段可以讓Kubernetes貢獻者有時間來完善規范并使其與已經搭建好的實施軟件(HAProxy、NGINX、Traefik等)保持一致,從而使API標準化以反映最常見并且有需求的功能。

注:本文使用的Traefik為1.x的版本

在生產環境中,我們常常需要控制來自互聯網的外部進入集群中,而這恰巧是Ingress的職責。

Ingress的主要目的是將HTTP和HTTPS從集群外部暴露給該集群中運行的服務。這與Ingress控制如何將外部流量路由到集群有異曲同工之妙。接下來,我們舉一個實際的例子來更清楚的說明Ingress的概念。

首先,想象一下在你的Kubernetes集群中有若干個微服務(小型應用程序之間彼此通信)。這些服務能夠在集群內部被訪問,但我們想讓我們的用戶從集群外部也能夠訪問它們。因此,我們需要做的是使用反向代理將每個HTTP(S)(例如,service.yourdomain.com)路由與相應的后端關聯,并在該服務的不同實例之間(如,pod)進行負載均衡。與此同時,由于Kubernetes的性質會不斷發生變化,因此我們希望跟蹤服務后端的更改,以便能夠在添加或刪除新Pod時將這些HTTP路由重新關聯到新Pod實例 

使用Ingress資源和關聯的Ingress Controller,你可以實現以下目標: 

  • 將你的域app.domain.com指向你的私有網絡中的微服務應用程序

  • 將路徑domain.com/web指向你的私有網絡中的微服務web

  • 將你的域backend.domain.com指向你的私有網絡中的微服務后端,并在該微服務的多個實例之間(Pod)進行負載均衡

現在,你理解了Ingress的重要性。它能夠幫助將HTTP路由指向在Kubernetes集群中特定的微服務。

但是,流量路由并不是Ingress在Kubernetes中的唯一功能。例如,還可以將Ingress配置為負載均衡流量到你的應用程序、終止SSL、執行基于名稱的虛擬主機、在不同服務之間分配流量、設置服務訪問規則等。

Kubernetes有一個特別的Ingress API資源,它能夠支持上述所有功能。但是,簡單地創建一個Ingress API資源是沒有作用的。你還需要一個Ingress Controller。目前,Kubernetes支持許多Ingress controller,如Contour、HAProxy、NGINX以及Traefik。

在本文中,我將使用Traefik Ingress Controller創建Ingress。它能夠實現現代HTTP反向代理和負載均衡器的功能,從而簡化了微服務的部署。此外,Traefik對Docker、Marathon、Consul、Kubernetes、Amazon ECS等系統和環境都提供了強大的支持。
 
kubernetes部署Traefik Ingress Controller的教程
 
Traefik對于諸如Kubernetes之類的靈活性較強的系統十分有用。在Kubernetes中,每天需要多次添加、刪除或升級服務,而Traefik可以監聽服務鏡像倉庫/編排器 API并立即生成或更新路由,因此你的微服務無需手動配置即可與外界連接。
 

除此之外,Traefik支持多個負載均衡算法、Let’s Encrypt的HTTPS(支持通配證書)、斷路器、WebSoket、GRPC和多個監控程序(Rest、Prometheus、Statsd、Datadog、InfluxDB等)。有關Traefik中可用功能的更多信息,請參考其官方文檔:
 
https://docs.traefik.cn/
 

Ingress 資源

 
在教程開始之前,我們先來簡單地討論一下Ingress資源是如何工作的。以下是隱式使用Nginx Ingress Controller的Ingress示例。
 

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-example
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /microservice1
        backend:
          serviceName: test
          servicePort: 80

 
以上Ingress manifest 包含了一系列HTTP規則,它們用于規定controller如何路由流量。

 

可選主機。如果未指定主機(如上所示),則該規則適用于通過指定IP地址的所有入站HTTP流量。如果提供了主機(如yourhost.com),則該規則僅適用于該主機。

 
一個路徑列表(如,/microservice1),它指向由serviceNameservicePort定義的關聯后端。

 

一個后端。向Ingress發出的HTTP(和HTTPS)請求將與給定規則的主機和路徑匹配,然后將其路由到該規則中指定的后端服務。

 

在以上例子中,我們配置了一個名為”test“的后端,它將接收所有來自/microservice路徑的流量。然而,我們也可以配置一個默認后端,它將將為任何不符合規范中路徑的用戶請求提供服務。同時,如果不定義任何規則,Ingress將路由所有流量到默認后端。例如:
 

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
spec:
  backend:
    serviceName: defaultbackend
    servicePort: 80

 
在本例中,所有流量都被轉發到默認后端中defaultbackend。現在,我們理解了Ingress 資源的基本概念,接下來我們來看看一些具體的例子。
 

Step 0:前期準備

 

如上文我們所說的,定義一個Ingress資源沒有任何作用,除非你使用了Ingress Controller。在本教程中,我們在Kubernetes集群中將Traefik設置為Ingress Controller。

 

要完成教程,你需要進行以下準備:

 

  • 一個正在運行的Kubernetes集群。

  • 一個安裝好的命令行工具,kubectl。并配置為與集群通信。

 

請注意:以下示例均假設你在本地計算上使用Minikube運行Kubernetes集群。
 

Step 1:啟用RBAC

 

首先,我們需要向Traefik授予一些權限,以訪問集群中運行的Pod、endpoint和服務。為此,我們將使用ClusterRoleClusterRoleBinding資源。但是,你也可以對命名空間范圍內的RoleBindings使用最小特權方法。通常,如果集群的命名空間不會動態更改,并且Traefik無法監視所有集群的命名空間,那么這是首選的方法。
 

讓我們創建一個新的ServiceAccount,為Traefik提供集群中的身份。
 

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

 
要創建一個ServiceAccount,需要在traefik-service-acc.yaml中保存以上manifest并運行:
 

kubectl create -f traefik-service-acc.yaml
serviceaccount "traefik-ingress" created

 
接下來,讓我們創建一個具有一組權限的ClusterRole,該權限將應用于Traefik ServiceAccount。通過ClusterRole,Traefik可以管理和監視集群中所有命名空間中的資源,例如服務、endpoint、secret以及Ingress。
 

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress
rules:
  - apiGroups:
      - ""
    resources:
      - services
      - endpoints
      - secrets
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch

 
將這一規范保存到文件traefik-cr.yaml中,并運行:
 

kubectl create -f traefik-cr.yaml
clusterrole.rbac.authorization.k8s.io “traefik-ingress” created

 
最后,啟用這些權限,我們應該將ClusterRole綁定到Traefik ServiceAccount中。使用ClusterRoleBinding manifest可以完成這一操作:
 

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-ingress
subjects:
- kind: ServiceAccount
  name: traefik-ingress
  namespace: kube-system

 
保存這一規范到traefik-crb.yaml中,并運行以下命令:
 

kubectl create -f traefik-crb.yaml
clusterrolebinding.rbac.authorization.k8s.io “traefik-ingress” created

 

Step 2:部署Traefik到集群

 

接下來,我們將部署Traefik到Kubernetes集群。官方Traefik文檔支持三種類型的部署:使用Deployment對象、使用DaemonSet對象或使用Helm Chart。
 

在本教程中,我們將使用Deployment manifest。相比其他選項,Deployment有諸多優勢。例如,它們能確保更好的可伸縮性,并為滾動更新提供良好支持。

 
讓我們看一下 Deployment manifest:
 

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: traefik-ingress
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: traefik-ingress-lb
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      serviceAccountName: traefik-ingress
      terminationGracePeriodSeconds: 60
      containers:
      - image: traefik
        name: traefik-ingress-lb
        ports:
        - name: http
          containerPort: 80
        - name: admin
          containerPort: 8080
        args:
        - --api
        - --kubernetes
        - --logLevel=INFO

 
這個Deployment將在kube-system 命名空間中創建一個Traefik副本。Traefik容器將使用此manifest中指定的端口80和8080。

 
將這個manifest保存到traefik-deployment.yaml文件中,并運行以下命令創建Deployment:
 

kubectl create -f traefik-deployment.yaml
deployment.extensions “traefik-ingress” created

 
現在,讓我們檢查一下Traefik Pod是否都成功創建了:
 

kubectl --namespace=kube-system get pods
NAME                         READY     STATUS    RESTARTS   AGE
....
storage-provisioner           1/1       Running   3          23d
traefik-ingress-54d6d8d9cc-ls6cs 1/1       Running   0          1m

 
如你所見,Deployment Controller啟動了一個Traefik副本,并在正在運行,敲棒的!
 

Step 3:為外部訪問創建NodePorts

 
讓我們創建一個服務來從集群外部訪問Traefik。為此,我們需要一個暴露兩個NodePorts的服務。
 

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

 
將這個manifest保存到traefik-svc.yaml,并創建服務:
 

kubectl create -f traefik-svc.yaml
service “traefik-ingress-service” created

 
現在,讓我們驗證該服務是否創建:
 

kubectl describe svc traefik-ingress-service --namespace=kube-system
Name:                     traefik-ingress-service
Namespace:                kube-system
Labels:                   <none>
Annotations:              <none>
Selector:                 k8s-app=traefik-ingress-lb
Type:                     NodePort
IP:                       10.102.215.64
Port:                     web  80/TCP
TargetPort:               80/TCP
NodePort:                 web  30565/TCP
Endpoints:                172.17.0.6:80
Port:                     admin  8080/TCP
TargetPort:               8080/TCP
NodePort:                 admin  30729/TCP
Endpoints:                172.17.0.6:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

 
如你所見,我們現在有兩個NodePorts(webadmin),它們分別路由到Traefik Ingress Controller的80和8080容器端口。“admin” NodePort將用于訪問Traefik Web UI,“web” NodePort將用于訪問通過Ingress暴露的服務。
 

Step 4:訪問Traefik

 

為了能在瀏覽器中訪問Traefik Web UI,你可以使用“admin”NodePort 30729(請注意,你的NodePort值可能會有所不同)。因為我們還沒有添加任何前端,所以UI此時應該是空的。

 

由于我們尚未給Traefik進行任何配置,因此我們會收到404的響應。
 

curl $(minikube ip):30565
404 page not found

 

Step 5 :添加Ingress 到集群

 

現在我們在Kubernetes集群中已經將Traefik作為Ingress Controller了。然而,我們依舊需要定義Ingress資源和暴露Traefik Web UI的服務。

 

首先,我們創建一個服務:
 

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

 
保存manifest到traefik-webui-svc.yaml中,并運行:
 

kubectl create -f traefik-webui-svc.yaml
service “traefik-web-ui” created

 
讓我們驗證服務是否已經創建:
 

kubectl describe svc traefik-web-ui --namespace=kube-system
Name:              traefik-web-ui
Namespace:         kube-system
Labels:            <none>
Annotations:       <none>
Selector:          k8s-app=traefik-ingress-lb
Type:              ClusterIP
IP:                10.98.230.58
Port:              web  80/TCP
TargetPort:        8080/TCP
Endpoints:         172.17.0.6:8080
Session Affinity:  None
Events:            <none>

 
如你所見,服務的ClusterIP是10.98.230.58,并在manifest中分配指定端口。
 
接下來,我們需要創建一個Ingress資源,指向Traefik Web UI后端:
 

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-web-ui
  namespace: kube-system
spec:
  rules:
  - host: traefik-ui.minikube
    http:
      paths:
      - path: /
        backend:
          serviceName: traefik-web-ui
          servicePort: web

 
本質上,Ingress將所有請求路由到traefik-ui.minikube,在上述步驟中創建的服務暴露Traefik Web UI。
 

將規范保存到traefik-ingress.yaml,并運行:
 

kubectl create -f traefik-ingress.yaml
ingress.extensions “traefik-web-ui” created

 
為了能夠通過traefik-ui.minikube在瀏覽器中可以訪問Traefik Web UI,我們需要添加新的條目到我們/etc/hosts文件中。該條目將包含Minikube IP和主機名。你可以通過運行minikube ip來獲取minkube實例的IP地址,然后將新主機的名稱保存到/etc/hosts文件中,如下所示:
 

echo "$(minikube ip) traefik-ui.minikube" | sudo tee -a /etc/hosts
192.168.99.100 traefik-ui.minikube

 
現在,你應該能夠在瀏覽器中訪問http://traefik-ui.minikube:&lt;AdminNodePort&gt;并查看Traefik Web UI。別忘了附加”admin”NodePort到主機地址。
 
kubernetes部署Traefik Ingress Controller的教程
 
在dashboard中,你可以點擊Health 鏈接來查看應用程序的健康狀況:
 
kubernetes部署Traefik Ingress Controller的教程
 

Step 6:實現基于名稱的路由

 

現在,我們來演示如何使用Traefik Ingress Controller為前端列表設置基于名稱的路由。我們將使用簡單的單頁網站創建3個Deployment,并顯示動物圖像:熊、野兔和駝鹿。
 

---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: bear
  labels:
    app: animals
    animal: bear
spec:
  replicas: 2
  selector:
    matchLabels:
      app: animals
      task: bear
  template:
    metadata:
      labels:
        app: animals
        task: bear
        version: v0.0.1
    spec:
      containers:
      - name: bear
        image: supergiantkir/animals:bear
        ports:
        - containerPort: 80
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: moose
  labels:
    app: animals
    animal: moose
spec:
  replicas: 2
  selector:
    matchLabels:
      app: animals
      task: moose
  template:
    metadata:
      labels:
        app: animals
        task: moose
        version: v0.0.1
    spec:
      containers:
      - name: moose
        image: supergiantkir/animals:moose
        ports:
        - containerPort: 80
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: hare
  labels:
    app: animals
    animal: hare
spec:
  replicas: 2
  selector:
    matchLabels:
      app: animals
      task: hare
  template:
    metadata:
      labels:
        app: animals
        task: hare
        version: v0.0.1
    spec:
      containers:
      - name: hare
        image: supergiantkir/animals:hare
        ports:
        - containerPort: 80

 
每個Deployment都將有兩個Pod副本,而每個Pod將在containerPort 80上服務“動物“網站。
 

讓我們保存這些Deployment manifest到animals-deployment.yaml中,并運行:
 

kubectl create -f animals-deployment.yaml
deployment.extensions “bear” created
deployment.extensions “moose” created
deployment.extensions “hare” created

 
現在,讓我們為每個Deployment創建一個服務,使得Pod可以訪問:
 

---
apiVersion: v1
kind: Service
metadata:
  name: bear
spec:
  ports:
  - name: http
    targetPort: 80
    port: 80
  selector:
    app: animals
    task: bear
---
apiVersion: v1
kind: Service
metadata:
  name: moose
spec:
  ports:
  - name: http
    targetPort: 80
    port: 80
  selector:
    app: animals
    task: moose
---
apiVersion: v1
kind: Service
metadata:
  name: hare
  annotations:
    traefik.backend.circuitbreaker: "NetworkErrorRatio() > 0.5"
spec:
  ports:
  - name: http
    targetPort: 80
    port: 80
  selector:
    app: animals
    task: hare

 
請注意:第三項服務使用斷路器annotation。斷路器是Traefik的一項功能,可防止發生故障的服務器承受高負載。在本例中,我們防止服務器上的高負載超過50%。當此條件匹配時,CB進入“跳閘“狀態,在該狀態中它會使用預定義的HTTP狀態代碼進行響應或重定向到另一個前端。

 

保存這些服務manifest到animals-svc.yaml并運行:
 

kubectl create -f animals-svc.yaml
service “bear” created
service “moose” created
service “hare” created

 
最后,為每個Deployment創建一個有3個前后端對的Ingress。bear.minikubemoose.minikubehare.minikube將是我們指向相應后端服務的前端。
 

Ingress manifest如下所示:
 

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: animals
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: hare.minikube
    http:
      paths:
      - path: /
        backend:
          serviceName: hare
          servicePort: http
  - host: bear.minikube
    http:
      paths:
      - path: /
        backend:
          serviceName: bear
          servicePort: http
  - host: moose.minikube
    http:
      paths:
      - path: /
        backend:
          serviceName: moose
          servicePort: http

 
保存規范到animals-ingress.yaml并運行:
 

kubectl create -f animals-ingress.yaml
ingress.extensions “animals” created

 
現在,在Traefik dashboard內,你可以看到每個主機的前端以及相應的后端列表:
 
kubernetes部署Traefik Ingress Controller的教程
 
如果你再次編輯etc/hosts,你應該能夠在你的瀏覽器中訪問動物網頁:
 

echo “$(minikube ip) bear.minikube hare.minikube moose.minikube” | sudo tee -a /etc/hosts

 
你應該使用“web“NodePort來訪問特定網頁。例如,http://bear.minikube:&lt;WebNodePort&gt;

 

我們也可以將三個前端重新配置為在一個域下提供服務,如下所示:
 

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: all-animals
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.frontend.rule.type: PathPrefixStrip
spec:
  rules:
  - host: animals.minikube
    http:
      paths:
      - path: /bear
        backend:
          serviceName: bear
          servicePort: http
      - path: /moose
        backend:
          serviceName: moose
          servicePort: http
      - path: /hare
        backend:
          serviceName: hare
          servicePort: http

 
如果你激活這個Ingress,使用相應的路徑,三個動物在一個域下都能夠訪問——animals.minikube。別忘了將這個域添加到/etc/hosts
 

echo “$(minikube ip) animals.minikube” | sudo tee -a /etc/hosts

 
請注意:我們正在配置Traefik,以使用traefik.frontend.rule.type注釋,從URL路徑中刪除前綴。這樣我們可以直接使用上一個示例中的容器。由于traefik.frontend.rule.type: PathPrefixStrip規則,你必須使用http://animals.minikube:32484/moose/而不是http://animals.minikube:32484/moose
 

Step 7:實現流量分配

 

借助Traefik,用戶可以使用服務權重以受控方式在多個deployment之間分配Ingress流量。這一功能可用于金絲雀發布,它最初應該獲得少量但持續增長的流量。

 

讓我們使用以下manifest在兩個微服務之間分配Traefik:
 

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    traefik.ingress.kubernetes.io/service-weights: |
      animals-app: 99%
      animals-app-canary: 1%
  name: animals-app
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: animals-app
          servicePort: 80
        path: /
      - backend:
          serviceName: animals-app-canary
          servicePort: 80
        path: /

 
請注意traefik.ingress.kubernetes.io/service-weights的注釋。它指定了流量如何在指定后端服務(animals-appanimals-app-canary)之間分配。Traefik將把99%的用戶請求路由到animals-app deployment支持的Pod,并將1%的用戶請求路由到animals-app-canary deployment支持的Pod。

 

要使此設置正常工作,需要滿足一些條件:
 

  • 所有服務后端必須共享相同的路徑和主機。

  • 跨服務后端共享的請求總數應總計為100%。

  • 百分比值應該在支持的精度范圍內,目前Traefik支持3個小數位的權重。
     

    總結

    如你所見,Ingress是將外部流量路由到Kubernetes集群中相應后端服務的強大工具。用戶可以使用Kubernetes支持的許多Ingress controller來實現Ingress。在本教程中,我們重點介紹了Traefik Ingress controller,該控制器支持基于名稱的路由,負載均衡以及Ingress controller的其他常見任務。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大渡口区| 南昌市| 晴隆县| 永济市| 肥西县| 邳州市| 涞水县| 西昌市| 靖安县| 东台市| 冀州市| 东阿县| 格尔木市| 临邑县| 饶平县| 城固县| 红安县| 吴川市| 建水县| 贵溪市| 吉安市| 虞城县| 册亨县| 丰县| 集贤县| 江山市| 通城县| 衡南县| 威海市| 湘潭县| 湖北省| 朝阳市| 乌拉特中旗| 通化县| 德安县| 西贡区| 梓潼县| 澜沧| 平南县| 贡觉县| 兴和县|