Kubernetes:将传入流量路由到特定Pod

时间:2018-11-08 17:05:09

标签: kubernetes network-programming kubernetes-ingress google-kubernetes-engine istio

我想在Google Kubernetes Engine中部署许多Pod,然后通过子域(例如pod-name-or-label.mydomain.com)或路径路由(例如protocol://mydomain.com:7878)建立到每个特定Pod的TCP连接/ pod-name-or-label。

我从不同的方向看过,例如Istio或Nginx-ingress,但是在我看来,这太复杂了。

没有一个简单的解决方案吗?

3 个答案:

答案 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>,例如:

  1. 创建一个带有pod标签:t1的部署
  2. DestinationRule 中创建一个子集:选择t1标签吊舱作为子集s1
  3. VirtualService 中控制您的流量,该流量会路由到s1子集
  4. s1到目标豆荚的路线

也可以公开 Gateway ,您可以使用 ClusterIP NodePort ,就像** Kubernetes **其他服务一样,请参见{{ 3}}。

有一些参考资料可能会有所帮助:

VirtualService

DestinationRules

答案 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/PodService中放置相同的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