mirror of
https://github.com/langbot-app/LangBot.git
synced 2025-11-25 03:15:06 +08:00
* Initial plan * feat: Add Kubernetes deployment configuration and guide Co-authored-by: RockChinQ <45992437+RockChinQ@users.noreply.github.com> * feat: Add test script and update docker-compose with k8s reference Co-authored-by: RockChinQ <45992437+RockChinQ@users.noreply.github.com> * doc: add k8s deployment doc in README --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: RockChinQ <45992437+RockChinQ@users.noreply.github.com> Co-authored-by: Junyan Qin <rockchinq@gmail.com>
401 lines
9.3 KiB
YAML
401 lines
9.3 KiB
YAML
# Kubernetes Deployment for LangBot
|
|
# This file provides Kubernetes deployment manifests for LangBot based on docker-compose.yaml
|
|
#
|
|
# Usage:
|
|
# kubectl apply -f kubernetes.yaml
|
|
#
|
|
# Prerequisites:
|
|
# - A Kubernetes cluster (1.19+)
|
|
# - kubectl configured to communicate with your cluster
|
|
# - (Optional) A StorageClass for dynamic volume provisioning
|
|
#
|
|
# Components:
|
|
# - Namespace: langbot
|
|
# - PersistentVolumeClaims for data persistence
|
|
# - Deployments for langbot and langbot_plugin_runtime
|
|
# - Services for network access
|
|
# - ConfigMap for timezone configuration
|
|
|
|
---
|
|
# Namespace
|
|
apiVersion: v1
|
|
kind: Namespace
|
|
metadata:
|
|
name: langbot
|
|
labels:
|
|
app: langbot
|
|
|
|
---
|
|
# PersistentVolumeClaim for LangBot data
|
|
apiVersion: v1
|
|
kind: PersistentVolumeClaim
|
|
metadata:
|
|
name: langbot-data
|
|
namespace: langbot
|
|
spec:
|
|
accessModes:
|
|
- ReadWriteOnce
|
|
resources:
|
|
requests:
|
|
storage: 10Gi
|
|
# Uncomment and modify if you have a specific StorageClass
|
|
# storageClassName: your-storage-class
|
|
|
|
---
|
|
# PersistentVolumeClaim for LangBot plugins
|
|
apiVersion: v1
|
|
kind: PersistentVolumeClaim
|
|
metadata:
|
|
name: langbot-plugins
|
|
namespace: langbot
|
|
spec:
|
|
accessModes:
|
|
- ReadWriteOnce
|
|
resources:
|
|
requests:
|
|
storage: 5Gi
|
|
# Uncomment and modify if you have a specific StorageClass
|
|
# storageClassName: your-storage-class
|
|
|
|
---
|
|
# PersistentVolumeClaim for Plugin Runtime data
|
|
apiVersion: v1
|
|
kind: PersistentVolumeClaim
|
|
metadata:
|
|
name: langbot-plugin-runtime-data
|
|
namespace: langbot
|
|
spec:
|
|
accessModes:
|
|
- ReadWriteOnce
|
|
resources:
|
|
requests:
|
|
storage: 5Gi
|
|
# Uncomment and modify if you have a specific StorageClass
|
|
# storageClassName: your-storage-class
|
|
|
|
---
|
|
# ConfigMap for environment configuration
|
|
apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: langbot-config
|
|
namespace: langbot
|
|
data:
|
|
TZ: "Asia/Shanghai"
|
|
PLUGIN__RUNTIME_WS_URL: "ws://langbot-plugin-runtime:5400/control/ws"
|
|
|
|
---
|
|
# Deployment for LangBot Plugin Runtime
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: langbot-plugin-runtime
|
|
namespace: langbot
|
|
labels:
|
|
app: langbot-plugin-runtime
|
|
spec:
|
|
replicas: 1
|
|
selector:
|
|
matchLabels:
|
|
app: langbot-plugin-runtime
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: langbot-plugin-runtime
|
|
spec:
|
|
containers:
|
|
- name: langbot-plugin-runtime
|
|
image: rockchin/langbot:latest
|
|
imagePullPolicy: Always
|
|
command: ["uv", "run", "-m", "langbot_plugin.cli.__init__", "rt"]
|
|
ports:
|
|
- containerPort: 5400
|
|
name: runtime
|
|
protocol: TCP
|
|
env:
|
|
- name: TZ
|
|
valueFrom:
|
|
configMapKeyRef:
|
|
name: langbot-config
|
|
key: TZ
|
|
volumeMounts:
|
|
- name: plugin-data
|
|
mountPath: /app/data/plugins
|
|
resources:
|
|
requests:
|
|
memory: "512Mi"
|
|
cpu: "250m"
|
|
limits:
|
|
memory: "2Gi"
|
|
cpu: "1000m"
|
|
# Liveness probe to restart container if it becomes unresponsive
|
|
livenessProbe:
|
|
tcpSocket:
|
|
port: 5400
|
|
initialDelaySeconds: 30
|
|
periodSeconds: 10
|
|
timeoutSeconds: 5
|
|
failureThreshold: 3
|
|
# Readiness probe to know when container is ready to accept traffic
|
|
readinessProbe:
|
|
tcpSocket:
|
|
port: 5400
|
|
initialDelaySeconds: 10
|
|
periodSeconds: 5
|
|
timeoutSeconds: 3
|
|
failureThreshold: 3
|
|
volumes:
|
|
- name: plugin-data
|
|
persistentVolumeClaim:
|
|
claimName: langbot-plugin-runtime-data
|
|
restartPolicy: Always
|
|
|
|
---
|
|
# Service for LangBot Plugin Runtime
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: langbot-plugin-runtime
|
|
namespace: langbot
|
|
labels:
|
|
app: langbot-plugin-runtime
|
|
spec:
|
|
type: ClusterIP
|
|
selector:
|
|
app: langbot-plugin-runtime
|
|
ports:
|
|
- port: 5400
|
|
targetPort: 5400
|
|
protocol: TCP
|
|
name: runtime
|
|
|
|
---
|
|
# Deployment for LangBot
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: langbot
|
|
namespace: langbot
|
|
labels:
|
|
app: langbot
|
|
spec:
|
|
replicas: 1
|
|
selector:
|
|
matchLabels:
|
|
app: langbot
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: langbot
|
|
spec:
|
|
containers:
|
|
- name: langbot
|
|
image: rockchin/langbot:latest
|
|
imagePullPolicy: Always
|
|
ports:
|
|
- containerPort: 5300
|
|
name: web
|
|
protocol: TCP
|
|
- containerPort: 2280
|
|
name: webhook-start
|
|
protocol: TCP
|
|
# Note: Kubernetes doesn't support port ranges directly in container ports
|
|
# The webhook ports 2280-2290 are available, but we only expose the start of the range
|
|
# If you need all ports exposed, consider using a Service with multiple port definitions
|
|
env:
|
|
- name: TZ
|
|
valueFrom:
|
|
configMapKeyRef:
|
|
name: langbot-config
|
|
key: TZ
|
|
- name: PLUGIN__RUNTIME_WS_URL
|
|
valueFrom:
|
|
configMapKeyRef:
|
|
name: langbot-config
|
|
key: PLUGIN__RUNTIME_WS_URL
|
|
volumeMounts:
|
|
- name: data
|
|
mountPath: /app/data
|
|
- name: plugins
|
|
mountPath: /app/plugins
|
|
resources:
|
|
requests:
|
|
memory: "1Gi"
|
|
cpu: "500m"
|
|
limits:
|
|
memory: "4Gi"
|
|
cpu: "2000m"
|
|
# Liveness probe to restart container if it becomes unresponsive
|
|
livenessProbe:
|
|
httpGet:
|
|
path: /
|
|
port: 5300
|
|
initialDelaySeconds: 60
|
|
periodSeconds: 10
|
|
timeoutSeconds: 5
|
|
failureThreshold: 3
|
|
# Readiness probe to know when container is ready to accept traffic
|
|
readinessProbe:
|
|
httpGet:
|
|
path: /
|
|
port: 5300
|
|
initialDelaySeconds: 30
|
|
periodSeconds: 5
|
|
timeoutSeconds: 3
|
|
failureThreshold: 3
|
|
volumes:
|
|
- name: data
|
|
persistentVolumeClaim:
|
|
claimName: langbot-data
|
|
- name: plugins
|
|
persistentVolumeClaim:
|
|
claimName: langbot-plugins
|
|
restartPolicy: Always
|
|
|
|
---
|
|
# Service for LangBot (ClusterIP for internal access)
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: langbot
|
|
namespace: langbot
|
|
labels:
|
|
app: langbot
|
|
spec:
|
|
type: ClusterIP
|
|
selector:
|
|
app: langbot
|
|
ports:
|
|
- port: 5300
|
|
targetPort: 5300
|
|
protocol: TCP
|
|
name: web
|
|
- port: 2280
|
|
targetPort: 2280
|
|
protocol: TCP
|
|
name: webhook-2280
|
|
- port: 2281
|
|
targetPort: 2281
|
|
protocol: TCP
|
|
name: webhook-2281
|
|
- port: 2282
|
|
targetPort: 2282
|
|
protocol: TCP
|
|
name: webhook-2282
|
|
- port: 2283
|
|
targetPort: 2283
|
|
protocol: TCP
|
|
name: webhook-2283
|
|
- port: 2284
|
|
targetPort: 2284
|
|
protocol: TCP
|
|
name: webhook-2284
|
|
- port: 2285
|
|
targetPort: 2285
|
|
protocol: TCP
|
|
name: webhook-2285
|
|
- port: 2286
|
|
targetPort: 2286
|
|
protocol: TCP
|
|
name: webhook-2286
|
|
- port: 2287
|
|
targetPort: 2287
|
|
protocol: TCP
|
|
name: webhook-2287
|
|
- port: 2288
|
|
targetPort: 2288
|
|
protocol: TCP
|
|
name: webhook-2288
|
|
- port: 2289
|
|
targetPort: 2289
|
|
protocol: TCP
|
|
name: webhook-2289
|
|
- port: 2290
|
|
targetPort: 2290
|
|
protocol: TCP
|
|
name: webhook-2290
|
|
|
|
---
|
|
# Ingress for external access (Optional - requires Ingress Controller)
|
|
# Uncomment and modify the following section if you want to expose LangBot via Ingress
|
|
# apiVersion: networking.k8s.io/v1
|
|
# kind: Ingress
|
|
# metadata:
|
|
# name: langbot-ingress
|
|
# namespace: langbot
|
|
# annotations:
|
|
# # Uncomment and modify based on your ingress controller
|
|
# # nginx.ingress.kubernetes.io/rewrite-target: /
|
|
# # cert-manager.io/cluster-issuer: letsencrypt-prod
|
|
# spec:
|
|
# ingressClassName: nginx # Change based on your ingress controller
|
|
# rules:
|
|
# - host: langbot.yourdomain.com # Change to your domain
|
|
# http:
|
|
# paths:
|
|
# - path: /
|
|
# pathType: Prefix
|
|
# backend:
|
|
# service:
|
|
# name: langbot
|
|
# port:
|
|
# number: 5300
|
|
# # Uncomment for TLS/HTTPS
|
|
# # tls:
|
|
# # - hosts:
|
|
# # - langbot.yourdomain.com
|
|
# # secretName: langbot-tls
|
|
|
|
---
|
|
# Service for LangBot with LoadBalancer (Alternative to Ingress)
|
|
# Uncomment the following if you want to expose LangBot directly via LoadBalancer
|
|
# This is useful in cloud environments (AWS, GCP, Azure, etc.)
|
|
# apiVersion: v1
|
|
# kind: Service
|
|
# metadata:
|
|
# name: langbot-loadbalancer
|
|
# namespace: langbot
|
|
# labels:
|
|
# app: langbot
|
|
# spec:
|
|
# type: LoadBalancer
|
|
# selector:
|
|
# app: langbot
|
|
# ports:
|
|
# - port: 80
|
|
# targetPort: 5300
|
|
# protocol: TCP
|
|
# name: web
|
|
# - port: 2280
|
|
# targetPort: 2280
|
|
# protocol: TCP
|
|
# name: webhook-start
|
|
# # Add more webhook ports as needed
|
|
|
|
---
|
|
# Service for LangBot with NodePort (Alternative for exposing service)
|
|
# Uncomment if you want to expose LangBot via NodePort
|
|
# This is useful for testing or when LoadBalancer is not available
|
|
# apiVersion: v1
|
|
# kind: Service
|
|
# metadata:
|
|
# name: langbot-nodeport
|
|
# namespace: langbot
|
|
# labels:
|
|
# app: langbot
|
|
# spec:
|
|
# type: NodePort
|
|
# selector:
|
|
# app: langbot
|
|
# ports:
|
|
# - port: 5300
|
|
# targetPort: 5300
|
|
# nodePort: 30300 # Must be in range 30000-32767
|
|
# protocol: TCP
|
|
# name: web
|
|
# - port: 2280
|
|
# targetPort: 2280
|
|
# nodePort: 30280 # Must be in range 30000-32767
|
|
# protocol: TCP
|
|
# name: webhook
|