K8S集群-长连接服务需要配置哪些

所谓长连接,一般我们所说的就是基于tcp协议长时间保持连接。我自个分成2种,一种就是tcp长连接,另外一种就是Websocket,简称ws,基于tcp的长连接,通过HTTP/1.1 协议的101状态码进行握手。
在开发项目时,有可能这2种都会有遇到。这里记录下在K8s中如何进行配置以及注意事项。

tcp长连接配置

在k8s中,我们需要创建长连接项目的服务svc,如果需要对外对外暴露提供接口,前面可以创建一个slb负载均衡实例,slb默认是基于4层tcp协议,提供80和443端口,我们可以借助阿里云控制台创建也可以yaml创建长连接svc服务

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/alicloud-loadbalancer-id: lb-xxxxx
  name: link-tcp-socket-svc
  namespace: bsg-prod
  resourceVersion: '493439928'
  selfLink: /api/v1/namespaces/bsg-prod/services/link-tcp-socket-svc
  uid: xxxxxx
spec:
  externalTrafficPolicy: Local
  healthCheckNodePort: 31694
  ports:
    - name: link-80
      nodePort: 31495
      port: 80
      protocol: TCP
      targetPort: 5150
    - name: link-443
      nodePort: 30254
      port: 443
      protocol: TCP
      targetPort: 5150
  selector:
    app: link
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
      - ip: xx.xx.xx.xx

创建好之后,slb配置tcp监听端口80和443即可,很简单。

Websocket配置

一般线上需要配置wss,即对ws加密,由于wss是通过https进行长连接的,对外暴露接口时就需要配置https协议监听端口(需要配置证书)。先说下配置的大致思路:slb(tcp)→ingress(https)→后端服务
在k8s中,因为配置的后端服务和Web服务器都是通过ingress-nginx来路由的,svc服务配置ClusterIP类型,再通过slb暴露出去,非常方便。
创建link-svc.yaml服务:

apiVersion: v1
kind: Service
metadata:
  name: link-websocket-svc
  namespace: bsg-prod
  resourceVersion: '493450033'
  selfLink: /api/v1/namespaces/21go-prod/services/link-websocket-svc
  uid: xxxx
spec:
  ports:
    - name: link-websocket
      port: 5151
      protocol: TCP
      targetPort: 5151
  selector:
    app: link
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

长连接服务创建的deployment就不说了,同时下面还需要创建link-ingress.yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/service-weight: ''
    proxy-read-timeout: '10800'
    proxy-send-timeout: '10800'
  generation: 3
  name: link-websocket-ingress
  namespace: bsg-prod
  resourceVersion: '493601690'
  selfLink: >-
    /apis/extensions/v1beta1/namespaces/bsg-prod/ingresses/link-websocket-ingress
  uid: xxxx
spec:
  rules:
    - host: link.xx.com
      http:
        paths:
          - backend:
              serviceName: link-websocket-svc
              servicePort: 5151
            path: /
  tls:
    - hosts:
        - link.xx.com
      secretName: app-ingress-secret0
status:
  loadBalancer:
    ingress:
      - ip: xxxx

ingress配置2点说明:
1.需要配置proxy-read-timeout和proxy-send-timeout值大于3600s即可;相关文档链接 https://kubernetes.github.io/...
2.配置https证书,上传证书密钥

疑问

可能会有人对wss会有疑问,既然wss是基于https协议属于7层的,为何前面slb还是tcp协议监听的,为何不直接用http监听?
因为slb的tcp是可以转发透传到http的,另外阿里云k8s默认创建后的slb就是tcp协议,所以没必用再单独创建一个http协议的slb实例。
以上希望对大家也有所帮助

你可能感兴趣的