實(shí)操教程丨如何在K8S集群中部署Traefik Ingress Controller

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

在生產(chǎn)環(huán)境中谬俄,我們常常需要控制來(lái)自互聯(lián)網(wǎng)的外部進(jìn)入集群中泻红,而這恰巧是Ingress的職責(zé)。

Ingress的主要目的是將HTTP和HTTPS從集群外部暴露給該集群中運(yùn)行的服務(wù)。這與Ingress控制如何將外部流量路由到集群有異曲同工之妙绪商。接下來(lái),我們舉一個(gè)實(shí)際的例子來(lái)更清楚的說(shuō)明Ingress的概念辅鲸。

首先格郁,想象一下在你的Kubernetes集群中有若干個(gè)微服務(wù)(小型應(yīng)用程序之間彼此通信)。這些服務(wù)能夠在集群內(nèi)部被訪問(wèn)独悴,但我們想讓我們的用戶從集群外部也能夠訪問(wèn)它們例书。因此,我們需要做的是使用反向代理將每個(gè)HTTP(S)(例如刻炒,service.yourdomain.com)路由與相應(yīng)的后端關(guān)聯(lián)决采,并在該服務(wù)的不同實(shí)例之間(如,pod)進(jìn)行負(fù)載均衡落蝙。與此同時(shí)织狐,由于Kubernetes的性質(zhì)會(huì)不斷發(fā)生變化,因此我們希望跟蹤服務(wù)后端的更改筏勒,以便能夠在添加或刪除新Pod時(shí)將這些HTTP路由重新關(guān)聯(lián)到新Pod實(shí)例移迫。

使用Ingress資源和關(guān)聯(lián)的Ingress Controller,你可以實(shí)現(xiàn)以下目標(biāo):

  • 將你的域app.domain.com指向你的私有網(wǎng)絡(luò)中的微服務(wù)應(yīng)用程序

  • 將路徑domain.com/web指向你的私有網(wǎng)絡(luò)中的微服務(wù)web

  • 將你的域backend.domain.com指向你的私有網(wǎng)絡(luò)中的微服務(wù)后端管行,并在該微服務(wù)的多個(gè)實(shí)例之間(Pod)進(jìn)行負(fù)載均衡

現(xiàn)在厨埋,你理解了Ingress的重要性。它能夠幫助將HTTP路由指向在Kubernetes集群中特定的微服務(wù)捐顷。

但是荡陷,流量路由并不是Ingress在Kubernetes中的唯一功能。例如迅涮,還可以將Ingress配置為負(fù)載均衡流量到你的應(yīng)用程序废赞、終止SSL、執(zhí)行基于名稱的虛擬主機(jī)叮姑、在不同服務(wù)之間分配流量唉地、設(shè)置服務(wù)訪問(wèn)規(guī)則等据悔。

Kubernetes有一個(gè)特別的Ingress API資源,它能夠支持上述所有功能耘沼。但是极颓,簡(jiǎn)單地創(chuàng)建一個(gè)Ingress API資源是沒(méi)有作用的。你還需要一個(gè)Ingress Controller群嗤。目前菠隆,Kubernetes支持許多Ingress controller,如Contour狂秘、HAProxy骇径、NGINX以及Traefik。

在本文中赃绊,我將使用Traefik Ingress Controller創(chuàng)建Ingress既峡。它能夠?qū)崿F(xiàn)現(xiàn)代HTTP反向代理和負(fù)載均衡器的功能,從而簡(jiǎn)化了微服務(wù)的部署碧查。此外,Traefik對(duì)Docker校仑、Marathon忠售、Consul、Kubernetes迄沫、Amazon ECS等系統(tǒng)和環(huán)境都提供了強(qiáng)大的支持稻扬。

image

Traefik對(duì)于諸如Kubernetes之類的靈活性較強(qiáng)的系統(tǒng)十分有用。在Kubernetes中羊瘩,每天需要多次添加泰佳、刪除或升級(jí)服務(wù),而Traefik可以監(jiān)聽(tīng)服務(wù)鏡像倉(cāng)庫(kù)/編排器 API并立即生成或更新路由尘吗,因此你的微服務(wù)無(wú)需手動(dòng)配置即可與外界連接逝她。

除此之外,Traefik支持多個(gè)負(fù)載均衡算法睬捶、Let’s Encrypt的HTTPS(支持通配證書(shū))黔宛、斷路器、WebSoket擒贸、GRPC和多個(gè)監(jiān)控程序(Rest臀晃、Prometheus、Statsd介劫、Datadog徽惋、InfluxDB等)。有關(guān)Traefik中可用功能的更多信息座韵,請(qǐng)參考其官方文檔:

https://docs.traefik.cn/

Ingress 資源

