Skip to content

Instantly share code, notes, and snippets.

@jsdevtom
Last active June 13, 2024 02:44
Show Gist options
  • Save jsdevtom/7045c03c021ce46b08cb3f41db0d76da to your computer and use it in GitHub Desktop.
Save jsdevtom/7045c03c021ce46b08cb3f41db0d76da to your computer and use it in GitHub Desktop.
kubernetes-ingress websockets with nodejs
export const ws = webSocket<WebsocketMessage>(`wss://${location.hostname}:${location.protocol === 'https:' ? 443 : 80}/ws/`);
export const wsObserver = ws
.pipe(
retryWhen(errors =>
errors.pipe(
delay(1000)
)
)
);
wsObserver.subscribe(console.log);
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-service
namespace: <YOUR_NAMESPACE>
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/proxy-read-timeout: 3600
nginx.ingress.kubernetes.io/proxy-send-timeout: 3600
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: client-cluster-ip-service
servicePort: 3000
# Below is the important part!
- path: /ws/
backend:
serviceName: server-cluster-ip-service
servicePort: 40510
apiVersion: v1
kind: Service
metadata:
name: server-cluster-ip-service
namespace: <YOUR_NAMESPACE>
spec:
type: ClusterIP
selector:
component: server
ports:
- port: 40510
targetPort: 40510
# The below line isn't required.
protocol: TCP
apiVersion: apps/v1
kind: Deployment
metadata:
name: server-deployment
namespace: <YOUR_NAMESPACE>
spec:
replicas: 1
selector:
matchLabels:
component: server
template:
metadata:
labels:
component: server
spec:
containers:
- name: server
image: <YOUR_DOCKER_IMAGE>
ports:
- containerPort: 40510
import { Server as WebSocketServer } from 'ws';
// IMPORTANT: not a secure connection
const wss = new WebSocketServer({
path: '/ws/',
port: 40510,
});
wss.on('connection', function (ws) {
console.log('connection!');
});
wss.on('close', function close() {
console.log('ws disconnected');
});
@slaguardia
Copy link

slaguardia commented Jun 13, 2024

Thank you for this, was struggling with something very similar when trying to use an ingress for my websocket client when deployed in minikube. If it helps anyone else:

Websocket client:

const websocketUrl = "ws://minikube.local/ws/"; // Replace with your WebSocket server URL
const socket = new WebSocket(websocketUrl);

(for local deployment, edit /etc/hosts so that minikube.local resolves to your minikube ip)

Websocket-server ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: websocket-server-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: minikube.local
    http:
      paths:
      - path: /ws/
        pathType: Prefix
        backend:
          service:
            name: websocket-server
            port:
              number: 8080

Websocket-server service:

apiVersion: v1
kind: Service
metadata:
  name: websocket-server
spec:
  selector:
    app: websocket-server
  ports:
  - protocol: TCP
    port: 8080

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment