[英]kubernetes - route ingress traffic to specific pod for some paths
[英]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 ,例如:
s1
子集的VirtualService中的流量s1
路由同樣對於公開Gateway ,您可以像 ** Kubernetes** 其他服務一樣使用ClusterIP或NodePort ,請參閱Istio Traffic 的更多信息。
有一些參考資料也許有幫助:
https://istio.io/docs/concepts/traffic-management/
https://istio.io/docs/tasks/traffic-management/request-routing/
這個問題有點老了,但在當前的 Kubernetes 版本中,您可以使用Nginx Ingress輕松完成。
如果您想從集群外部訪問您的應用程序,您需要使用Services公開它。 最簡單的方法是當您將相同的選擇器放在Deployment/Pod
和Service
時,將 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.