在教程開(kāi)始之前险绘,我們先來(lái)簡(jiǎn)單地討論一下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規(guī)則隆圆,它們用于規(guī)定controller如何路由流量漱挚。

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

一個(gè)路徑列表(如白华,/microservice1),它指向由serviceNameservicePort定義的關(guān)聯(lián)后端贩耐。

一個(gè)后端弧腥。向Ingress發(fā)出的HTTP(和HTTPS)請(qǐng)求將與給定規(guī)則的主機(jī)和路徑匹配,然后將其路由到該規(guī)則中指定的后端服務(wù)潮太。

在以上例子中管搪,我們配置了一個(gè)名為”test“的后端,它將接收所有來(lái)自/microservice路徑的流量铡买。然而更鲁,我們也可以配置一個(gè)默認(rèn)后端,它將將為任何不符合規(guī)范中路徑的用戶請(qǐng)求提供服務(wù)奇钞。同時(shí)澡为,如果不定義任何規(guī)則,Ingress將路由所有流量到默認(rèn)后端景埃。例如:

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

在本例中媒至,所有流量都被轉(zhuǎn)發(fā)到默認(rèn)后端中defaultbackend。現(xiàn)在谷徙,我們理解了Ingress 資源的基本概念拒啰,接下來(lái)我們來(lái)看看一些具體的例子。

Step 0:前期準(zhǔn)備

如上文我們所說(shuō)的蒂胞,定義一個(gè)Ingress資源沒(méi)有任何作用图呢,除非你使用了Ingress Controller。在本教程中骗随,我們?cè)贙ubernetes集群中將Traefik設(shè)置為Ingress Controller蛤织。

要完成教程,你需要進(jìn)行以下準(zhǔn)備:

  • 一個(gè)正在運(yùn)行的Kubernetes集群鸿染。

  • 一個(gè)安裝好的命令行工具指蚜,kubectl。并配置為與集群通信涨椒。

請(qǐng)注意:以下示例均假設(shè)你在本地計(jì)算上使用Minikube運(yùn)行Kubernetes集群摊鸡。

Step 1:?jiǎn)⒂肦BAC

首先绽媒,我們需要向Traefik授予一些權(quán)限,以訪問(wèn)集群中運(yùn)行的Pod免猾、endpoint和服務(wù)是辕。為此,我們將使用ClusterRoleClusterRoleBinding資源猎提。但是获三,你也可以對(duì)命名空間范圍內(nèi)的RoleBindings使用最小特權(quán)方法。通常锨苏,如果集群的命名空間不會(huì)動(dòng)態(tài)更改疙教,并且Traefik無(wú)法監(jiān)視所有集群的命名空間,那么這是首選的方法伞租。

讓我們創(chuàng)建一個(gè)新的ServiceAccount贞谓,為Traefik提供集群中的身份。

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

要?jiǎng)?chuàng)建一個(gè)ServiceAccount葵诈,需要在traefik-service-acc.yaml中保存以上manifest并運(yùn)行:

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

接下來(lái)裸弦,讓我們創(chuàng)建一個(gè)具有一組權(quán)限的ClusterRole,該權(quán)限將應(yīng)用于Traefik ServiceAccount驯击。通過(guò)ClusterRole烁兰,Traefik可以管理和監(jiān)視集群中所有命名空間中的資源,例如服務(wù)徊都、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

將這一規(guī)范保存到文件traefik-cr.yaml中暇矫,并運(yùn)行:

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

最后,啟用這些權(quán)限择吊,我們應(yīng)該將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

保存這一規(guī)范到traefik-crb.yaml中,并運(yùn)行以下命令:

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

Step 2:部署Traefik到集群

接下來(lái)几睛,我們將部署Traefik到Kubernetes集群房轿。官方Traefik文檔支持三種類型的部署:使用Deployment對(duì)象、使用DaemonSet對(duì)象或使用Helm Chart所森。

在本教程中囱持,我們將使用Deployment manifest。相比其他選項(xiàng)焕济,Deployment有諸多優(yōu)勢(shì)纷妆。例如,它們能確保更好的可伸縮性晴弃,并為滾動(dòng)更新提供良好支持掩幢。

讓我們看一下 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

這個(gè)Deployment將在kube-system 命名空間中創(chuàng)建一個(gè)Traefik副本逊拍。Traefik容器將使用此manifest中指定的端口80和8080。

將這個(gè)manifest保存到traefik-deployment.yaml文件中际邻,并運(yùn)行以下命令創(chuàng)建Deployment:

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

現(xiàn)在芯丧,讓我們檢查一下Traefik Pod是否都成功創(chuàng)建了:

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

如你所見(jiàn),Deployment Controller啟動(dòng)了一個(gè)Traefik副本世曾,并在正在運(yùn)行缨恒,敲棒的!

