周末爬坑,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

最新文章

  1. C# 解析JSON的几种办法
  2. 【WP开发】记录屏幕操作
  3. 【Andorid】短视频拍摄SDK——Vitamio Recorder 2.0 发布(支持ffmpeg命令行)
  4. 在Mac上配置Android adb命令
  5. IE9中Media queries在iframe无效的解决方法
  6. Linux 动画显示
  7. Acitivity间数据的传递
  8. Java线程(转)
  9. Android ListView分页加载时图片显示问题
  10. js判断一个变量是否为数组的解决方案
  11. boost::thread用法
  12. 实践中总结——理解haslayout和BFC
  13. LeetCode专题-Python实现之第14题:Longest Common Prefix
  14. P1181 数列分段Section I
  15. 学会学习:高效学习方式(使用vscode-snippet有感)
  16. Bootstrap treeview增加或者删除节点
  17. day22 模块最后的补充。包。
  18. [uboot] (第四章)uboot流程——uboot编译流程
  19. oracle执行多个pl/sql块
  20. centos 6.x 部署uwsgi+flask项目

热门文章

  1. Android端与Android端利用WIFI进行FTP通信
  2. php常见术语
  3. Mui自定义时间格式:
  4. spring mvc3+默认首页设置问题
  5. tomcat - gc日志输出
  6. Sqrt(x)——二分法,防越界
  7. AC日记——Mato的文件管理 bzoj 3289
  8. CentOS7安装和配置rsync+inotify
  9. POJ 2253 Frogger【最短路变形/最小生成树的最大权/最小瓶颈树/A到B多条路径中的最小的最长边】
  10. CodeForces 733D Kostya the Sculptor