• IngressController的session stick问题


    周末爬坑,IngressController恢复因为镜像下载和版本问题折腾一下午,晚上终于折腾出个眉目。

    首先,在Kubernetes的service中是可以设置Session Affinity的。例子如下:

    [root@k8s-master ~]# cat rc.yaml
    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: helloworld-service
    spec:
      replicas: 2 
      template:
        metadata:
          labels:
            weblogic-app: "helloworld"
            version: "0.1"
        spec:
          containers:
          - name: weblogichelloworld
            image: 1213-helloworld:v2
            ports:
            - containerPort: 7001
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: helloworldsvc
      labels:
        weblogic-app: helloworld
    spec:
      type: NodePort
      ports:
      - port: 7001
        protocol: TCP
        targetPort: 7001
        name: http
        nodePort: 30005
      selector:
        weblogic-app: helloworld
      sessionAffinity: ClientIP

    最核心就是最后那句,会基于客户端访问服务的ip进行hash运算后把同一ip的请求路由到同一个pod.这样通过nodePort方式过来的请求就不会到处分发了。

    但这并不意味着通过IngressController过来的请求不会到处发,实际上在gcr.io/google_containers/nginx-ingress-controller:0.61版本就加上了session stick的功能,需要你在

    创建Ingress对象的时候添加Annotation,比如:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: dashboard-weblogic-ingress
      annotations:
        ingress.kubernetes.io/affinity: "cookie"
        ingress.kubernetes.io/session-cookie-name: "route"
        ingress.kubernetes.io/session-cookie-hash: "sha1"
    spec:
      rules:
      - host: helloworld.paic.test
        http:
          paths:
          - backend:
              serviceName: helloworldsvc 
              servicePort: 7001
            path: /

    如何验证这个annotation已经生效了呢?这个问题我折腾了很久,因为按照文档的说法通过

    curl -v http://<ingress-svc-address> -H 'Host: example.com'
    
    kubectl  exec -n kube-system nginx-ingress-lb-303jx  -- curl -v localhost  -H'Host: helloworld.test' 

    全部返回的是404,503,并没有以下的cookie

    < Set-Cookie: route=dc89ae303c62a8bfce8bf32f06d27c31f0980ef7; Path=/; HttpOnly

    无奈进入IngressController,查看具体的最终Nginx配置

    在 /etc/nginx/nginx.conf 中。

     而Pod的信息是

     可见Nginx是绕开了Service,直接把pod的ip写入到配置文件,所以也就是Service中的Session Affinity设置应该不起作用。

    但Cookie到底有没有设置成功呢,通过chrome访问网站,然后查看Cookie

     成功看到,验证的时候也没问题,所以应该配置生效。

    最后贴一个ingress-controller的yaml

    [root@k8s-master ingress]# cat nginx-ingress-controller.yaml 
    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: nginx-ingress-lb
      labels:
        name: nginx-ingress-lb
      namespace: kube-system
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            name: nginx-ingress-lb
          annotations:
            prometheus.io/port: '10254'
            prometheus.io/scrape: 'true'
        spec:
          terminationGracePeriodSeconds: 60
          hostNetwork: true
          containers:
          - image: gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.7
            name: nginx-ingress-lb
            readinessProbe:
              httpGet:
                path: /healthz
                port: 10254
                scheme: HTTP
            livenessProbe:
              httpGet:
                path: /healthz
                port: 10254
                scheme: HTTP
              initialDelaySeconds: 10
              timeoutSeconds: 1
            ports:
            - containerPort: 80
              hostPort: 80
            - containerPort: 443
              hostPort: 443
            env:
              - name: POD_NAME
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.name
              - name: POD_NAMESPACE
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace
              - name: KUBERNETES_MASTER
                value: http://192.168.0.104:8080
            args:
            - /nginx-ingress-controller
            - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
            - --apiserver-host=http://192.168.0.104:8080
  • 相关阅读:
    在实践中培养学生学习软件工程的兴趣
    软件工程课程设计指导随笔
    软件工程——个人总结
    软件工程第二次作业——结对编程
    个人博客作业三:微软小娜APP的案例分析
    嵌入式软件设计第12次实验报告
    嵌入式软件设计第11次实验报告
    嵌入式软件设计第09实验报告
    嵌入式软件设计第10次实验报告
    嵌入式软件设计第7次实验报告8
  • 原文地址:https://www.cnblogs.com/ericnie/p/7858204.html
Copyright © 2020-2023  润新知