如何将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会周期性的执行探测,如果探测失败重启容器。
我正在尝试在 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 arestartPolicy
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会周期性的执行探测,如果探测失败重启容器。