gpt4 book ai didi

cookies - Kubernetes 集群上的粘性 session

转载 作者:行者123 更新时间:2023-12-02 11:28:45 25 4
gpt4 key购买 nike

目前,我正在尝试在 Google Cloud 上创建一个 Kubernetes 集群,其中有两个 负载平衡器 :一个用于后端(在 Spring Boot 中),另一个用于前端(在 Angular 中),其中每个服务(负载均衡器)与 2 个副本(pod)通信。为了实现这一点,我创建了以下入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: sample-ingress
spec:
rules:
- http:
paths:
- path: /rest/v1/*
backend:
serviceName: sample-backend
servicePort: 8082
- path: /*
backend:
serviceName: sample-frontend
servicePort: 80

上面提到的入口可以使前端应用程序与后端应用程序提供的 REST API 进行通信。但是,我必须创建 粘性 session ,因为后端提供的身份验证机制,因此每个用户都可以与同一个 POD 进行通信。澄清一下,如果一个用户在 POD #1 中进行身份验证,POD #2 将无法识别 cookie。

为了解决这个问题,我读到 Nginx-ingress 设法处理这种情况,我通过此处提供的步骤进行安装: https://kubernetes.github.io/ingress-nginx/deploy/使用 Helm 。

您可以在我尝试构建的架构图下方找到:

enter image description here

使用以下服务(我将只粘贴其中一项服务,另一项类似):
apiVersion: v1
kind: Service
metadata:
name: sample-backend
spec:
selector:
app: sample
tier: backend
ports:
- protocol: TCP
port: 8082
targetPort: 8082
type: LoadBalancer

我声明了以下入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: sample-nginx-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/affinity: cookie
nginx.ingress.kubernetes.io/affinity-mode: persistent
nginx.ingress.kubernetes.io/session-cookie-hash: sha1
nginx.ingress.kubernetes.io/session-cookie-name: sample-cookie
spec:
rules:
- http:
paths:
- path: /rest/v1/*
backend:
serviceName: sample-backend
servicePort: 8082
- path: /*
backend:
serviceName: sample-frontend
servicePort: 80

之后,我运行 kubectl apply -f sample-nginx-ingress.yaml应用入口,它被创建并且它的状态是好的。但是,当我访问出现在“端点”列中的 URL 时,浏览器无法连接到该 URL。
我做错了什么吗?

编辑 1

** 更新服务和入口配置 **

经过一些帮助,我设法通过 Ingress Nginx 访问了这些服务。在上面你有配置:

Nginx 入口

路径不应包含“”,这与默认的 Kubernetes 入口不同,默认 Kubernetes 入口必须使用“”来路由我想要的路径。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: sample-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "sample-cookie"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"

spec:
rules:
- http:
paths:
- path: /rest/v1/
backend:
serviceName: sample-backend
servicePort: 8082
- path: /
backend:
serviceName: sample-frontend
servicePort: 80

服务

此外,服务的类型不应为“LoadBalancer”,而是“ ClusterIP ”,如下所示:
apiVersion: v1
kind: Service
metadata:
name: sample-backend
spec:
selector:
app: sample
tier: backend
ports:
- protocol: TCP
port: 8082
targetPort: 8082
type: ClusterIP

但是,我仍然无法在我的 Kubernetes 集群中实现粘性 session ,一旦我仍然收到 403 并且甚至没有替换 cookie 名称,所以我猜注释没有按预期工作。

最佳答案

我调查了这个问题,并找到了解决您问题的方法。

要实现两条路径的粘性 session ,您将需要两个入口定义。

我创建了示例配置来向您展示整个过程:

重现步骤:

  • 应用 Ingress 定义
  • 创建部署
  • 创建服务
  • 创建入口
  • 测试

  • 我假设集群已配置并且工作正常。

    应用入口定义

    关注此 Ingress link 在您的基础设施上安装 Ingress Controller 之前,确定是否有任何必要的先决条件。

    应用以下命令以提供所有必需的先决条件:
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

    运行以下命令以应用通用配置来创建服务:
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml

    创建部署

    以下是响应特定服务上的 Ingress 流量的 2 个示例部署:

    你好.yaml:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: hello
    spec:
    selector:
    matchLabels:
    app: hello
    version: 1.0.0
    replicas: 5
    template:
    metadata:
    labels:
    app: hello
    version: 1.0.0
    spec:
    containers:
    - name: hello
    image: "gcr.io/google-samples/hello-app:1.0"
    env:
    - name: "PORT"
    value: "50001"

    通过调用命令应用第一个部署配置:
    $ kubectl apply -f hello.yaml
    再见.yaml:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: goodbye
    spec:
    selector:
    matchLabels:
    app: goodbye
    version: 2.0.0
    replicas: 5
    template:
    metadata:
    labels:
    app: goodbye
    version: 2.0.0
    spec:
    containers:
    - name: goodbye
    image: "gcr.io/google-samples/hello-app:2.0"
    env:
    - name: "PORT"
    value: "50001"

    通过调用命令应用第二个部署配置:
    $ kubectl apply -f goodbye.yaml
    检查部署是否正确配置了 pod:
    $ kubectl get deployments
    它应该显示如下内容:
    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    goodbye 5/5 5 5 2m19s
    hello 5/5 5 5 4m57s

    创建服务

    要连接到之前创建的 pod,您需要创建服务。每项服务都将分配给一个部署。以下是 2 项服务来实现这一点:

    hello-service.yaml:
    apiVersion: v1
    kind: Service
    metadata:
    name: hello-service
    spec:
    type: NodePort
    selector:
    app: hello
    version: 1.0.0
    ports:
    - name: hello-port
    protocol: TCP
    port: 50001
    targetPort: 50001

    通过调用命令应用第一个服务配置:
    $ kubectl apply -f hello-service.yaml
    再见服务.yaml:
    apiVersion: v1
    kind: Service
    metadata:
    name: goodbye-service
    spec:
    type: NodePort
    selector:
    app: goodbye
    version: 2.0.0
    ports:
    - name: goodbye-port
    protocol: TCP
    port: 50001
    targetPort: 50001

    通过调用命令应用第二个服务配置:
    $ kubectl apply -f goodbye-service.yaml
    请记住,在这两种配置中,类型为:NodePort

    检查服务是否创建成功:
    $ kubectl get services
    输出应如下所示:
    NAME              TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)           AGE
    goodbye-service NodePort 10.0.5.131 <none> 50001:32210/TCP 3s
    hello-service NodePort 10.0.8.13 <none> 50001:32118/TCP 8s

    创建入口

    要实现粘性 session ,您需要创建 2 个入口定义。

    定义如下:

    hello-ingress.yaml:
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: hello-ingress
    annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "hello-cookie"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/affinity-mode: persistent
    nginx.ingress.kubernetes.io/session-cookie-hash: sha1
    spec:
    rules:
    - host: DOMAIN.NAME
    http:
    paths:
    - path: /
    backend:
    serviceName: hello-service
    servicePort: hello-port


    再见-ingress.yaml:
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: goodbye-ingress
    annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "goodbye-cookie"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/affinity-mode: persistent
    nginx.ingress.kubernetes.io/session-cookie-hash: sha1
    spec:
    rules:
    - host: DOMAIN.NAME
    http:
    paths:
    - path: /v2/
    backend:
    serviceName: goodbye-service
    servicePort: goodbye-port

    请改 DOMAIN.NAME在两个入口中都适合您的情况。
    我建议看看这个 Ingress Sticky session 关联。
    两个入口都配置为仅 HTTP 流量。

    应用它们两个调用命令:
    $ kubectl apply -f hello-ingress.yaml $ kubectl apply -f goodbye-ingress.yaml
    检查是否应用了两种配置:
    $ kubectl get ingress
    输出应该是这样的:

    NAME              HOSTS        ADDRESS          PORTS   AGE
    goodbye-ingress DOMAIN.NAME IP_ADDRESS 80 26m
    hello-ingress DOMAIN.NAME IP_ADDRESS 80 26m

    测试

    打开浏览器并转到 http://DOMAIN.NAME输出应该是这样的:
    Hello, world!
    Version: 1.0.0
    Hostname: hello-549db57dfd-4h8fb
    Hostname: hello-549db57dfd-4h8fb是 pod 的名称。刷新几次。

    它应该保持不变。

    要检查另一条路线是否有效,请转到 http://DOMAIN.NAME/v2/输出应该是这样的:
    Hello, world!
    Version: 2.0.0
    Hostname: goodbye-7b5798f754-pbkbg
    Hostname: goodbye-7b5798f754-pbkbg是 pod 的名称。刷新几次。

    它应该保持不变。

    确保 cookie 不会改变打开的开发人员工具(可能是 F12)并导航到带有 cookie 的地方。您可以重新加载页面以检查它们是否没有变化。

    Cookies

    关于cookies - Kubernetes 集群上的粘性 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59272484/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com