博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kubernetes中使用Traefik的sticky特性
阅读量:6319 次
发布时间:2019-06-22

本文共 4366 字,大约阅读时间需要 14 分钟。

文章楔子

在使用Nginx作为前端页面的反向代理时,有时我们需要在服务端为用户的本次访问保存一些临时状态,这种临时状态通常被称为会话。当访问压力增大时,常用的办法是开启多个服务端实例,然后使用Nginx一类的反向代理服务器进行负载均衡。然而对于依赖会话与用户进行交互的页面来说,由于负载均衡可能会将同一用户的两次访问分发到不同的服务端上,这样会话就无法正常运作了。而解决这个问题有最常用的两种方法,一种是在应用层面上作修改,以支持会话共享。另一种方式则是使用会话粘粘:在客户端第一次发起请求时,反向代理为客户端分配一个服务端,并且将该服务端的地址以SetCookie的形式发送给客户端,这样客户端下一次访问该反向代理时,便会带着这个cookie,里面包含了上一次反向代理分配给该客户端的服务端信息。在Nginx中,这种机制是通过一个名为Sticky的插件实现的。而Traefik6.0则集成了与Nginx的Sticky相同功能,并且可以在Kubernetes中方便的开启和配置该特性。

安装Traefik 6.0

首先需要在Kubernetes集群中安装Traefik,如果你已经安装过Traefik请直接跳至第三章

执行下面的yaml文件以安装traefik 6.0和对应的service对象

kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1beta1metadata: name: traefik-ingress-controllerrules: - apiGroups: - "" resources: - services - endpoints - secrets verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses verbs: - get - list - watch---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1beta1metadata: name: traefik-ingress-controllerroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: traefik-ingress-controllersubjects: - kind: ServiceAccount name: traefik-ingress-controller namespace: kube-system---apiVersion: v1kind: ServiceAccountmetadata: name: traefik-ingress-controller namespace: kube-system---kind: ConfigMapapiVersion: v1metadata: name: traefik-conf namespace: kube-systemdata: traefik.toml: | defaultEntryPoints = ["http"] [entryPoints] [entryPoints.http] address = ":80" ---kind: DaemonSetapiVersion: extensions/v1beta1metadata: name: traefik-ingress-controller namespace: kube-system labels: k8s-app: traefik-ingress-lbspec: template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 hostNetwork: true - name: config configMap: name: traefik-conf containers: - image: k8s.gcr.io/traefik:1.6 name: traefik-ingress-lb ports: - name: http containerPort: 80 hostPort: 80 - name: admin containerPort: 8080 securityContext: privileged: true args: - --configfile=/config/traefik.toml - -d - --web - --kubernetes volumeMounts: - mountPath: "/config" name: "config" ---kind: ServiceapiVersion: v1metadata: name: traefik-ingress-servicespec: selector: k8s-app: traefik-ingress-lb ports: - protocol: TCP port: 80 name: web - protocol: TCP port: 8080 name: admin - protocol: TCP port: 443 name: https type: NodePortapiVersion: v1kind: Servicemetadata: name: traefik-web-ui namespace: kube-systemspec: selector: k8s-app: traefik-ingress-lb ports: - port: 80 targetPort: 8080 ---apiVersion: extensions/v1beta1kind: Ingressmetadata: name: traefik-web-ui namespace: kube-system annotations: kubernetes.io/ingress.class: traefikspec: rules: - host: kuber.ingress.io http: paths: - backend: serviceName: traefik-web-ui servicePort: 80 ---apiVersion: extensions/v1beta1kind: Ingressmetadata: name: traefik-web-ui namespace: kube-system annotations: kubernetes.io/ingress.class: traefikspec: rules: - host: traefik.ingress.io http: paths: - backend: serviceName: traefik-web-ui servicePort: 80

随后将一个非master节点的IP和traefik.ingress.io配置到/etc/hosts文件中,如下图

并在浏览器上访问traefik.ingress.io,即可看到Traefik的监控页面

此时traefik安装完毕。

为服务端开启Sticky

正常的traefik通过下面的配置为指定的后端开启sticky

[backends] [backends.backend1] # Enable sticky session [backends.backend1.loadbalancer.stickiness] # Customize the cookie name # # Optional # Default: a sha1 (6 chars) # # cookieName = "my_cookie"

但此处由于我们将Traefik作为ingress controller安装在kubernetes中,因此Traefik的配置文件是托管给K8s来动态更新的,因此不能通过修改配置文件配置sticky

Kubernetes中可以通过为指定的service对象或ingress对象声明annotation来为ingress controller做额外的详细配置。例如,如果要开启sticky,只需要在想要开启sticky的服务端对应的service上添加以下的annotation即可。

metadata: annotations: traefik.ingress.kubernetes.io/affinity: "true"

还有更多配置可以参考

举例

apiVersion: v1kind: Servicemetadata: name: gls namespace: {
{
.Release.Namespace }} labels: name: gls annotations: traefik.ingress.kubernetes.io/affinity: "true" traefik.ingress.kubernetes.io/session-cookie-name: "gls-test" traefik.ingress.kubernetes.io/load-balancer-method: drrspec: selector: name: gls ports: - port: 80 targetPort: 8080 ---apiVersion: extensions/v1beta1kind: Ingressmetadata: name: gls namespace: {
{
.Release.Namespace }}spec: rules: - host: {
{
.Release.Namespace }}.{
{
.Values.runtime.network.domainName }} http: paths: - backend: serviceName: gls servicePort: 80 path: /gls

至此Sticky特性开启成功。

本文转自kubernetes中文社区-

转载地址:http://tujaa.baihongyu.com/

你可能感兴趣的文章
巧用Linux 架设TFTP Server备份路由器的配置文件
查看>>
关于MYSQL 字符转义问题总结
查看>>
视频数据:深度数据采集(Depth Data)
查看>>
红帽集群套件RHCS四部曲(概念篇)
查看>>
Google App Engine给我们带来了什么?
查看>>
WebLogic集群案例分析
查看>>
使用WINS服务器实现跨网段名称注册解析和释放
查看>>
理解并取证:DHCP的工作原理、怎么检测IP地址冲突
查看>>
Android单例模式应用场景
查看>>
其他资源记录类型及应用示例
查看>>
Exchange管理控制台无法安装,要求重新启动
查看>>
kubernetes集群网络配置方案——flannel部署
查看>>
Lync 小技巧-51-Lync 2013-不加域-客户端-1-下载-证书-信任链
查看>>
网络管理实战宝典
查看>>
连连看路径求解的算法
查看>>
JavaScript 的面向对象编程
查看>>
kafka的topic和分区策略——log entry和消息id索引文件
查看>>
splunk的bucket组织目录——时间序列,按照时间来组织目录
查看>>
简单的分页控件(原创)
查看>>
NeHe OpenGL教程 第十课:3D世界
查看>>