New post

查找

Article
· Apr 21 4m read

Cuándo tener en cuenta useIrisFsGroup en vuestros despliegues con IKO

Si echáis un vistazo al archivo values.yaml del Helm chart de IKO, encontraréis:

useIrisFsGroup: false 

Vamos a desglosar qué es useIrisFsGroup y en qué situaciones puede ser útil activarlo.

FsGroup se refiere al file system group (grupo del sistema de archivos).

Por defecto, los volúmenes en Kubernetes son propiedad del usuario root, pero necesitamos que IRIS sea propietario de sus propios archivos (IRIS en contenedores se instala bajo el usuario irisowner). Para solucionar esto, utilizamos uno de estos dos métodos:

1) initContainers

Los initContainers se ejecutan antes que los contenedores de la aplicación (como IRIS) en un pod. Generalmente preparan el entorno para la aplicación y luego terminan. El initContainer se ejecuta como root antes que IRIS y ejecuta:

chown irisowner:irisowner /irissys/*

El SecurityContext está, por defecto, configurado como:

RunAsUser: 51773
RunAsGroup: 51773
RunAsNonRoot: true

para el pod. Y vemos que 51773 es el ID de usuario y grupo para irisowner:

$ id
uid=51773(irisowner) gid=51773(irisowner) groups=51773(irisowner)

2) Montar volúmenes con una propiedad de grupo específica

Algunos entornos pueden restringir que los contenedores se ejecuten como root, por ejemplo, mediante las Security Context Constraints en OpenShift. En este caso, ni siquiera podemos ejecutar un initContainer como root y necesitaremos que los volúmenes tengan la propiedad del sistema de archivos correcta en el momento de su montaje. Para hacerlo, desplegad el InterSystems Kubernetes Operator con:

useIrisFsGroup: true 

en el archivo /chart/iris-operator/values.yaml.

Ahora, vuestros pods se desplegarán sin initContainers.

Una advertencia: si deseáis configurar sidecars, se requiere un paso adicional. No podréis utilizar el sidecar habitual de Apache/NGINX. Encontraréis este problema:

>> kubectl get pods
NAME                                              READY   STATUS    RESTARTS      AGE
intersystems-iris-operator-amd-76b75f6b48-7lnw2   1/1     Running   0             43m
iris-data-0-0                                     1/2     Error     2 (22s ago)   2m

lo que resultará en un CrashLoopBackOff. Un análisis más profundo nos muestra que cuando el sidecar habitual de Apache/NGINX está presente, el parámetro useIrisFsGroup no se tiene en cuenta. Esto se debe a que estos contenedores de Apache/NGINX, en este caso el sidecar, se ejecutan como root. IRIS no se ejecuta como root y no puede acceder a sus directorios, lo que causa nuestro problema.

irisowner@iris-data-0-0:/irissys$ ls -l
total 16
drwxrwxrwx 3 root root  107 Mar 31 14:28 cpf
drwxr-xr-x 3 root root 4096 Mar 31 14:21 data
drwxr-xr-x 3 root root 4096 Mar 31 14:21 journal1
drwxr-xr-x 3 root root 4096 Mar 31 14:21 journal2
drwxrwxrwt 3 root root  100 Mar 31 14:28 key
drwxr-xr-x 3 root root 4096 Mar 31 14:21 wij

IRIS falla con el error:

[ERROR] Command "iris start IRIS quietly" exited with status 256
03/31/25-14:41:06:870 (795) 3 [Utility.Event] Error while moving data directories ERROR #5001: Cannot create target: /irissys/data/IRIS/

En su lugar, deberíamos utilizar la imagen non-root del web gateway  (ya que suponemos que queremos que todas nuestras imágenes se ejecuten como no root). Esto implicaría un web gateway restringido o locked-down. También debemos asegurarnos de agregar el security context para hacer cumplir esta condición. Necesitamos declarar explícitamente:

securityContext:
  runAsUser: 51773
  runAsGroup: 51773
  runAsNonRoot: true
  fsGroup: 51773

en vuestros nodos de datos/cómputo.

Un ejemplo de YAML para nuestro IrisCluster CRD que integra todo esto se puede ver a continuación.

apiVersion: intersystems.com/v1alpha1
kind: IrisCluster
metadata:
  name: iris
spec:
  licenseKeySecret:
    name: iris-key-secret
  configSource:
    name: iris-cpf
  imagePullSecrets:
    - name: intersystems-pull-secret
  topology:
    data:
      image: containers.intersystems.com/intersystems/irishealth:2025.1
      compatibilityVersion: "2025.1.0"
      mirrored: true
      podTemplate:
        spec:
          resources:
            requests:
              memory: "4Gi"
              cpu: "2"
            limits:
              memory: "4Gi"
              cpu: "2"
          securityContext:
            runAsUser: 51773
            runAsGroup: 51773
            runAsNonRoot: true
            fsGroup: 51773
      webgateway:
        image: containers.intersystems.com/intersystems/webgateway-lockeddown:2025.1
        type: apache-lockeddown
        applicationPaths:
          - /csp/sys
          - /csp/user
          - /csp/broker
          - /api
          - /isc
          - /oauth2
          - /ui
          - /csp/healthshare
        loginSecret:
          name: iris-webgateway-secret
    webgateway:
      replicas: 1
      image: containers.intersystems.com/intersystems/webgateway-lockeddown:2025.1
      type: apache-lockeddown
      podTemplate:
        spec:
          resources:
            requests:
              memory: "2Gi"
              cpu: "1"
            limits:
              memory: "2Gi"
              cpu: "1"
      applicationPaths:
        - /csp/sys
        - /csp/user
        - /csp/broker
        - /api
        - /isc
        - /oauth2
        - /ui
        - /csp/healthshare
      alternativeServers: LoadBalancing
      loginSecret:
        name: iris-webgateway-secret
    arbiter:
      image: containers.intersystems.com/intersystems/arbiter:2025.1
  serviceTemplate:
    spec:
      type: ClusterIP

Feliz YAMLing

Discussion (0)1
Log in or sign up to continue
Digest
· Apr 21

【週間ダイジェスト】 4/14 ~ 4/20 の開発者コミュニティへの投稿

4/14 ~ 4/20Week at a GlanceInterSystems Developer Community
Question
· Apr 20

Global mapping priority

Hi,

If I map all globals with (*) to a database1, then would like to map specific only some globals eg. MYGLOB* to be located in a different database2, which mapping will override the other, so would all globals that starts with MYGLOB*  be placed in database1 or 2?

    

 

Thanks

2 new Comments
Discussion (2)2
Log in or sign up to continue
Discussion
· Apr 20

Load data into LLM

I read the article by @Rodolfo Pscheidt:

https://community.intersystems.com/post/ollama-ai-iris

I forked his app and copied selected files from @Guillaume Rongier iris-rag-demo to make it containerized:

oliverwilms/ollama-ai-iris
 

I ran load_data.py and I got this output:

irisowner@e10968e4da42:/irisdev/app$ python3 load_data.py
Document ID: cbfa2f20-6627-407b-bbad-31722d18ca13
modules.json: 100%|█████████████████████████████████████████████████████████████| 349/349 [00:00<00:00, 778kB/s]
config_sentence_transformers.json: 100%|████████████████████████████████████████| 123/123 [00:00<00:00, 447kB/s]
README.md: 100%|███████████████████████████████████████████████████████████| 15.8k/15.8k [00:00<00:00, 85.9MB/s]
sentence_bert_config.json: 100%|██████████████████████████████████████████████| 54.0/54.0 [00:00<00:00, 343kB/s]
config.json: 100%|█████████████████████████████████████████████████████████████| 687/687 [00:00<00:00, 5.27MB/s]
pytorch_model.bin: 100%|███████████████████████████████████████████████████| 2.27G/2.27G [00:50<00:00, 44.5MB/s]
tokenizer_config.json: 100%|███████████████████████████████████████████████████| 444/444 [00:00<00:00, 1.61MB/s]
sentencepiece.bpe.model: 100%|█████████████████████████████████████████████| 5.07M/5.07M [00:00<00:00, 27.4MB/s]
tokenizer.json: 100%|██████████████████████████████████████████████████████| 17.1M/17.1M [00:00<00:00, 56.6MB/s]
special_tokens_map.json: 100%|█████████████████████████████████████████████████| 964/964 [00:00<00:00, 9.58MB/s]
config.json: 100%|██████████████████████████████████████████████████████████████| 191/191 [00:00<00:00, 677kB/s]
model.safetensors: 100%|███████████████████████████████████████████████████| 2.27G/2.27G [00:36<00:00, 62.3MB/s]
Parsing nodes: 100%|██████████████████████████████████████████████████████████████| 1/1 [00:02<00:00,  2.46s/it]
Generating embeddings: 100%|████████████████████████████████████████████████████| 21/21 [03:11<00:00,  9.12s/it]
Traceback (most recent call last):
  File "/irisdev/app/load_data.py", line 42, in <module>
    index.storage_context.persist("storageExample")
  File "/home/irisowner/.local/lib/python3.12/site-packages/llama_index/core/storage/storage_context.py", line 178, in persist
    self.docstore.persist(persist_path=docstore_path, fs=fs)
  File "/home/irisowner/.local/lib/python3.12/site-packages/llama_index/core/storage/docstore/simple_docstore.py", line 84, in persist
    self._kvstore.persist(persist_path, fs=fs)
  File "/home/irisowner/.local/lib/python3.12/site-packages/llama_index/core/storage/kvstore/simple_kvstore.py", line 87, in persist
    with fs.open(persist_path, "w") as f:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/irisowner/.local/lib/python3.12/site-packages/fsspec/spec.py", line 1298, in open
    self.open(
  File "/home/irisowner/.local/lib/python3.12/site-packages/fsspec/spec.py", line 1310, in open
    f = self._open(
        ^^^^^^^^^^^
  File "/home/irisowner/.local/lib/python3.12/site-packages/fsspec/implementations/local.py", line 201, in _open
    return LocalFileOpener(path, mode, fs=self, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/irisowner/.local/lib/python3.12/site-packages/fsspec/implementations/local.py", line 365, in __init__
    self._open()
  File "/home/irisowner/.local/lib/python3.12/site-packages/fsspec/implementations/local.py", line 370, in _open
    self.f = open(self.path, mode=self.mode)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PermissionError: [Errno 13] Permission denied: '/irisdev/app/storageExample/docstore.json'

 

I think I need to change permissions in the directory where I cloned the repo.

Next I will put my own data into storageExample directory.

Discussion (0)1
Log in or sign up to continue