GDC 에어 갭 적용에서 개방형 가중치 모델을 위한 Open WebUI 사용자 가이드

이 문서에서는 Google Distributed Cloud (GDC) 에어 갭 환경에 자체 호스팅 브라우저 기반 채팅 인터페이스인 Open WebUI를 배포하는 단계별 안내를 제공합니다. Open WebUI는 Ollama 및 OpenAI 호환 API를 통해 Ollama 및 vLLM 사용자 가이드와 함께 배포된 추론 백엔드에 연결되므로 개발자와 최종 사용자는 API 호출을 작성하지 않고도 개방형 가중치 모델과 상호작용할 수 있습니다.

아키텍처

Open WebUI는 표준 클러스터의 자체 네임스페이스에서 단일 복제본 Deployment로 실행됩니다. 상태 (사용자 계정, 채팅, 설정)는 ReadWriteOnce PersistentVolumeClaim에 저장됩니다. ConfigMap는 클러스터 내 Service 이름을 통해 연결되는 추론 백엔드의 연결 설정을 보유하고 Secret는 세션 서명 키를 보유합니다. LoadBalancer 유형의 Kubernetes Service는 웹 인터페이스를 노출하고 NetworkPolicy/ProjectNetworkPolicy 객체는 이에 대한 액세스를 보호합니다.

시작하기 전에

Ollama를 사용한 Gemma 모델 사용자 가이드, vLLM을 사용한 Gemma 모델 사용자 가이드 또는 vLLM을 사용한 Mistral 모델 사용자 가이드를 사용하여 추론 백엔드가 하나 이상 배포되었는지, 워크스테이션에서 해당 참조 구현의 ${HOME}/gdcag-solutions 디렉터리에 액세스할 수 있는지 확인합니다.

Identity and Access Management

필요한 IAM 계정, 역할, 권한이 올바르게 구성되었는지 확인합니다.

조직의 GDC 사용자 역할:

  • 선택사항: 표준 클러스터 관리자 (콘솔에서 클러스터 보기)

프로젝트의 GDC 사용자 역할:

  • 표준 클러스터 관리자 (standard-cluster-admin)

표준 클러스터의 GDC 사용자 역할:

  • StandardClusterRole cluster-admin에 대한 StandardClusterRoleBinding(프로젝트 IAM 관리자가 생성, 참조 구현의 Identity and Access Management 섹션 참고)

워크스테이션

