我想在Google Kubernetes Engine中部署许多Pod,然后通过子域(例如pod-name-or-label.mydomain.com)或路径路由(例如protocol://mydomain.com:7878)建立到每个特定Pod的TCP连接/ pod-name-or-label。
我从不同的方向看过,例如Istio或Nginx-ingress,但是在我看来,这太复杂了。
没有一个简单的解决方案吗?
答案 0 :(得分:0)
对于 Istio ,您可以使用{{3}来控制{strong>子集的路由规则 }}。
目标规则将通过指定标签广告连播发送到目标广告连播。
请求流程将希望:
+--------------------+
| |
| 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分开< / strong>,例如:
s1
子集s1
到目标豆荚的路线也可以公开 Gateway ,您可以使用 ClusterIP 或 NodePort ,就像** Kubernetes **其他服务一样,请参见{{ 3}}。
有一些参考资料可能会有所帮助:
答案 1 :(得分:0)
现在我在群集上安装了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"
通过该网关,我可以应用Deployment,Service,VirtualService
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这是一个好的解决方案还是有更好的解决方案?
答案 2 :(得分:0)
这个问题有点老了,但是在当前的Kubernetes版本中,您可以使用Nginx Ingress轻松地做到这一点。
如果要从群集外部访问应用程序,则需要使用Services公开它。最简单的方法是在Deployment/Pod
和Service
中放置相同的selector时将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
有关更多详细信息,请检查this thread。