如何将nginx pod的请求转发到对应的php pod?

How to forward the requests from nginx pod to the corresponding php pod?

我正在尝试在 Azure Kubernetes 服务上部署我的 php symfony 应用程序。 php pod

我有以下 deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myphp-deployment
  labels:
    app: php
spec:
  replicas: 1
  selector:
    matchLabels:
      app: php
  template:
    metadata:
      labels:
        app: php
    spec:
      containers:
      - name: php
        image: myimage
        ports:
        - containerPort: 9000

这是 php 服务 yaml

apiVersion: v1
kind: Service
metadata:
  name: php
spec:
  selector:
    app: php
  ports:
    - protocol: TCP
      port: 9000
      targetPort: 9000

这是我的 nginx 部署 yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mynginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: myimage
        ports: 
        - containerPort: 80

还有我的 nginx-service yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
type: LoadBalancer

通过上述设置,一切正常。但是,如果我将副本集增加到两个,即 php pod 的 replicas:2,应用程序 不会始终保持状态

我发现来自我的 nginx pod 的请求被转发到(php 的)两个副本中的任何一个,并且它正在注销我。有时,它让我登录,但应用程序在行为方面不一致。

如何控制应将请求转发到哪个副本集?或者,如果现有 pod 出现故障,是否有办法动态提供另一个副本?

P.S 我是 Kubernetes 的新手

如何控制将请求转发到哪个副本集?

您要找的是session亲和力或粘性session。这可以通过入口来实现。 kubernetes 入口控制器,例如 Nginx ingress 控制器已经考虑并实施了这些要求。入口控制器用 Set-Cookie header 回复第一个请求的响应。 cookie 的值将映射到特定的 pod 副本。当后续请求再次返回时,客户端浏览器将附加 cookie,因此入口控制器能够将流量路由到同一个 pod 副本。

Kubernetes 具有像 StatefulSet or discover the sets of pods with Headless Service 这样的稳定​​ pod 名称的机制,但这些解决方案虽然很棒,但在您的用例中不如粘性 session 好。不过,如果您是 Kubernetes 的新手,那么值得一试。

或者如果现有 pod 出现故障,是否有动态提供另一个副本的方法?

如果您的应用程序将崩溃,Kubernetes 将尝试重新启动它。这是由 Container restart policy 控制的:

The spec of a Pod has a restartPolicy field with possible values Always, OnFailure, and Never. The default value is Always.

The restartPolicy applies to all containers in the Pod. restartPolicy only refers to restarts of the containers by the kubelet on the same node. After containers in a Pod exit, the kubelet restarts them with an exponential back-off delay (10s, 20s, 40s, …), that is capped at five minutes. Once a container has executed for 10 minutes without any problems, the kubelet resets the restart backoff timer for that container.

在某些情况下,您可能会遇到您的应用程序正在下降或无法正常工作但仍然没有 crashing/restarting。在这种情况下,您可以使用 Kubernetes livenessProbe。 Kubernetes 可以通过 liveness probes 检查容器是否仍然存在。您可以在 pod 的规范中为每个容器指定一个 liveness 探测器。 Kubernetes会周期性的执行探测,如果探测失败重启容器。