Step 3:為外部訪問(wèn)創(chuàng)建NodePorts

讓我們創(chuàng)建一個(gè)服務(wù)來(lái)從集群外部訪問(wèn)Traefik度硝。為此肿轨,我們需要一個(gè)暴露兩個(gè)NodePorts的服務(wù)。

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

將這個(gè)manifest保存到traefik-svc.yaml蕊程,并創(chuàng)建服務(wù):

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

現(xiàn)在椒袍,讓我們驗(yàn)證該服務(wù)是否創(chuàng)建:


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>

如你所見(jiàn),我們現(xiàn)在有兩個(gè)NodePorts(webadmin)藻茂,它們分別路由到Traefik Ingress Controller的80和8080容器端口驹暑。“admin” NodePort將用于訪問(wèn)Traefik Web UI辨赐,“web” NodePort將用于訪問(wèn)通過(guò)Ingress暴露的服務(wù)优俘。

Step 4:訪問(wèn)Traefik

為了能在瀏覽器中訪問(wèn)Traefik Web UI,你可以使用“admin”NodePort 30729(請(qǐng)注意掀序,你的NodePort值可能會(huì)有所不同)帆焕。因?yàn)槲覀冞€沒(méi)有添加任何前端,所以UI此時(shí)應(yīng)該是空的不恭。

由于我們尚未給Traefik進(jìn)行任何配置叶雹,因此我們會(huì)收到404的響應(yīng)。

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

Step 5 :添加Ingress 到集群

現(xiàn)在我們?cè)贙ubernetes集群中已經(jīng)將Traefik作為Ingress Controller了换吧。然而折晦,我們依舊需要定義Ingress資源和暴露Traefik Web UI的服務(wù)。

首先沾瓦,我們創(chuàng)建一個(gè)服務(wù):

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中满着,并運(yùn)行:

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

讓我們驗(yàn)證服務(wù)是否已經(jīng)創(chuàng)建:

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>

如你所見(jiàn),服務(wù)的ClusterIP是10.98.230.58贯莺,并在manifest中分配指定端口风喇。

接下來(lái),我們需要?jiǎng)?chuàng)建一個(gè)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

本質(zhì)上响驴,Ingress將所有請(qǐng)求路由到traefik-ui.minikube,在上述步驟中創(chuàng)建的服務(wù)暴露Traefik Web UI撕蔼。

將規(guī)范保存到traefik-ingress.yaml豁鲤,并運(yùn)行:

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

為了能夠通過(guò)traefik-ui.minikube在瀏覽器中可以訪問(wèn)Traefik Web UI秽誊,我們需要添加新的條目到我們/etc/hosts文件中。該條目將包含Minikube IP和主機(jī)名琳骡。你可以通過(guò)運(yùn)行minikube ip來(lái)獲取minkube實(shí)例的IP地址锅论,然后將新主機(jī)的名稱保存到/etc/hosts文件中,如下所示:

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

現(xiàn)在楣号,你應(yīng)該能夠在瀏覽器中訪問(wèn)http://traefik-ui.minikube:<AdminNodePort>并查看Traefik Web UI最易。別忘了附加”admin”NodePort到主機(jī)地址。

image

在dashboard中炫狱,你可以點(diǎn)擊Health 鏈接來(lái)查看應(yīng)用程序的健康狀況:

image

Step 6:實(shí)現(xiàn)基于名稱的路由

現(xiàn)在藻懒,我們來(lái)演示如何使用Traefik Ingress Controller為前端列表設(shè)置基于名稱的路由。我們將使用簡(jiǎn)單的單頁(yè)網(wǎng)站創(chuàng)建3個(gè)Deployment视译,并顯示動(dòng)物圖像:熊嬉荆、野兔和駝鹿。

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

每個(gè)Deployment都將有兩個(gè)Pod副本酷含,而每個(gè)Pod將在containerPort 80上服務(wù)“動(dòng)物“網(wǎng)站鄙早。

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

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

現(xiàn)在椅亚,讓我們?yōu)槊總€(gè)Deployment創(chuàng)建一個(gè)服務(wù)限番,使得Pod可以訪問(wèn):

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

請(qǐng)注意:第三項(xiàng)服務(wù)使用斷路器annotation。斷路器是Traefik的一項(xiàng)功能呀舔,可防止發(fā)生故障的服務(wù)器承受高負(fù)載弥虐。在本例中,我們防止服務(wù)器上的高負(fù)載超過(guò)50%媚赖。當(dāng)此條件匹配時(shí)躯舔,CB進(jìn)入“跳閘“狀態(tài),在該狀態(tài)中它會(huì)使用預(yù)定義的HTTP狀態(tài)代碼進(jìn)行響應(yīng)或重定向到另一個(gè)前端省古。

保存這些服務(wù)manifest到animals-svc.yaml并運(yùn)行:

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

