Merge pull request #1825 from yashsinghcodes/main

Default k8s deployment using helm charts
This commit is contained in:
Frikky
2025-10-02 09:49:23 +02:00
committed by GitHub
9 changed files with 50 additions and 1124 deletions
+8 -64
View File
@@ -1,68 +1,12 @@
## How to deploy Shuffle on Kubernetes?
# Shuffle in Kubernetes
### Prerequisites:
- Clone the https://github.com/shuffle/shuffle repository using Git then, navigate to the functions/kubernetes directory, which contains all the necessary Kubernetes configuration files for deployment.
- [Running a Kubernetes cluster](https://kubernetes.io/docs/setup/). You can do that with either minikube or run the cluster locally.
- Ensure you have a local Docker registry set up to store and manage Docker images for applications built with Shuffle. While the registry is crucial for handling custom-built apps, youll still be able to run workflows without it. To setup a docker registry, if you have docker installed on one of your node run following commands.
```
chmod +x generate_certs.sh
./setup_registry.sh
```
> This will give you a NODE_IP which is you're local IP if you're not sure about what to use.
> **Make sure that port 5000 is not exposed to the internet!**
- 8 GB RAM and 4 CPUs are recommended as **minimum configs** for running Shuffle on Kubernetes. K8s is a resource-intensive application, and you may experience performance issues if you run it on a machine with fewer resources.
- If you've used the above commands to set up a registry, you'll need to skip an SSL verification for your registry. If you're using Containerd as a runtime
add the following lines in /etc/containerd/config.toml
```
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."<REGISTRY_NODE_IP:PORT>"]
endpoint = ["https://<REGISTRY_NODE_IP:PORT>"]
[plugins."io.containerd.grpc.v1.cri".registry.configs."<REGISTRY_NODE_IP:PORT>".tls]
insecure_skip_verify = true
```
### Instructions
Step 1: Create a namespace called shuffle in a cluster by running ```kubectl create ns shuffle```.
Step 2: Open the ```all-in-one.yaml``` file and review the configuration values. Change the value of REGISTRY_URL with '<NODE_IP>:5000' where the registry is at. Adjust other variables as per your deployment requirements; otherwise, the application will deploy using the default settings provided within the file. Then apply the configmap and deploy with ```kubectl apply -f all-in-one.yaml -n shuffle```
Step 3: Now, open ```https://<YOUR_NODE_IP>:30008``` or ```http://<YOUR_NODE_IP>:30007```. You should be seeing a signup page. NODE_IP should be where the frontend is deployed.
### Dev Mode
1. Run backend and orborus with the environment variable `IS_KUBERNETES=true`:
```bash
export IS_KUBERNETES=true
```
2. Turn on the k8s engine with minikube:
```bash
minikube start
```
3. To use the worker scale feature, build the image with the following command:
```bash
$NAME=shuffle-worker-scale
$VERSION=1.2.0
minikube build . -t shuffle/shuffle:$NAME -t shuffle/shuffle:$NAME_$VERSION -t docker.pkg.github.com/shuffle/shuffle/$NAME:$VERSION -t ghcr.io/shuffle/$NAME:$VERSION -t ghcr.io/shuffle/$NAME:nightly -t ghcr.io/shuffle/$NAME:$VERSION -t ghcr.io/shuffle/$NAME:nightly -t ghcr.io/shuffle/$NAME:latest
```
4. To run executions, Make sure to do the following:
```bash
kubectl create role pod-creator --namespace=default --verb=create --resource=pods
kubectl create rolebinding pod-creator-binding --namespace=default --role=pod-creator --serviceaccount=default:default
```
1. Make sure you have a Kubernetes cluster available. MiniKube works for testing.
2. Install `helm install shuffle oci://ghcr.io/shuffle/charts/shuffle --namespace shuffle --create-namespace`
3. Tweak the configuration files if needed! This is not meant to be a one-size-fits-all
More details in the [kubernetes/Charts/Shuffle folder.](https://github.com/Shuffle/Shuffle/tree/main/functions/kubernetes/charts/shuffle#usage)
## Architecture
Here is the default architecture it follows, with the "Frontend" being the exposed container you interact with.
<img width="1006" height="1069" alt="image" src="https://github.com/user-attachments/assets/263369a1-6944-4ef5-8f19-14bc234130d8" />
-894
View File
@@ -1,894 +0,0 @@
apiVersion: v1
kind: Namespace
metadata:
name: shuffle
---
## ONLY for minikube
# apiVersion: storage.k8s.io/v1
# kind: StorageClass
# metadata:
# name: standard-rwo
# provisioner: k8s.io/minikube-hostpath
# reclaimPolicy: Delete
# volumeBindingMode: Immediate
# ---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: shuffle-data
namespace: shuffle
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
metadata:
namespace: shuffle
creationTimestamp: null
labels:
io.kompose.service: backend-env
name: env
data:
BACKEND_HOSTNAME: shuffle-backend
BACKEND_PORT: "5001"
BASE_URL: http://shuffle-backend:5001
DATASTORE_EMULATOR_HOST: shuffle-database:8000
DB_LOCATION: /mnt/shuffle-data/open-search
DOCKER_API_VERSION: "1.40"
ENVIRONMENT_NAME: Shuffle
FRONTEND_PORT: "3001"
FRONTEND_PORT_HTTPS: "3443"
HTTP_PROXY: ""
HTTPS_PROXY: ""
ORBORUS_CONTAINER_NAME: "\t\t\t\t"
ORG_ID: Shuffle
OUTER_HOSTNAME: shuffle-backend
SHUFFLE_APP_DOWNLOAD_LOCATION: https://github.com/shuffle/python-apps
SHUFFLE_APP_FORCE_UPDATE: "false"
SHUFFLE_APP_HOTLOAD_FOLDER: /shuffle-apps
SHUFFLE_APP_HOTLOAD_LOCATION: ./shuffle-apps
SHUFFLE_BASE_IMAGE_NAME: shuffle
SHUFFLE_BASE_IMAGE_REGISTRY: ghcr.io
SHUFFLE_BASE_IMAGE_TAG_SUFFIX: -1.0.0
SHUFFLE_CHAT_DISABLED: "false"
SHUFFLE_CONTAINER_AUTO_CLEANUP: "false"
SHUFFLE_DEFAULT_APIKEY: ""
SHUFFLE_DEFAULT_PASSWORD: ""
SHUFFLE_DEFAULT_USERNAME: ""
SHUFFLE_DOWNLOAD_AUTH_BRANCH: ""
SHUFFLE_DOWNLOAD_AUTH_PASSWORD: ""
SHUFFLE_DOWNLOAD_AUTH_USERNAME: ""
SHUFFLE_DOWNLOAD_WORKFLOW_BRANCH: ""
SHUFFLE_DOWNLOAD_WORKFLOW_LOCATION: ""
SHUFFLE_DOWNLOAD_WORKFLOW_PASSWORD: ""
SHUFFLE_DOWNLOAD_WORKFLOW_USERNAME: ""
SHUFFLE_ELASTIC: "true"
SHUFFLE_ENCRYPTION_MODIFIER: ""
SHUFFLE_FILE_LOCATION: /shuffle-files
SHUFFLE_LOGS_DISABLED: "false"
SHUFFLE_OPENSEARCH_APIKEY: ""
SHUFFLE_OPENSEARCH_CERTIFICATE_FILE: ""
SHUFFLE_OPENSEARCH_CLOUDID: ""
KUBERNETES_NAMESPACE: shuffle
SHUFFLE_OPENSEARCH_INDEX_PREFIX: ""
SHUFFLE_OPENSEARCH_PASSWORD: admin
SHUFFLE_OPENSEARCH_PROXY: ""
SHUFFLE_OPENSEARCH_SKIPSSL_VERIFY: "true"
SHUFFLE_OPENSEARCH_URL: https://opensearch:9200
SHUFFLE_MEMCACHED: shuffle-memcached:11211
SHUFFLE_OPENSEARCH_USERNAME: admin
SHUFFLE_ORBORUS_STARTUP_DELAY: "\t\t"
SHUFFLE_PASS_APP_PROXY: "FALSE"
SHUFFLE_PASS_WORKER_PROXY: "TRUE"
SHUFFLE_RERUN_SCHEDULE: "300"
SSO_REDIRECT_URL: ""
TZ: "Europe/Amsterdam \t\t\t\t\t"
IS_KUBERNETES: "true"
REGISTRY_URL: "docker-registry:5000"
REGISTRY_AUTH: "false"
SHUFFLE_KUBERNETES_WORKER: "ghcr.io/shuffle/shuffle-worker:latest"
kind: ConfigMap
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: shuffle
name: pod-manager
rules:
- apiGroups: [""]
resources: ["pods", "services", "deployments"]
verbs: ["get", "list", "create", "update", "delete"]
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["create", "get", "list", "watch", "delete"]
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["rolebindings", "roles"]
verbs: ["get", "list", "create"]
- apiGroups: ["apps"]
resources: ["deployments", "pods", "services"]
verbs: ["create", "get", "list", "update", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-manager-binding
namespace: shuffle
subjects:
- kind: ServiceAccount
name: default
namespace: shuffle
roleRef:
kind: Role
name: pod-manager
apiGroup: rbac.authorization.k8s.io
---
# apiVersion: v1
# kind: PersistentVolume
# metadata:
# name: shuffle-os-pv
# namespace: shuffle
# spec:
# capacity:
# storage: 10Gi # Adjust the storage size as per your requirements
# accessModes:
# - ReadWriteOnce # This allows read-write access to a single node
# persistentVolumeReclaimPolicy: Retain # Adjust the reclaim policy as per your needs
# storageClassName: standard-rwo # Set the desired storage class
# hostPath:
# path: /mnt/shuffle-data/open-search
# ---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
namespace: shuffle
creationTimestamp: null
labels:
io.kompose.service: opensearch-claim0
name: opensearch-claim0
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard-rwo
resources:
requests:
storage: 500Mi
status: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: shuffle
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.service: opensearch
name: opensearch
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: opensearch
strategy: {}
template:
metadata:
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.network/shuffle: "true"
io.kompose.service: opensearch
spec:
# securityContext:
# runAsUser: 1000 # UID
# fsGroup: 1000 # GID
# nodeSelector:
# node: worker1
initContainers:
- name: volume-permissions
image: busybox
command: ["sh", "-c", "chown -R 1000:1000 /usr/share/opensearch/data"]
volumeMounts:
- name: opensearch-claim0
mountPath: /usr/share/opensearch/data
containers:
- env:
- name: OPENSEARCH_JAVA_OPTS
value: -Xms1024m -Xmx1024m
#- name: bootstrap.memory_lock
#value: "true"
- name: cluster.initial_master_nodes
value: shuffle-opensearch
- name: cluster.name
value: shuffle-cluster
- name: cluster.routing.allocation.disk.threshold_enabled
value: "false"
- name: discovery.seed_hosts
value: shuffle-opensearch
- name: node.name
value: shuffle-opensearch
- name: node.store.allow_mmap
value: "false"
- name: DB_LOCATION
valueFrom:
configMapKeyRef:
name: env
key: DB_LOCATION
image: opensearchproject/opensearch:2.5.0
name: shuffle-opensearch
ports:
- containerPort: 9200
resources: {}
volumeMounts:
- mountPath: /usr/share/opensearch/data
name: opensearch-claim0
hostname: shuffle-opensearch
restartPolicy: Always
volumes:
- name: opensearch-claim0
persistentVolumeClaim:
claimName: opensearch-claim0
status: {}
---
apiVersion: v1
kind: Service
metadata:
namespace: shuffle
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.service: opensearch
name: opensearch
spec:
ports:
- name: "9200"
port: 9200
targetPort: 9200
selector:
io.kompose.service: opensearch
status:
loadBalancer: {}
---
# apiVersion: v1
# kind: PersistentVolume
# metadata:
# namespace: shuffle
# name: shuffle-apps-pv
# spec:
# capacity:
# storage: 5Gi
# accessModes:
# - ReadWriteOnce
# persistentVolumeReclaimPolicy: Retain
# storageClassName: shuffle-data
# hostPath:
# path: /mnt/shuffle-data/backend
# ---
# apiVersion: v1
# kind: PersistentVolume
# metadata:
# namespace: shuffle
# name: shuffle-files-pv
# spec:
# capacity:
# storage: 5Gi
# accessModes:
# - ReadWriteOnce
# persistentVolumeReclaimPolicy: Retain
# storageClassName: shuffle-data
# hostPath:
# path: /mnt/shuffle-data/backend
# ---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
namespace: shuffle
creationTimestamp: null
labels:
io.kompose.service: backend-files-claim
name: backend-files-claim
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard-rwo
resources:
requests:
storage: 5Gi
# status: {}
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
namespace: shuffle
creationTimestamp: null
labels:
io.kompose.service: backend-apps-claim
name: backend-apps-claim
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard-rwo
resources:
requests:
storage: 5Gi
# status: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: shuffle-memcached
namespace: shuffle
spec:
replicas: 1
selector:
matchLabels:
app: shuffle-memcached
template:
metadata:
labels:
app: shuffle-memcached
spec:
containers:
- name: shuffle-memcached
image: memcached:latest
ports:
- containerPort: 11211
resources: {}
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
namespace: shuffle
name: shuffle-memcached
spec:
ports:
- port: 11211
targetPort: 11211
selector:
app: shuffle-memcached
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: shuffle
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.service: backend
name: backend
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: backend
strategy:
type: Recreate
template:
metadata:
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.network/shuffle: "true"
io.kompose.service: backend
app: shuffle-backend
name: shuffle-backend
spec:
volumes:
- name: shuffle-files
persistentVolumeClaim:
claimName: backend-files-claim
- name: shuffle-apps
persistentVolumeClaim:
claimName: backend-apps-claim
# nodeSelector:
# node: master
containers:
- env:
- name: BACKEND_HOSTNAME
valueFrom:
configMapKeyRef:
key: BACKEND_HOSTNAME
name: env
- name: BACKEND_PORT
valueFrom:
configMapKeyRef:
key: BACKEND_PORT
name: env
- name: BASE_URL
valueFrom:
configMapKeyRef:
key: BASE_URL
name: env
- name: DATASTORE_EMULATOR_HOST
valueFrom:
configMapKeyRef:
key: DATASTORE_EMULATOR_HOST
name: env
- name: DB_LOCATION
valueFrom:
configMapKeyRef:
key: DB_LOCATION
name: env
- name: DOCKER_API_VERSION
valueFrom:
configMapKeyRef:
key: DOCKER_API_VERSION
name: env
- name: ENVIRONMENT_NAME
valueFrom:
configMapKeyRef:
key: ENVIRONMENT_NAME
name: env
- name: FRONTEND_PORT
valueFrom:
configMapKeyRef:
key: FRONTEND_PORT
name: env
- name: FRONTEND_PORT_HTTPS
valueFrom:
configMapKeyRef:
key: FRONTEND_PORT_HTTPS
name: env
- name: HTTPS_PROXY
valueFrom:
configMapKeyRef:
key: HTTPS_PROXY
name: env
- name: HTTP_PROXY
valueFrom:
configMapKeyRef:
key: HTTP_PROXY
name: env
- name: ORBORUS_CONTAINER_NAME
valueFrom:
configMapKeyRef:
key: ORBORUS_CONTAINER_NAME
name: env
- name: ORG_ID
valueFrom:
configMapKeyRef:
key: ORG_ID
name: env
- name: OUTER_HOSTNAME
valueFrom:
configMapKeyRef:
key: OUTER_HOSTNAME
name: env
- name: SHUFFLE_APP_DOWNLOAD_LOCATION
valueFrom:
configMapKeyRef:
key: SHUFFLE_APP_DOWNLOAD_LOCATION
name: env
- name: SHUFFLE_APP_FORCE_UPDATE
valueFrom:
configMapKeyRef:
key: SHUFFLE_APP_FORCE_UPDATE
name: env
- name: SHUFFLE_APP_HOTLOAD_FOLDER
valueFrom:
configMapKeyRef:
key: SHUFFLE_APP_HOTLOAD_FOLDER
name: env
- name: SHUFFLE_APP_HOTLOAD_LOCATION
valueFrom:
configMapKeyRef:
key: SHUFFLE_APP_HOTLOAD_LOCATION
name: env
- name: SHUFFLE_BASE_IMAGE_NAME
valueFrom:
configMapKeyRef:
key: SHUFFLE_BASE_IMAGE_NAME
name: env
- name: SHUFFLE_BASE_IMAGE_REGISTRY
valueFrom:
configMapKeyRef:
key: SHUFFLE_BASE_IMAGE_REGISTRY
name: env
- name: SHUFFLE_BASE_IMAGE_TAG_SUFFIX
valueFrom:
configMapKeyRef:
key: SHUFFLE_BASE_IMAGE_TAG_SUFFIX
name: env
- name: SHUFFLE_CHAT_DISABLED
valueFrom:
configMapKeyRef:
key: SHUFFLE_CHAT_DISABLED
name: env
- name: SHUFFLE_CONTAINER_AUTO_CLEANUP
valueFrom:
configMapKeyRef:
key: SHUFFLE_CONTAINER_AUTO_CLEANUP
name: env
- name: SHUFFLE_DEFAULT_APIKEY
valueFrom:
configMapKeyRef:
key: SHUFFLE_DEFAULT_APIKEY
name: env
- name: SHUFFLE_DEFAULT_PASSWORD
valueFrom:
configMapKeyRef:
key: SHUFFLE_DEFAULT_PASSWORD
name: env
- name: SHUFFLE_DEFAULT_USERNAME
valueFrom:
configMapKeyRef:
key: SHUFFLE_DEFAULT_USERNAME
name: env
- name: SHUFFLE_DOWNLOAD_AUTH_BRANCH
valueFrom:
configMapKeyRef:
key: SHUFFLE_DOWNLOAD_AUTH_BRANCH
name: env
- name: SHUFFLE_DOWNLOAD_AUTH_PASSWORD
valueFrom:
configMapKeyRef:
key: SHUFFLE_DOWNLOAD_AUTH_PASSWORD
name: env
- name: SHUFFLE_DOWNLOAD_AUTH_USERNAME
valueFrom:
configMapKeyRef:
key: SHUFFLE_DOWNLOAD_AUTH_USERNAME
name: env
- name: SHUFFLE_DOWNLOAD_WORKFLOW_BRANCH
valueFrom:
configMapKeyRef:
key: SHUFFLE_DOWNLOAD_WORKFLOW_BRANCH
name: env
- name: SHUFFLE_DOWNLOAD_WORKFLOW_LOCATION
valueFrom:
configMapKeyRef:
key: SHUFFLE_DOWNLOAD_WORKFLOW_LOCATION
name: env
- name: SHUFFLE_DOWNLOAD_WORKFLOW_PASSWORD
valueFrom:
configMapKeyRef:
key: SHUFFLE_DOWNLOAD_WORKFLOW_PASSWORD
name: env
- name: SHUFFLE_DOWNLOAD_WORKFLOW_USERNAME
valueFrom:
configMapKeyRef:
key: SHUFFLE_DOWNLOAD_WORKFLOW_USERNAME
name: env
- name: SHUFFLE_ELASTIC
valueFrom:
configMapKeyRef:
key: SHUFFLE_ELASTIC
name: env
- name: SHUFFLE_ENCRYPTION_MODIFIER
valueFrom:
configMapKeyRef:
key: SHUFFLE_ENCRYPTION_MODIFIER
name: env
- name: SHUFFLE_FILE_LOCATION
valueFrom:
configMapKeyRef:
key: SHUFFLE_FILE_LOCATION
name: env
- name: SHUFFLE_LOGS_DISABLED
valueFrom:
configMapKeyRef:
key: SHUFFLE_LOGS_DISABLED
name: env
- name: SHUFFLE_OPENSEARCH_APIKEY
valueFrom:
configMapKeyRef:
key: SHUFFLE_OPENSEARCH_APIKEY
name: env
- name: SHUFFLE_MEMCACHED
valueFrom:
configMapKeyRef:
key: SHUFFLE_MEMCACHED
name: env
- name: SHUFFLE_OPENSEARCH_CERTIFICATE_FILE
valueFrom:
configMapKeyRef:
key: SHUFFLE_OPENSEARCH_CERTIFICATE_FILE
name: env
- name: SHUFFLE_OPENSEARCH_CLOUDID
valueFrom:
configMapKeyRef:
key: SHUFFLE_OPENSEARCH_CLOUDID
name: env
- name: SHUFFLE_OPENSEARCH_INDEX_PREFIX
valueFrom:
configMapKeyRef:
key: SHUFFLE_OPENSEARCH_INDEX_PREFIX
name: env
- name: SHUFFLE_OPENSEARCH_PASSWORD
valueFrom:
configMapKeyRef:
key: SHUFFLE_OPENSEARCH_PASSWORD
name: env
- name: SHUFFLE_OPENSEARCH_PROXY
valueFrom:
configMapKeyRef:
key: SHUFFLE_OPENSEARCH_PROXY
name: env
- name: SHUFFLE_OPENSEARCH_SKIPSSL_VERIFY
valueFrom:
configMapKeyRef:
key: SHUFFLE_OPENSEARCH_SKIPSSL_VERIFY
name: env
- name: SHUFFLE_OPENSEARCH_URL
valueFrom:
configMapKeyRef:
key: SHUFFLE_OPENSEARCH_URL
name: env
- name: SHUFFLE_OPENSEARCH_USERNAME
valueFrom:
configMapKeyRef:
key: SHUFFLE_OPENSEARCH_USERNAME
name: env
- name: SHUFFLE_ORBORUS_STARTUP_DELAY
valueFrom:
configMapKeyRef:
key: SHUFFLE_ORBORUS_STARTUP_DELAY
name: env
- name: SHUFFLE_PASS_APP_PROXY
valueFrom:
configMapKeyRef:
key: SHUFFLE_PASS_APP_PROXY
name: env
- name: SHUFFLE_PASS_WORKER_PROXY
valueFrom:
configMapKeyRef:
key: SHUFFLE_PASS_WORKER_PROXY
name: env
- name: SHUFFLE_RERUN_SCHEDULE
valueFrom:
configMapKeyRef:
key: SHUFFLE_RERUN_SCHEDULE
name: env
- name: SSO_REDIRECT_URL
valueFrom:
configMapKeyRef:
key: SSO_REDIRECT_URL
name: env
- name: TZ
valueFrom:
configMapKeyRef:
key: TZ
name: env
- name: IS_KUBERNETES
valueFrom:
configMapKeyRef:
key: IS_KUBERNETES
name: env
- name: REGISTRY_URL
valueFrom:
configMapKeyRef:
key: REGISTRY_URL
name: env
- name: REGISTRY_AUTH
valueFrom:
configMapKeyRef:
key: REGISTRY_AUTH
name: env
image: ghcr.io/shuffle/shuffle-backend:latest
imagePullPolicy: Always
name: shuffle-backend
ports:
- containerPort: 5001
resources: {}
volumeMounts:
- name: shuffle-apps
mountPath: /app/generated
- name: shuffle-files
mountPath: /shuffle-files
restartPolicy: Always
status: {}
---
apiVersion: v1
kind: Service
metadata:
namespace: shuffle
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.service: backend
name: shuffle-backend
spec:
ports:
- name: "5001"
port: 5001
targetPort: 5001
selector:
io.kompose.service: backend
status:
loadBalancer: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: shuffle
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.service: frontend
name: frontend
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: frontend
strategy: {}
template:
metadata:
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.network/shuffle: "true"
io.kompose.service: frontend
spec:
containers:
- name: shuffle-frontend
image: ghcr.io/shuffle/shuffle-frontend:latest
env:
- name: BACKEND_HOSTNAME
valueFrom:
configMapKeyRef:
key: BACKEND_HOSTNAME
name: env
ports:
- containerPort: 80
- containerPort: 443
resources: {}
hostname: shuffle-frontend
restartPolicy: Always
status: {}
---
apiVersion: v1
kind: Service
metadata:
namespace: shuffle
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.service: frontend
name: frontend
spec:
type: NodePort
ports:
- name: "80"
port: 80
targetPort: 80
nodePort: 30007
- name: "443"
port: 443
targetPort: 443
nodePort: 30008
selector:
io.kompose.service: frontend
# status:
# loadBalancer: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: shuffle
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.service: orborus
name: orborus
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: orborus
strategy: {}
template:
metadata:
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.network/shuffle: "true"
io.kompose.service: orborus
spec:
containers:
- env:
- name: BASE_URL
value: "http://shuffle-backend:5001"
- name: DOCKER_API_VERSION
value: "1.40"
- name: ENVIRONMENT_NAME
value: Shuffle
- name: ORG_ID
value: Shuffle
- name: SHUFFLE_APP_SDK_VERSION
value: latest
- name: SHUFFLE_SCALE_REPLICAS
value: "5"
- name: SHUFFLE_SWARM_CONFIG
value: run
- name: SHUFFLE_WORKER_VERSION
value: latest
- name: IS_KUBERNETES
valueFrom:
configMapKeyRef:
key: IS_KUBERNETES
name: env
- name: KUBERNETES_NAMESPACE
valueFrom:
configMapKeyRef:
key: KUBERNETES_NAMESPACE
name: env
- name: REGISTRY_URL
valueFrom:
configMapKeyRef:
key: REGISTRY_URL
name: env
- name: SHUFFLE_KUBERNETES_WORKER
valueFrom:
configMapKeyRef:
key: SHUFFLE_KUBERNETES_WORKER
name: env
- name: SHUFFLE_MEMCACHED
valueFrom:
configMapKeyRef:
key: SHUFFLE_MEMCACHED
name: env
image: ghcr.io/shuffle/shuffle-orborus:latest
#imagePullPolicy: Never
name: shuffle-orborus
resources: {}
hostname: shuffle-orborus
restartPolicy: Always
status: {}
@@ -2,13 +2,13 @@ apiVersion: v2
name: shuffle
description: A Helm chart for deploying Shuffle on Kubernetes
type: application
version: 0.0.0 # Set during publishing in GitHub actions
version: 2.1.0 # Set during publishing in GitHub actions
appVersion: latest # Overwritten during publishing in GitHub actions
dependencies:
- name: common
version: ^2.23.0
repository: oci://registry-1.docker.io/bitnamicharts
- name: opensearch
version: ^1.3.0
repository: oci://registry-1.docker.io/bitnamicharts
version: 2.0.10
repository: https://charts.bitnami.com/bitnami
condition: opensearch.enabled
@@ -74,7 +74,7 @@ diagnosticMode:
shuffle:
## @param shuffle.baseUrl The external base URL under which Shuffle is reachable.
##
baseUrl: ""
#baseUrl: ""
## ref: https://shuffler.io/docs/organizations
## This chart only supports single-tenant deployments at the moment
@@ -525,6 +525,8 @@ backend:
## @param backend.openSearch.username The username that is used for authenticating with OpenSearch
##
username: admin
password: StrongShufflePassword321!
## @param backend.openSearch.certificateFile The path to a custom OpenSearch certificate file
##
certificateFile: ""
@@ -885,6 +887,16 @@ frontend:
## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
##
labels: {}
type: NodePort
ports:
- name: http
port: 80
targetPort: 3001
nodePort: 30080
- name: https
port: 443
targetPort: 3443
nodePort: 30443
## ServiceAccount configuration
##
@@ -1187,7 +1199,17 @@ orborus:
## - name: FOO
## value: "bar"
##
extraEnvVars: []
extraEnvVars:
- name: SHUFFLE_APP_SDK_TIMEOUT
value: "300"
- name: SHUFFLE_ORBORUS_EXCUTION_CONCURRENCY
value: "7"
- name: SHUFFLE_STATS_DISABLED
value: "true"
- name: KUBERNETES_NAMESPACE
value: "shuffle"
- name: SHUFFLE_BASE_IMAGE_NAME
value: "frikky/shuffle"
## @param orborus.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for orborus containers
##
extraEnvVarsCM: ""
@@ -1832,7 +1854,7 @@ volumePermissions:
##
image:
registry: docker.io
repository: bitnami/os-shell
repository: bitnamilegacy/os-shell
tag: 12-debian-12-r30
pullPolicy: IfNotPresent
## Optionally specify an array of imagePullSecrets.
@@ -1888,16 +1910,25 @@ volumePermissions:
##
opensearch:
enabled: true
sysctlImage:
enabled: false
image:
registry: docker.io
repository: bitnamilegacy/opensearch
tag: "3.2.0"
master:
replicaCount: 1
data:
replicaCount: 1
coordinating:
replicaCount: 1
replicaCount: 0
ingest:
replicaCount: 1
replicaCount: 0
dashboards:
enabled: true
enabled: false
## @section Vault Parameters
##
-39
View File
@@ -1,39 +0,0 @@
#!/bin/bash
# Check if ifconfig is present and use it to get the default IP
if command -v ifconfig &> /dev/null; then
default_ip=$(ifconfig | grep 'inet ' | grep -v 127.0.0.1 | awk '{print $2}')
# Check if ip is present and use it if ifconfig is not available
elif command -v ip &> /dev/null; then
default_ip=$(ip addr show | grep -oP 'inet \K[\d.]+' | sed -n '2p')
# If both tools are not available, error out
else
echo "Error: Neither ifconfig nor ip command found in the machine. Exiting.."
exit 1
fi
read -p "Enter your node IP to use for cert generation (default is $default_ip): " custom_ip
# Use localhost as the default value
node_ip=${custom_ip:-$default_ip}
echo "Using node IP: $node_ip to generate SSL certs!"
mkdir -p certs
# Generate CA key
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/reg.key -x509 -days 365 -out certs/reg.crt -subj "/CN=$node_ip"
# generate a random string
random_string=$(openssl rand -hex 3)
echo "Starting docker registry with name shuffle-local-registry-$random_string.."
docker run -d -p 5000:5000 --restart=always --name "shuffle-local-registry-$random_string" \
-v $(pwd)/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/reg.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/reg.key \
registry:2
echo "Set up certs and launched docker registry successfully!"
echo "Please put $node_ip:5000 as the REGISTRY_URL in all-in-one.yaml file"
-80
View File
@@ -1,80 +0,0 @@
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-manager
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "create", "update", "delete"]
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["create", "get", "list", "watch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-manager-binding
namespace: default
subjects:
- kind: ServiceAccount
name: default
namespace: default
roleRef:
kind: Role
name: pod-manager
apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.service: orborus
name: orborus
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: orborus
strategy: {}
template:
metadata:
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.network/shuffle: "true"
io.kompose.service: orborus
spec:
containers:
- env:
- name: BASE_URL
value: "https://shuffler.io"
- name: SHUFFLE_SCALE_REPLICAS
value: "7"
- name: IS_KUBERNETES
value: "true"
- name: ENVIRONMENT_NAME
value: "environment test"
- name: ORG
value: "9c938e5b-d812-40d9-92f0-93783f43ec0d"
- name: AUTH
value: "3663a270-bb3a-4678-a365-d879601a1a0c"
image: ghcr.io/shuffle/shuffle-orborus:latest
#imagePullPolicy: Never
name: shuffle-orborus
resources: {}
hostname: shuffle-orborus
restartPolicy: Always
-36
View File
@@ -1,36 +0,0 @@
#!/bin/bash
# Check if ifconfig is present and use it to get the default IP
if command -v ifconfig &> /dev/null; then
default_ip=$(ifconfig | grep 'inet ' | grep -v 127.0.0.1 | awk '{print $2}')
# Check if ip is present and use it if ifconfig is not available
elif command -v ip &> /dev/null; then
default_ip=$(ip addr show | grep -oP 'inet \K[\d.]+' | sed -n '2p')
# If both tools are not available, error out
else
echo "Error: Neither ifconfig nor ip command found in the machine. Exiting.."
exit 1
fi
read -p "Enter your node IP to use for cert generation (default is $default_ip): " custom_ip
# Use localhost as the default value
node_ip=${custom_ip:-$default_ip}
echo "Using node IP: $node_ip to generate SSL certs!"
mkdir -p certs
# Generate CA key
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/reg.key -x509 -days 365 -out certs/reg.crt -subj "/CN=$node_ip"
echo "Generated certs/reg.key and certs/reg.crt!"
echo -e "Please run:\n"
echo "docker run -d -p 5000:5000 --restart=always --name "shuffle-local-registry" \
-v $(pwd)/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/reg.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/reg.key \
registry:2"
echo -e "\nnow to start the reigstry :)!"
+1 -1
View File
@@ -1586,7 +1586,7 @@ func initializeImages() {
if len(os.Getenv("REGISTRY_URL")) > 0 {
baseimageregistry = os.Getenv("REGISTRY_URL")
} else {
os.Setenv("REGISTRY_URL", baseimageregistry)
// os.Setenv("REGISTRY_URL", baseimageregistry)
}
os.Setenv("SHUFFLE_BASE_IMAGE_REGISTRY", baseimageregistry)
+1 -1
View File
@@ -3893,7 +3893,7 @@ func sendAppRequest(ctx context.Context, incomingUrl, appName string, port int,
if attempts < 2 {
// Check the service and fix it.
if isKubernetes == "true" {
log.Printf("[WARNING] App Redeployment in K8s isn't fully supported yet, but should be done for app %s with image %s.", appName, image)
log.Printf("[WARNING] App Redeployment in K8s isn't fully supported yet, but should be done for app %s with image %s.", appName, image)
} else {
_, err = findAppInfo(image, appName, true)
if err != nil {