달리 명시되지 않는 한 이 가이드의 모든 명령어는 필요한 도구와 환경 및 인터넷에 대한 연결이 있는 워크스테이션에서 실행합니다.

  1. 사용자 가이드 디렉터리 구조를 만듭니다.

    mkdir -p ${HOME}/gdcag-solutions/open-weight-models/open-webui/env.d
    mkdir -p ${HOME}/gdcag-solutions/open-weight-models/open-webui/secrets
    
    chmod u=rwx,go= ${HOME}/gdcag-solutions/open-weight-models/open-webui/secrets
    
  2. 세션 서명 키를 만듭니다.

    openssl rand -hex 32 > ${HOME}/gdcag-solutions/open-weight-models/open-webui/secrets/open_webui_secret_key
    
    chmod u=rw,go= ${HOME}/gdcag-solutions/open-weight-models/open-webui/secrets/open_webui_secret_key
    
  3. 사용자 가이드 환경 구성 파일을 만듭니다.

    cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/open-webui/env.d/open-webui.sh && echo "Successfully created." || echo "Failed to create!"
    # Open WebUI
    export GDCS_OPEN_WEBUI_IMAGE_TAG="v0.11.3"
    export GDCS_OPEN_WEBUI_NAME="open-webui"
    export GDCS_OPEN_WEBUI_PVC_SIZE="20Gi"
    export GDCS_OPEN_WEBUI_SECRET_KEY="$(cat ${GDCS_USER_GUIDE_HOME}/secrets/open_webui_secret_key)"
    
    # Inference backends (in-cluster Service addresses, several backends separated by ';').
    # The user guides name the Service after the model: Ollama uses GDCS_OLLAMA_MODEL_KUBERNETES
    # (gemma4:e4b -> gemma4-e4b) and vLLM uses GDCS_HF_MODEL_KUBERNETES (such as vllm-gemma or vllm-mistral)
    # (mistralai/Mistral-7B-Instruct-v0.2 -> mistralai-mistral-7b-instruct-v0-2); kubectl get service
    # in the workload namespace (ollama-gemma, vllm-gemma or vllm-mistral) lists them.
    export GDCS_OPEN_WEBUI_ENABLE_OLLAMA_API="OPEN_WEBUI_ENABLE_OLLAMA_API"
    export GDCS_OPEN_WEBUI_OLLAMA_BASE_URLS="OPEN_WEBUI_OLLAMA_BASE_URLS"
    export GDCS_OPEN_WEBUI_ENABLE_OPENAI_API="OPEN_WEBUI_ENABLE_OPENAI_API"
    export GDCS_OPEN_WEBUI_OPENAI_API_BASE_URLS="OPEN_WEBUI_OPENAI_API_BASE_URLS"
    export GDCS_OPEN_WEBUI_OPENAI_API_KEYS="none"         # vLLM does not check API keys unless started with --api-key
    
    # Workload
    export GDCS_WORKLOAD_NAMESPACE="open-webui"
    
    # CPU resources
    export GDCS_WORKLOAD_CPU_LIMIT="2"
    export GDCS_WORKLOAD_CPU_REQUEST="1"
    
    # Memory resources
    export GDCS_WORKLOAD_MEMORY_LIMIT="4Gi"
    export GDCS_WORKLOAD_MEMORY_REQUEST="2Gi"
    
    EOF
    

    다음을 바꿉니다.

    • OPEN_WEBUI_ENABLE_OLLAMA_API: Ollama 백엔드를 배포한 경우 true, 그렇지 않으면 false입니다.
    • OPEN_WEBUI_OLLAMA_BASE_URLS: Ollama 서비스의 클러스터 내 URL이며 ;로 구분됩니다(예: http://gemma4-e4b.ollama-gemma.svc.cluster.local). Ollama 백엔드를 배포하지 않은 경우 비워 둡니다.
    • OPEN_WEBUI_ENABLE_OPENAI_API: vLLM 백엔드를 배포한 경우 true, 그렇지 않으면 false입니다.
    • OPEN_WEBUI_OPENAI_API_BASE_URLS: /v1 경로가 있는 vLLM 서비스의 클러스터 내 URL이며 ;로 구분됩니다(예: http://mistralai-mistral-7b-instruct-v0-2.vllm-mistral.svc.cluster.local/v1 또는 http://google-gemma-4-e2b-it.vllm-gemma.svc.cluster.local/v1). vLLM 백엔드를 배포하지 않은 경우 비워 둡니다.
  4. 사용자 가이드 환경 로더 파일을 만듭니다.

    cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/open-webui/env.sh && echo "Successfully created." || echo "Failed to create!"
    source "${HOME}/gdcag-solutions/open-weight-models/IMPLEMENTATION/env.sh"
    
    export GDCS_USER_GUIDE_HOME="${HOME}/gdcag-solutions/open-weight-models/open-webui"
    echo "GDCS_USER_GUIDE_HOME=${GDCS_USER_GUIDE_HOME}"
    
    # Sourced in dependency order
    source "${GDCS_USER_GUIDE_HOME}/env.d/open-webui.sh"
    EOF
    

    다음을 바꿉니다.

    • IMPLEMENTATION: 이 워크스테이션에서 완료한 참조 구현인 ollama 또는 vllm입니다.
  5. 원하는 편집기로 환경 파일을 수정하고 검토합니다.

    ${EDITOR:-vi} ${HOME}/gdcag-solutions/open-weight-models/open-webui/env.d/open-webui.sh
    
  6. 환경 파일을 소싱합니다.

    source ${HOME}/gdcag-solutions/open-weight-models/open-webui/env.sh
    

    출력은 다음과 비슷합니다.

    GDCS_ROOT_HOME=HOME_DIRECTORY_PATH/gdcag-solutions
    GDCS_IMPLEMENTATION_HOME=HOME_DIRECTORY_PATH/gdcag-solutions/open-weight-models/IMPLEMENTATION
    GDCS_USER_GUIDE_HOME=HOME_DIRECTORY_PATH/gdcag-solutions/open-weight-models/open-webui
    

클러스터

  1. gdcloud을 구성합니다.

    gdcloud config set core/account "default-user"
    gdcloud config set core/organization_console_url "${GDC_ZONAL_CONSOLE_URL}"
    gdcloud config set core/project "${GDC_PROJECT}"
    gdcloud config set core/zone "${GDC_ZONE}"
    
  2. GDC 환경에 인증합니다.

    gdcloud auth login
    
  3. 클러스터 사용자 인증 정보를 검색합니다.

    gdcloud clusters get-credentials "${GDC_STANDARD_CLUSTER_NAME}" \
    --project="${GDC_PROJECT}" \
    --standard \
    --zone="${GDC_ZONE}"
    
  4. 환경 파일에서 참조되는 추론 백엔드 Service가 있는지 확인합니다.

    for url in $(echo "${GDCS_OPEN_WEBUI_OLLAMA_BASE_URLS};${GDCS_OPEN_WEBUI_OPENAI_API_BASE_URLS}" | tr ';' ' '); do
      host=$(echo "${url}" | sed -E 's#https?://([^/:]+).*#\1#')
      kubectl get service "${host%%.*}" --namespace="$(echo "${host}" | cut -d. -f2)" --output=wide
    done
    

구현

아티팩트 마이그레이션

  1. 솔루션에 필요한 컨테이너 이미지 목록을 정의합니다.

    declare -a GDCS_REGISTRY_IMAGES=(
      "ghcr.io/open-webui/open-webui:${GDCS_OPEN_WEBUI_IMAGE_TAG}"
    )
    export SERIALIZED_IMAGES=$(declare -p GDCS_REGISTRY_IMAGES)
    
  2. 참조 구현 스크립트를 사용하여 필요한 컨테이너 이미지를 Artifact Registry에 시드합니다.

    ${GDCS_IMPLEMENTATION_HOME}/seed_registry.sh
    

네임스페이스

  1. 네임스페이스를 만드세요.

    kubectl create namespace "${GDCS_WORKLOAD_NAMESPACE}"
    
  2. imagePullSecret를 추가합니다.

    kubectl create secret docker-registry "${GDCS_HARBOR_K8S_PULL_SECRET}" \
    --dry-run=client \
    --from-file=.dockerconfigjson=${GDCS_HARBOR_K8S_DOCKER_CONFIG}/config.json \
    --namespace="${GDCS_WORKLOAD_NAMESPACE}" \
    --output=yaml | kubectl apply -f -
    
  3. 세션 서명 키를 사용하여 Secret를 만듭니다.

    kubectl create secret generic "${GDCS_OPEN_WEBUI_NAME}" \
    --dry-run=client \
    --from-literal=WEBUI_SECRET_KEY="${GDCS_OPEN_WEBUI_SECRET_KEY}" \
    --namespace="${GDCS_WORKLOAD_NAMESPACE}" \
    --output=yaml | kubectl apply -f -
    

스토리지

  1. Open WebUI 데이터의 PersistentVolumeClaim에 대한 매니페스트를 만듭니다.

    cat <<EOF > "${GDCS_USER_GUIDE_HOME}/${GDCS_OPEN_WEBUI_NAME}-rwo-pvc.yaml" && echo "Successfully created." || echo "Failed to create!"
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ${GDCS_OPEN_WEBUI_NAME}-rwo
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: ${GDCS_OPEN_WEBUI_PVC_SIZE}
      storageClassName: standard-rwo
      volumeMode: Filesystem
    EOF
    
  2. PersistentVolumeClaim의 매니페스트를 적용합니다.

    kubectl apply \
    --filename="${GDCS_USER_GUIDE_HOME}/${GDCS_OPEN_WEBUI_NAME}-rwo-pvc.yaml" \
    --namespace="${GDCS_WORKLOAD_NAMESPACE}"
    

웹 인터페이스

  1. Open WebUI ConfigMap, Deployment, Service의 매니페스트를 만듭니다. Open WebUI는 오프라인 모드 (OFFLINE_MODE)로 실행되고, 이 ConfigMap를 정보 소스 (ENABLE_PERSISTENT_CONFIG=false)로 유지하며, 인터넷 액세스가 필요한 기능을 사용 중지합니다.

    cat <<EOF > "${GDCS_USER_GUIDE_HOME}/${GDCS_OPEN_WEBUI_NAME}-deployment.yaml" && echo "Successfully created." || echo "Failed to create!"
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ${GDCS_OPEN_WEBUI_NAME}
    data:
      DATA_DIR: "/app/backend/data"
      ENABLE_COMMUNITY_SHARING: "false"
      ENABLE_IMAGE_GENERATION: "false"
      ENABLE_OLLAMA_API: "${GDCS_OPEN_WEBUI_ENABLE_OLLAMA_API}"
      ENABLE_OPENAI_API: "${GDCS_OPEN_WEBUI_ENABLE_OPENAI_API}"
      ENABLE_PERSISTENT_CONFIG: "false"
      ENABLE_SIGNUP: "true"
      ENABLE_VERSION_UPDATE_CHECK: "false"
      ENABLE_WEB_SEARCH: "false"
      OFFLINE_MODE: "true"
      OLLAMA_BASE_URLS: "${GDCS_OPEN_WEBUI_OLLAMA_BASE_URLS}"
      OPENAI_API_BASE_URLS: "${GDCS_OPEN_WEBUI_OPENAI_API_BASE_URLS}"
      OPENAI_API_KEYS: "${GDCS_OPEN_WEBUI_OPENAI_API_KEYS}"
      PORT: "8080"
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: ${GDCS_OPEN_WEBUI_NAME}
      name: ${GDCS_OPEN_WEBUI_NAME}
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ${GDCS_OPEN_WEBUI_NAME}
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: ${GDCS_OPEN_WEBUI_NAME}
        spec:
          containers:
            - envFrom:
                - configMapRef:
                    name: ${GDCS_OPEN_WEBUI_NAME}
                - secretRef:
                    name: ${GDCS_OPEN_WEBUI_NAME}
              image: ${GDCS_HARBOR_PROJECT_URI}/open-webui/open-webui:${GDCS_OPEN_WEBUI_IMAGE_TAG}
              imagePullPolicy: IfNotPresent
              livenessProbe:
                failureThreshold: 3
                httpGet:
                  path: /health
                  port: 8080
                periodSeconds: 30
                timeoutSeconds: 10
              name: open-webui
              ports:
                - containerPort: 8080
                  name: http
              readinessProbe:
                failureThreshold: 3
                httpGet:
                  path: /health
                  port: 8080
                periodSeconds: 10
                successThreshold: 1
                timeoutSeconds: 5
              resources:
                limits:
                  cpu: "${GDCS_WORKLOAD_CPU_LIMIT}"
                  memory: "${GDCS_WORKLOAD_MEMORY_LIMIT}"
                requests:
                  cpu: "${GDCS_WORKLOAD_CPU_REQUEST}"
                  memory: "${GDCS_WORKLOAD_MEMORY_REQUEST}"
              securityContext:
                allowPrivilegeEscalation: false
              startupProbe:
                failureThreshold: 60
                httpGet:
                  path: /health
                  port: 8080
                periodSeconds: 10
                timeoutSeconds: 5
              volumeMounts:
                - mountPath: /app/backend/data
                  name: data
          imagePullSecrets:
            - name: ${GDCS_HARBOR_K8S_PULL_SECRET}
          volumes:
            - name: data
              persistentVolumeClaim:
                claimName: ${GDCS_OPEN_WEBUI_NAME}-rwo
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: ${GDCS_OPEN_WEBUI_NAME}
    spec:
      ports:
        - name: http
          port: 80
          protocol: TCP
          targetPort: 8080
      selector:
        app: ${GDCS_OPEN_WEBUI_NAME}
      type: LoadBalancer
    EOF
    
  2. Open WebUI ConfigMap, Deployment, Service의 매니페스트를 적용합니다.

    kubectl apply \
    --filename="${GDCS_USER_GUIDE_HOME}/${GDCS_OPEN_WEBUI_NAME}-deployment.yaml" \
    --namespace="${GDCS_WORKLOAD_NAMESPACE}"
    
  3. Open WebUI NetworkPolicy의 매니페스트를 만듭니다.

    cat <<EOF > "${GDCS_USER_GUIDE_HOME}/${GDCS_OPEN_WEBUI_NAME}-netpol.yaml" && echo "Successfully created." || echo "Failed to create!"
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-${GDCS_OPEN_WEBUI_NAME}-ingress
      namespace: ${GDCS_WORKLOAD_NAMESPACE}
    spec:
      ingress:
        - from:
            - ipBlock:
                cidr: 0.0.0.0/0
            - namespaceSelector: {}
          ports:
            - port: 8080
              protocol: TCP
      podSelector: {}
      policyTypes:
        - Ingress
    EOF
    
  4. Open WebUI NetworkPolicy의 매니페스트를 적용합니다.

    kubectl apply \
    --filename="${GDCS_USER_GUIDE_HOME}/${GDCS_OPEN_WEBUI_NAME}-netpol.yaml"
    
  1. Pod이 실행될 때까지 기다립니다.

    watch --color --interval 5 --no-title \
    "kubectl get pods --selector=app=${GDCS_OPEN_WEBUI_NAME} \
    --namespace=${GDCS_WORKLOAD_NAMESPACE} | GREP_COLORS='mt=01;92' grep -E --color=always -e '^' -e 'Running'"
    
  2. Deployment이 준비될 때까지 기다립니다.

    watch --color --interval 5 --no-title \
    "kubectl get deployment/${GDCS_OPEN_WEBUI_NAME} \
    --namespace=${GDCS_WORKLOAD_NAMESPACE} | GREP_COLORS='mt=01;92' grep -E --color=always -e '^' -e '1/1     1            1'"
    
  3. 선택사항: 컨테이너 로그를 스트리밍하여 시작 진행 상황을 모니터링합니다.

    kubectl logs deployment/${GDCS_OPEN_WEBUI_NAME} \
    --follow \
    --namespace="${GDCS_WORKLOAD_NAMESPACE}"
    

유효성 검사

  1. Open WebUI의 LoadBalancer IP 주소를 가져옵니다.

    export OPEN_WEBUI_LB_IP=$(kubectl get service/${GDCS_OPEN_WEBUI_NAME} --namespace="${GDCS_WORKLOAD_NAMESPACE}" --output=jsonpath='{.status.loadBalancer.ingress[*].ip}')
    echo "OPEN_WEBUI_LB_IP=${OPEN_WEBUI_LB_IP}"
    
  2. 부하 분산기를 사용하여 상태 및 버전 엔드포인트를 확인합니다.

    curl --show-error --silent http://${OPEN_WEBUI_LB_IP}/health && echo
    
    curl --show-error --silent http://${OPEN_WEBUI_LB_IP}/api/version && echo
    

    출력은 다음과 비슷합니다.

    {"status":true}
    {"version":"0.11.3"}
    
  3. 포트 전달을 사용하여 상태 및 버전 엔드포인트를 확인합니다.

    kubectl port-forward service/${GDCS_OPEN_WEBUI_NAME} \
    --namespace="${GDCS_WORKLOAD_NAMESPACE}" 8080:80 &
    PF_PID=$!
    
    sleep 2
    
    curl --show-error --silent http://127.0.0.1:8080/health && echo
    curl --show-error --silent http://127.0.0.1:8080/api/version && echo
    
    kill ${PF_PID}
    
  4. Open WebUI가 추론 백엔드에 연결할 수 있는지 확인합니다.

    kubectl exec deployment/${GDCS_OPEN_WEBUI_NAME} \
    --namespace="${GDCS_WORKLOAD_NAMESPACE}" \
    -- sh -c 'for url in $(echo "${OLLAMA_BASE_URLS};${OPENAI_API_BASE_URLS}" | tr ";" " "); do case "${url}" in *"/v1") echo "${url}/models"; curl --max-time 10 --show-error --silent "${url}/models" | head -c 300; echo;; *) echo "${url}/api/tags"; curl --max-time 10 --show-error --silent "${url}/api/tags" | head -c 300; echo;; esac; done'
    
  5. 브라우저에서 http://${OPEN_WEBUI_LB_IP}를 열고 첫 번째 계정을 만듭니다. 생성된 첫 번째 계정이 관리자가 됩니다. 채팅 뷰에서 모델을 선택하고 프롬프트를 전송합니다.

작업

추론 백엔드 추가 또는 변경

  1. env.d/open-webui.sh에서 GDCS_OPEN_WEBUI_OLLAMA_BASE_URLS 또는 GDCS_OPEN_WEBUI_OPENAI_API_BASE_URLS를 업데이트하고 환경 파일을 소싱한 후 웹 인터페이스에서 매니페스트 단계를 다시 실행합니다. 그런 다음 매니페스트를 적용하고 Open WebUI를 다시 시작합니다. 영구 구성이 사용 중지되어 있으므로 시작할 때마다 ConfigMap를 읽습니다.

    kubectl apply \
    --filename="${GDCS_USER_GUIDE_HOME}/${GDCS_OPEN_WEBUI_NAME}-deployment.yaml" \
    --namespace="${GDCS_WORKLOAD_NAMESPACE}"
    
    kubectl rollout restart deployment/${GDCS_OPEN_WEBUI_NAME} \
    --namespace="${GDCS_WORKLOAD_NAMESPACE}"
    

업그레이드

  1. 환경 파일에서 새 GDCS_OPEN_WEBUI_IMAGE_TAG를 설정하고, 소싱하고, 새 이미지를 시드하고, Deployment를 롤링합니다.

    source ${HOME}/gdcag-solutions/open-weight-models/open-webui/env.sh
    
    declare -a GDCS_REGISTRY_IMAGES=(
      "ghcr.io/open-webui/open-webui:${GDCS_OPEN_WEBUI_IMAGE_TAG}"
    )
    export SERIALIZED_IMAGES=$(declare -p GDCS_REGISTRY_IMAGES)
    ${GDCS_IMPLEMENTATION_HOME}/seed_registry.sh
    
    kubectl set image deployment/${GDCS_OPEN_WEBUI_NAME} \
    open-webui="${GDCS_HARBOR_PROJECT_URI}/open-webui/open-webui:${GDCS_OPEN_WEBUI_IMAGE_TAG}" \
    --namespace="${GDCS_WORKLOAD_NAMESPACE}"
    

백업

  1. 데이터 볼륨의 VolumeSnapshot를 만듭니다 (standard VolumeSnapshotClass는 GDC 표준 클러스터에서 사용 가능).

    cat <<EOF | kubectl apply --namespace="${GDCS_WORKLOAD_NAMESPACE}" -f -
    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: ${GDCS_OPEN_WEBUI_NAME}-$(date +%Y%m%d-%H%M)
    spec:
      source:
        persistentVolumeClaimName: ${GDCS_OPEN_WEBUI_NAME}-rwo
      volumeSnapshotClassName: standard
    EOF
    

문제 해결

증상 가능한 원인 작업
채팅 뷰에 모델이 제공되지 않음 백엔드 Service 주소가 잘못되었거나, 백엔드가 준비되지 않았거나, 백엔드 NetworkPolicy에서 Open WebUI 네임스페이스를 허용하지 않습니다. 검증에서 백엔드 확인 단계를 실행합니다. 백엔드 Deployment 및 NetworkPolicy를 확인합니다.
시작 중 Pod번 다시 시작됨 PersistentVolume의 느린 첫 시작 kubectl describe pod를 확인합니다. startupProbe는 10분을 허용합니다.
문서 업로드 (RAG) 실패 오프라인 모드에서 기본 임베딩 모델 다운로드 차단 Ollama에서 제공하는 임베딩 모델로 RAG_EMBEDDING_ENGINE=ollama를 구성하거나 RAG를 사용 중지 상태로 유지하세요.
LoadBalancer IP가 <pending> 상태로 유지되거나 연결할 수 없음 환경에서 부하 분산기를 사용할 수 없거나 ProjectNetworkPolicy이(가) 누락됨 포트 전달 검증 단계를 사용합니다. 프로젝트 NetworkPolicy 관리자에게 ProjectNetworkPolicy을 요청합니다.
Pod 다시 시작 후 세션이 잘못됨 WEBUI_SECRET_KEY이(가) 변경됨 Secret를 안정적으로 유지하고 secrets/open_webui_secret_key에서 복원합니다.

삭제

  1. Open WebUI 리소스를 삭제합니다.

    kubectl delete namespace "${GDCS_WORKLOAD_NAMESPACE}"
    
  2. 로컬 파일을 삭제합니다.

    rm -rf ${HOME}/gdcag-solutions/open-weight-models/open-webui
    

추가 자료