簡體   English   中英

Kubernetes:將傳入流量路由到特定 Pod

[英]Kubernetes: Route incoming traffic to specific Pod

我想在 Google Kubernetes Engine 中部署許多 Pod,然后通過像 pod-name-or-label.mydomain.com 這樣的子域或像 protocol://mydomain.com:7878/pod- 這樣的路徑路由建立到每個特定 Pod 的 TCP 連接名稱或標簽。

我看過不同的方向,比如 Istio 或 nginx-ingress,但在我看來這太復雜了。

沒有一個簡單的解決方案嗎?

對於Istio ,您可以使用VirtualService通過DestinationRules定義來控制到目標子集路由規則

DestinationRule將路由至指定標簽目標。

請求流將希望:

+--------------------+
|                    |
|    Istio Gateway   |
|                    |
|                    |
+---------+----------+
          |traffic incoming
          |
+---------v----------+
|                    |
|   VirtualService   |
|                    |
|                    |
+---------+----------+
          |route to subset by the routing rules
          v

+--------------------+
|                    |
|  DestinationRules  |
|                    |
|                    |
+---------+----------+
          |route traffic to target pods
          v

+--------------------+
|                    |
|                    |
|       Pods         |
|                    |
+--------------------+

所以正如@ericstaples 所說,您應該使用不同的pod 標簽創建不同的部署,以實現將流量分離到目標 pod ,例如:

  1. 創建一個帶有 pod 標簽的部署:t1
  2. DestinationRule 中創建一個子集:選擇 t1 標簽 pod 作為子集 s1
  3. 控制路由到s1子集的VirtualService中的流量
  4. 到目標 Pod 的s1路由

同樣對於公開Gateway ,您可以像 ** Kubernetes** 其他服務一樣使用ClusterIPNodePort ,請參閱Istio Traffic 的更多信息

有一些參考資料也許有幫助:

https://istio.io/docs/concepts/traffic-management/

https://istio.io/docs/tasks/traffic-management/request-routing/

這個問題有點老了,但在當前的 Kubernetes 版本中,您可以使用Nginx Ingress輕松完成。

如果您想從集群外部訪問您的應用程序,您需要使用Services公開它。 最簡單的方法是當您將相同的選擇器放在Deployment/PodService時,將 Service 與選擇器一起使用。 下面的例子:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test1
spec:
  replicas: 1
  selector:
    matchLabels:
      key: test1
  template:
    metadata:
      labels:
        key: test1
    spec:
      containers:
      - name: hello1
        image: gcr.io/google-samples/hello-app:1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: test1
spec:
  selector:
    key: test1
  ports:
    - port: 80
      targetPort: 8080

路徑路由將在Ingress 中配置。 如下例所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: my.pod.svc 
    http:
      paths:
      - path: /pod
        backend:
          serviceName: my-pod
          servicePort: 80
  - host: nginx.test.svc
    http:
      paths:
      - path: /abc
        backend:
          serviceName: nginx1
          servicePort: 80

有關更多詳細信息,您可以查看此線程

現在我在集群上安裝了 istio 的解決方案:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: echo-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "dev.sample.com"

使用該網關,我可以應用該部署、服務、虛擬服務

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-echo-1000-deployment
  labels:
    echoservice: echo-1000
spec:
  replicas: 1
  selector:
    matchLabels:
      echoservice: echo-1000
  template:
    metadata:
      labels:
        echoservice: echo-1000
    spec:
      containers:
      - image: gcr.io/google-containers/echoserver:1.10
        imagePullPolicy: IfNotPresent
        name: my-echo-run-container
        ports:
        - containerPort: 8080
          protocol: TCP

---

apiVersion: v1
kind: Service
metadata:
  name: my-echo-1000-service
  labels:
    echoservice: echo-1000
spec:
  ports:
  - port: 8080
    name: http
  selector:
    echoservice: echo-1000

---

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-echo-1000-vservice
spec:
  hosts:
  - "dev.sample.com"
  gateways:
  - echo-gateway
  http:
  - match:
    - uri:
        exact: /echo-1000
    route:
    - destination:
        host: my-echo-1000-service
        port:
          number: 8080

從 istio-ingressgateway 獲取 LoadbalancerIP 並在 /etc/hosts 中為 dev.sample.com 創建一個條目

現在我可以使用http://dev.sample.com/echo-1000在特定 Pod 中獲取 echoserver

這是一個很好的解決方案還是有更好的解決方案?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM