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

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

[root@k8s-master ~]# cat rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: helloworld-service
spec:
replicas:
template:
metadata:
labels:
weblogic-app: "helloworld"
version: "0.1"
spec:
containers:
- name: weblogichelloworld
image: -helloworld:v2
ports:
- containerPort:
---
apiVersion: v1
kind: Service
metadata:
name: helloworldsvc
labels:
weblogic-app: helloworld
spec:
type: NodePort
ports:
- port:
protocol: TCP
targetPort:
name: http
nodePort:
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:
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:
template:
metadata:
labels:
name: nginx-ingress-lb
annotations:
prometheus.io/port: ''
prometheus.io/scrape: 'true'
spec:
terminationGracePeriodSeconds:
hostNetwork: true
containers:
- image: gcr.io/google_containers/nginx-ingress-controller:0.9.-beta.
name: nginx-ingress-lb
readinessProbe:
httpGet:
path: /healthz
port:
scheme: HTTP
livenessProbe:
httpGet:
path: /healthz
port:
scheme: HTTP
initialDelaySeconds:
timeoutSeconds:
ports:
- containerPort:
hostPort:
- containerPort:
hostPort:
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

IngressController的session stick问题的更多相关文章

  1. web集群中经常使用的session同步解决方式及对照

    随着站点的功能越来越多,用户量越来越庞大,单节点模式已经严重不能支撑整个系统的正常运作,轻则用户页面訪问时间越来越慢.重则就会导致整个系统瘫痪.这时候 就须要优化或调整眼下的架构,大部分人就会採用各种 ...

  2. java web面试

    1. session和cookie的区别和联系,session的生命周期,多个服务部署时session管理. 原博http://blog.csdn.net/shuaishenkkk/article/d ...

  3. Tomcat集群如何同步会话

    Tocmat集群中最重要的交换信息就是会话消息,对某个tomcat实例某会话做的更改要同步到集群其他tomcat实例的该会话对象,这样才能保证集群所有实例的会话数据一致.在tribes组件的基础上完成 ...

  4. tomcat集群的failover机制

    集群要提供高可用性就必须要有某种机制去保证,常用的机制为failover(故障转移),简单说就是通过一定的heartbeat检测是否有故障,一旦故障发生备份节点则接管故障节点的工作. tomcat使用 ...

  5. tomcat集群实现源码级别剖析

    随着互联网快速发展,各种各样供外部访问的系统越来越多且访问量越来越大,以前Web容器可以包揽接收-逻辑处理-响应整个请求生命周期的工作,现在为了构建让更多用户访问更强大的系统,人们通过不断地业务解耦. ...

  6. tomcat集群机制剖析及其生产部署选型

    为什么要使用集群? 为什么要使用集群?主要有两方面原因:一是对于一些核心系统要求长期不能中断服务,为了提供高可用性我们需要由多台机器组成的集群:另外一方面,随着访问量越来越大且业务逻辑越来越复杂,单台 ...

  7. JCaptcha+Memcache的验证码集群实现

    一.问题背景 为了防止垃圾信息发布机器人的自动提交攻击,采用CAPTCHA验证码来保护该模块,提高攻击者的成本. 二.验证码简介 全自动区分计算机和人类的图灵测试(Completely Automat ...

  8. Linux环境下Apache反向代理金蝶中间件Apusic集群

    操作系统:RedHat Enterprise Linux 5.6 文档参考:<金蝶Apusic应用服务器 帮助手册| IX. Apusic Http Server使用指南> 一.金蝶中间件 ...

  9. Canal和Otter讨论二(原理与实践)

    上次留下的问题 问题一: 跨公网部署Otter 参考架构图 解析 ​ a. 数据涉及网络传输,S/E/T/L几个阶段会分散在2个或者更多Node节点上,多个Node之间通过zookeeper进行协同工 ...

随机推荐

  1. 第一次用python编写的小程序

    print ("*******数字游戏*********")temp = input ("猜猜小红现在心里想的是什么数字呢?")guess = int(temp ...

  2. powershell常用操作

    创建文件 New-Item -path $file_path -itemtype file 创建目录 New-Item -path $dir_path -type directory 删除目录 Rem ...

  3. python_day3学习笔记

    set集合 python的set是一个无序不重复元素集,基本功能包括关系测试和消除重复元素. 集合对象还支持并.交.差.对称差等. sets 支持 x in set. len(set).和 for x ...

  4. review的一个收获popstate,addEventListener:false ,split,jquery cache

    一.popstate:记录url历史变化 二.document.location.hash:锚点后面的东西 三.addEventListener:false 是否在捕获或者冒泡事件中执行 强转换 四. ...

  5. 安卓屏幕旋转时,禁止Activity重新加载

    安卓设备旋转屏幕时,Activity默认会重新加载,如果是要读取大量数据的场景,那等待的时间比较长,这一点不可接受,所以要想办法禁止Activity自动重新加载. 方法如下在AndroidManife ...

  6. 【JBPM4】完成任务

    示例代码: ProcessEngine processEngine = Configuration.getProcessEngine(); TaskService taskService = proc ...

  7. 如何开启apache的PHP-FPM实例

    PHP-FPM 作为 FastCGI 进程管理器而广为熟知,它是PHPFastCGI 实现的改进,带有更为有用的功能,用于处理高负载的服务器和网站.下面列出其中一些功能: 新功能 拥有具有优雅(gra ...

  8. Mac OS X系统下的Android环境变量配置

    在Mac下开发Android,要想在终端利用命令行使用adb/android等命令时,需要配置一下环境变量. 步骤: 1.首先,假设你已经下载了Android SDK,解压后安装了adb.记住sdk文 ...

  9. 洛谷——P1068 分数线划定

    P1068 分数线划定 题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,A 市对 所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试.面试分数线根 据 ...

  10. HDU 6065 RXD, tree and sequence (LCA DP)

    RXD, tree and sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java ...