最后,為每個(gè)Deployment創(chuàng)建一個(gè)有3個(gè)前后端對(duì)的Ingress丧失。bear.minikube豺妓、moose.minikubehare.minikube將是我們指向相應(yīng)后端服務(wù)的前端。

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

保存規(guī)范到animals-ingress.yaml并運(yùn)行:

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

現(xiàn)在布讹,在Traefik dashboard內(nèi)琳拭,你可以看到每個(gè)主機(jī)的前端以及相應(yīng)的后端列表:

image

如果你再次編輯etc/hosts,你應(yīng)該能夠在你的瀏覽器中訪問(wèn)動(dòng)物網(wǎng)頁(yè):

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

你應(yīng)該使用“web“NodePort來(lái)訪問(wèn)特定網(wǎng)頁(yè)描验。例如白嘁,http://bear.minikube:<WebNodePort>

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


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

如果你激活這個(gè)Ingress膘流,使用相應(yīng)的路徑絮缅,三個(gè)動(dòng)物在一個(gè)域下都能夠訪問(wèn)——animals.minikube鲁沥。別忘了將這個(gè)域添加到/etc/hosts

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

請(qǐng)注意:我們正在配置Traefik耕魄,以使用traefik.frontend.rule.type注釋画恰,從URL路徑中刪除前綴。這樣我們可以直接使用上一個(gè)示例中的容器吸奴。由于traefik.frontend.rule.type: PathPrefixStrip規(guī)則允扇,你必須使用http://animals.minikube:32484/moose/而不是http://animals.minikube:32484/moose

Step 7:實(shí)現(xiàn)流量分配

借助Traefik,用戶可以使用服務(wù)權(quán)重以受控方式在多個(gè)deployment之間分配Ingress流量则奥。這一功能可用于金絲雀發(fā)布考润,它最初應(yīng)該獲得少量但持續(xù)增長(zhǎng)的流量。

讓我們使用以下manifest在兩個(gè)微服務(wù)之間分配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: /

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

要使此設(shè)置正常工作俊戳,需要滿足一些條件:

  • 所有服務(wù)后端必須共享相同的路徑和主機(jī)。

  • 跨服務(wù)后端共享的請(qǐng)求總數(shù)應(yīng)總計(jì)為100%馆匿。

  • 百分比值應(yīng)該在支持的精度范圍內(nèi)抑胎,目前Traefik支持3個(gè)小數(shù)位的權(quán)重。

總結(jié)

如你所見(jiàn)渐北,Ingress是將外部流量路由到Kubernetes集群中相應(yīng)后端服務(wù)的強(qiáng)大工具阿逃。用戶可以使用Kubernetes支持的許多Ingress controller來(lái)實(shí)現(xiàn)Ingress。在本教程中赃蛛,我們重點(diǎn)介紹了Traefik Ingress controller恃锉,該控制器支持基于名稱的路由,負(fù)載均衡以及Ingress controller的其他常見(jiàn)任務(wù)呕臂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末破托,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子歧蒋,更是在濱河造成了極大的恐慌土砂,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谜洽,死亡現(xiàn)場(chǎng)離奇詭異萝映,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)阐虚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門序臂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人实束,你說(shuō)我怎么就攤上這事奥秆⊙放恚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵吭练,是天一觀的道長(zhǎng)诫龙。 經(jīng)常有香客問(wèn)我,道長(zhǎng)鲫咽,這世上最難降的妖魔是什么签赃? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮分尸,結(jié)果婚禮上锦聊,老公的妹妹穿的比我還像新娘。我一直安慰自己箩绍,他們只是感情好孔庭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著材蛛,像睡著了一般圆到。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卑吭,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天芽淡,我揣著相機(jī)與錄音,去河邊找鬼豆赏。 笑死挣菲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的掷邦。 我是一名探鬼主播白胀,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼抚岗!你這毒婦竟也來(lái)了或杠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宣蔚,失蹤者是張志新(化名)和其女友劉穎廷痘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體件已,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年元暴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篷扩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茉盏,死狀恐怖鉴未,靈堂內(nèi)的尸體忽然破棺而出枢冤,到底是詐尸還是另有隱情,我是刑警寧澤铜秆,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布淹真,位于F島的核電站,受9級(jí)特大地震影響连茧,放射性物質(zhì)發(fā)生泄漏核蘸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一啸驯、第九天 我趴在偏房一處隱蔽的房頂上張望客扎。 院中可真熱鬧,春花似錦罚斗、人聲如沸徙鱼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)袱吆。三九已至,卻和暖如春距淫,著一層夾襖步出監(jiān)牢的瞬間绞绒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工溉愁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留处铛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓拐揭,卻偏偏與公主長(zhǎng)得像撤蟆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子堂污,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容