Referenz der Dienstspezifikation¶
Die Spezifikation der Snowpark Container Services befindet sich in YAML (https://yaml.org/spec/). Sie gibt Snowflake die notwendigen Informationen, um Ihren Dienst zu konfigurieren und auszuführen. Sie geben die Spezifikation zum Zeitpunkt der Erstellung eines Dienstes an.
Die allgemeine Syntax ist wie folgt:
spec:
containers: # container list
- name: <name>
image: <image-name>
command: # optional list of strings
- <cmd>
- <arg1>
args: # optional list of strings
- <arg2>
- <arg3>
- ...
env: # optional
<key>: <value>
<key>: <value>
...
readinessProbe: # optional
port: <TCP port-num>
path: <http-path>
volumeMounts: # optional list
- name: <volume-name>
mountPath: <mount-path>
- name: <volume-name>
...
resources: # optional
requests:
memory: <amount-of-memory>
nvidia.com/gpu: <count>
cpu: <cpu-units>
limits:
memory: <amount-of-memory>
nvidia.com/gpu: <count>
cpu: <cpu-units>
secrets: # optional list
- snowflakeSecret:
objectName: <object-name> # specify this or objectReference
objectReference: <reference-name> # specify this or objectName
directoryPath: <path> # specify this or envVarName
envVarName: <name> # specify this or directoryPath
secretKeyRef: username | password | secret_string # specify only with envVarName
endpoints: # optional endpoint list
- name: <name>
port: <TCP port-num> # specify this or portRange
portRange: <TCP port-num>-<TCP port-num> # specify this or port
public: <true / false>
protocol : < TCP / HTTP / HTTPS >
- name: <name>
...
volumes: # optional volume list
- name: <name>
source: local | @<stagename> | memory | block
size: <bytes-of-storage> # specify if memory or block is the volume source
blockConfig: # optional
initialContents:
fromSnapshot: <snapshot-name>
iops: <number-of-operations>
throughput: <MiB per second>
uid: <UID-value> # optional, only for stage volumes
gid: <GID-value> # optional, only for stage volumes
- name: <name>
source: local | @<stagename> | memory | block
size: <bytes-of-storage> # specify if memory or block is the volume source
...
logExporters:
eventTableConfig:
logLevel: <INFO | ERROR | NONE>
platformMonitor: # optional, platform metrics to log to the event table
metricConfig:
groups:
- <group-1>
- <group-2>
...
serviceRoles: # Optional list of service roles
- name: <service-role-name>
endpoints:
- <endpoint_name1>
- <endpoint_name2>
- ...
- ...
Beachten Sie, dass die Felder spec
und serviceRoles
die obersten Felder der Spezifikation sind.
spec
: Verwenden Sie dieses Feld, um Angaben zur Spezifikation zu machen. Sie enthält diese Felder der obersten Ebene:spec.containers (erforderlich): Eine Auflistung von einem oder mehreren Anwendungscontainern. Ihre containerisierte Anwendung muss mindestens einen Container haben.
spec.endpoints (optional): Eine Liste der Endpunkte, die der Dienst öffentlich bereitstellt. Sie können sich dafür entscheiden, einen Endpunkt öffentlich zu machen, um den Zugriff auf den Dienst über das Netzwerk zu ermöglichen.
spec.volumes (optional): Eine Auflistung von Speichervolumes für die zu verwendenden Container.
spec.logExporters (optional): Dieses Feld verwaltet die Ebene der Container-Protokolle, die in die Ereignistabelle Ihres Kontos exportiert werden.
serviceRoles
: Verwenden Sie dieses Feld, um eine oder mehrere Dienstrollen zu definieren. Die Dienstrolle ist der Mechanismus, mit dem Sie Berechtigungen für Endpunkte verwalten, die der Dienst bereitstellt.
Allgemeine Richtlinien¶
Für die
name
-Felder (Container-, Endpunkt- und Volume-Namen) gelten die folgenden Formatrichtlinien:Kann bis zu 63 Zeichen lang sein.
Kann eine Sequenz von alphanumerischen Kleinbuchstaben oder
-
-Zeichen enthalten.Muss mit einem alphabetischen Zeichen beginnen.
Muss mit einem alphanumerischen Zeichen enden.
Kunden müssen sicherstellen, dass keine personenbezogenen Daten, sensiblen Daten, exportkontrollierten Daten oder andere regulierte Daten als Metadaten in die Spezifikationsdatei eingegeben werden. Weitere Informationen dazu finden Sie unter Metadatenfelder in Snowflake.
In den folgenden Abschnitten werden die einzelnen spec
-Felder der obersten Ebene erläutert.
Feld spec.containers
(erforderlich)¶
Verwenden Sie das Feld spec.containers
, um jeden der OCI Container in Ihrer Anwendung zu beschreiben.
Beachten Sie Folgendes:
Wenn Sie einen Dienst erstellen, führt Snowflake diese Container auf einem Einzelknoten im angegebenen Computepool aus, der dieselbe Netzwerkschnittstelle nutzt.
Sie können mehrere Dienstinstanzen laufen lassen, um die Last der eingehenden Anfragen auszugleichen. Snowflake kann diese Dienstinstanzen auf demselben Knoten oder auf verschiedenen Knoten im angegebenen Serverknoten ausführen. Alle Container für eine bestimmte Instanz laufen immer auf einem Knoten.
Snowpark Container Services erfordert derzeit Images der linux/amd64-Plattform.
In den folgenden Abschnitten werden die Arten von Feldern in Containern erläutert.
Felder containers.name
und containers.image
¶
Für jeden Container sind nur der Name und das Image erforderliche Felder.
name
ist der Names des Images. Dieser Name kann zur Identifizierung eines bestimmten Containers zum Zwecke der Beobachtbarkeit verwendet werden (z. B. Protokolle, Metriken).image
bezieht sich auf den Namen des Images, das Sie in ein Snowflake-Image-Repository Ihres Snowflake-Kontos hochgeladen haben.
Beispiel:
spec:
containers:
- name: echo
image: /tutorial_db/data_schema/tutorial_repository/echo_service:dev
Felder containers.command
und containers.args
¶
Verwenden Sie diese optionalen Felder, um zu steuern, welche ausführbare Datei in Ihrem Container gestartet wird und welche Argumente an die ausführbare Datei übergeben werden. Sie können diese Konfigurationen zum Zeitpunkt der Erstellung des Images konfigurieren, normalerweise in einer Dockerdatei. Mit diesen Feldern zur Dienstspezifikation können Sie diese Vorgaben (und damit die Verhaltensweise des Containers) ändern, ohne Ihr Container-Image neu erstellen zu müssen:
containers.command
übersteuert denENTRYPOINT
vonDockerfile
. Auf diese Weise können Sie eine andere ausführbare Datei in dem Container ausführen.containers.args
übersteuert denCMD
vonDockerfile
. Auf diese Weise können Sie dem Befehl (der ausführbaren Datei) verschiedene Argumente bereitstellen.
Beispiel
Ihre Dockerfile
-Datei enthält den folgenden Code:
ENTRYPOINT ["python3", "main.py"]
CMD ["Bob"]
Diese Dockerfile
-Einträge führen den python3
-Befehl aus und übergeben zwei Argumente: main.py
und Bob
. Sie können diese Werte in der Spezifikationsdatei wie folgt überschreiben:
Um ENTRYPOINT zu überschreiben, fügen Sie das Feld
containers.command
in die Spezifikationsdatei ein:spec: containers: - name: echo image: <image_name> command: - python3.9 - main.py
Um das Argument „Bob“ zu überschreiben, fügen Sie das Feld
containers.args
in die Spezifikationsdatei ein:spec: containers: - name: echo image: <image_name> args: - Alice
Feld containers.env
¶
Verwenden Sie das Feld containers.env
, um Variablen für die Umgebung des Containers zu definieren. Alle Prozesse im Container haben Zugriff auf diese Umgebungsvariablen:
spec:
containers:
- name: <name>
image: <image_name>
env:
ENV_VARIABLE_1: <value1>
ENV_VARIABLE_2: <value2>
…
…
Beispiel
In Tutorial 1 liest der Anwendungscode (echo_service.py
) die Umgebungsvariablen wie gezeigt:
CHARACTER_NAME = os.getenv('CHARACTER_NAME', 'I')
SERVER_PORT = os.getenv('SERVER_PORT', 8080)
Beachten Sie, dass das Beispiel Standardwerte für die Variablen an die Funktion getenv
übergibt. Wenn die Umgebungsvariablen nicht definiert sind, werden diese Standardwerte verwendet.
CHARACTER_NAME
: Wenn der Echo-Dienst eine HTTP POST-Anforderung mit einer Zeichenfolge (z. B. „Hallo“) empfängt, gibt der Dienst „I said Hello“ (Ich sagte Hallo) zurück. Sie können diesen Standardwert in der Spezifikationsdatei überschreiben. Wenn Sie beispielsweise den Wert auf „Bob“ setzen, gibt der Echo-Dienst die Antwort „Bob said Hello“ (Bob sagte Hallo) zurück.SERVER_PORT
: In dieser Standardkonfiguration überwacht der Echo-Dienst Port 8080. Sie können den Standardwert überschreiben und einen anderen Port angeben.
Die folgende Dienstspezifikation setzt diese beiden Werte der Umgebungsvariablen außer Kraft:
spec:
containers:
- name: echo
image: <image_name>
env:
CHARACTER_NAME: Bob
SERVER_PORT: 8085
endpoints:
- name: echo-endpoint
port: 8085
Da Sie die Port-Nummer geändert haben, an der Ihr Dienst lauscht, muss die Spezifikation auch den Endpunkt aktualisieren (endpoints.port field
Wert), wie gezeigt.
Feld containers.readinessProbe
¶
Verwenden Sie das Feld containers.readinessProbe
, um einen Bereitschaftstest in Ihrer Anwendung zu identifizieren. Snowflake ruft diesen Test auf, um festzustellen, ob Ihre Anwendung bereit ist, Anforderungen zu bedienen.
Snowflake stellt eine HTTP-GET-Anforderung an den angegebenen Bereitschaftstest mit dem angegebenen Port und Pfad und wartet darauf, dass Ihr Dienst einen HTTP 200-OK-Status zurückgibt, um sicherzustellen, dass nur funktionstüchtige Container den Datenverkehr bedienen.
Verwenden Sie die folgenden Felder, um die erforderlichen Informationen anzugeben:
port
: Der Netzwerkport, den der Dienst auf Anforderungen des Bereitschaftstests hin überwacht. Dieser Port muss nicht als Endpunkt deklariert sein.path
: Snowflake stellt HTTP-GET-Anforderungen an den Dienst mit diesem Pfad.
Beispiel
In Tutorial 1 implementiert der Anwendungscode (echo_python.py
) den folgenden Bereitschaftstest:
@app.get("/healthcheck")
def readiness_probe():
Dementsprechend enthält die Spezifikationsdatei das Feld containers.readinessProbe
:
spec:
containers:
- name: echo
image: <image_name>
env:
SERVER_PORT: 8088
CHARACTER_NAME: Bob
readinessProbe:
port: 8088
path: /healthcheck
endpoints:
- name: echo-endpoint
port: 8088
Der vom Bereitschaftstest angegebene Port muss kein konfigurierter Endpunkt sein. Ihr Dienst könnte einen anderen Port nur für den Zweck des Bereitschaftstests überwachen.
Feld containers.volumeMounts
¶
Da die Felder spec.volumes
und spec.containers.volumeMounts
zusammenarbeiten, werden sie zusammen in einem Abschnitt erläutert. Weitere Informationen dazu finden Sie unter Feld spec.volumes (optional).
Feld containers.resources
¶
Ein Computepool definiert eine Reihe von verfügbaren Ressourcen (CPU, Arbeitsspeicher und Speicher) und Snowflake bestimmt, wo im Computepool Ihre Dienste ausgeführt werden sollen.
Es wird empfohlen, die Anforderungen an die Ressourcen für den jeweiligen Container explizit anzugeben und in der Spezifikation entsprechende Beschränkungen vorzunehmen. Beachten Sie, dass die von Ihnen angegebenen Ressourcen durch die Instanz-Familie der Knoten in Ihrem Computepool eingeschränkt sind. Weitere Informationen dazu finden Sie unter CREATE COMPUTE POOL.
Verwenden Sie das Feld containers.resources
, um explizite Anforderungen an die Ressourcen für einen bestimmten Container anzugeben:
containers.resources.requests
: Die Anfragen, die Sie angeben, sollten der durchschnittlichen Nutzung der Ressourcen entsprechen, die Sie von Ihrem Service erwarten. Snowflake verwendet diese Informationen, um die Platzierung der Dienstinstanz im Computepool zu bestimmen. Snowflake stellt sicher, dass die Summe der auf einem bestimmten Knoten gestellten Anfragen nach Ressourcen mit den verfügbaren Ressourcen auf dem Knoten übereinstimmt.containers.resources.limits
: Die von Ihnen angegebenen Beschränkungen veranlassen Snowflake, keine Ressourcen zuzuweisen, die die angegebenen Grenzen überschreiten. So können Sie Kostenüberschreitungen vermeiden.
Sie können Anforderungen und Grenzen für die folgenden Ressourcen festlegen:
memory
: Dies ist der für Ihren Anwendungscontainer benötigte Arbeitsspeicher. Für die Angabe der Werte können entwender dezimale oder binäre Einheiten verwendet werden. Zum Beispiel steht 2G für eine Anfrage nach 2.000.000.000 Bytes und 2Gi für eine Anfrage nach 2 x 1024 x 1024 x 1024 Bytes.Bei der Angabe von Arbeitsspeicher ist eine Einheit erforderlich. Beispiel:
100M
oder5Gi
Die unterstützten Einheiten sind: M, Mi, G, Gi.cpu
: Dies bezieht sich auf virtuelle Verarbeitungseinheiten (vCPU). Beispielsweise ist die 1 CPU-Einheit gleichbedeutend mit 1 vCPU. Erlaubt sind auch Anforderungen von Bruchteilen, wie „0.5“, die auch als „500m“ ausgedrückt werden können.nvidia.com/gpu
: Wenn GPUs erforderlich sind, müssen diese angefordert werden, und es muss auch einlimit
-Wert für dieselbe Menge angegeben werden. Wenn Ihr Container keine Anforderungen und Limits für die GPU-Kapazität angibt, ist kein Zugriff auf GPUs möglich. Die Anzahl der GPUs, die Sie anfordern können, ist durch die maximale Anzahl von GPUs begrenzt, die von dem Instanz-Typ inINSTANCE_TYPE
unterstützt wird, den Sie beim Erstellen eines Computepools auswählen.
resource.requests
und resource.limits
beziehen sich auf die Knotenkapazität (vCPU und Speicher) der Instanzfamilie des zugehörigen Computepools.
Wenn keine Ressourcenanfrage (CPU, Speicher oder beides) gestellt wird, leitet Snowflake eine für Sie ab:
Für
cpu
ist der abgeleitete Wert entweder 0,5 oder die von Ihnen angegebenecpu
-Grenze, je nachdem, welcher Wert kleiner ist.Für
memory
ist der abgeleitete Wert entweder 0,5 GiB oder die von Ihnen angegebenememory
-Grenze, je nachdem, welcher Wert kleiner ist.
Wenn keine Ressourcengrenze (CPU, Speicher oder beides) angegeben wird, setzt Snowflake die Grenzen auf die Knotenkapazität für die Instanzfamilie des zugehörigen Computepools.
Wenn Sie
resource.limits
zur Verfügung stellen und diese die Knotenkapazität überschreiten, wird Snowflake die Grenze auf die Knotenkapazität begrenzen.Snowflake wertet diese Ressourcenanforderungen unabhängig voneinander für
cpu
undmemory
aus.
Beachten Sie, dass CREATE SERVICE fehlschlägt, wenn es für Snowflake theoretisch unmöglich ist, den Dienst auf dem angegebenen Computepool zu planen. Wenn es theoretisch unmöglich ist, wird davon ausgegangen, dass der Computepool über die maximale Anzahl von Knoten verfügt und es keine anderen Dienstes auf dem Computepool ausgeführt werden. Das heißt, dass Snowflake die angefragten Ressourcen nicht innerhalb der Grenzen des Computepools zuweisen kann. Wenn es theoretisch möglich ist, aber die erforderlichen Ressourcen bereits genutzt werden, wird CREATE SERVICE erfolgreich sein. Einige Dienstinstanzen melden einen Status, der besagt, dass der Dienst aufgrund unzureichender Ressourcen nicht geplant werden kann, bis die Ressourcen verfügbar sind.
Beispiel 1
In der folgenden Spezifikation beschreibt das Feld containers.resources
die Ressourcenanforderungen für den Container:
spec:
containers:
- name: resource-test-gpu
image: ...
resources:
requests:
memory: 2G
cpu: 0.5
nvidia.com/gpu: 1
limits:
memory: 4G
nvidia.com/gpu: 1
In diesem Beispiel wird Snowflake aufgefordert, dem Container mindestens 2 GB Arbeitsspeicher, eine GPU und einen halben CPU-Kern zuzuweisen. Gleichzeitig darf der Container nicht mehr als 4 GB Arbeitsspeicher und eine GPU verwenden.
Beispiel 2
Nehmen Sie an:
Sie erstellen einen Computepool mit zwei Knoten; jeder Knoten verfügt über 27 GB Arbeitsspeicher und einen GPU:
CREATE COMPUTE POOL tutorial_compute_pool MIN_NODES = 2 MAX_NODES = 2 INSTANCE_FAMILY = gpu_nv_s
Sie erstellen einen Dienst, der Snowflake auffordert, zwei Instanzen des Dienstes auszuführen:
CREATE SERVICE echo_service MIN_INSTANCES=2 MAX_INSTANCES=2 IN COMPUTE POOL tutorial_compute_pool FROM @<stage_path> SPEC=<spec-file-stage-path>;
Sowohl
MIN_INSTANCES
als auchMAX_INSTANCES
werden auf 2 gesetzt. Daher wird Snowflake zwei Instanzen des Dienstes ausführen.
Betrachten Sie nun diese Szenarien:
Wenn Ihr Dienst nicht ausdrücklich Anforderungen an die Ressourcen in Ihrer Anwendungsspezifikation enthält, entscheidet Snowflake, ob diese Instanzen auf demselben Knoten oder auf verschiedenen Knoten im Computepool ausgeführt werden.
Sie nehmen die Anforderungen an die Ressourcen in die Dienstspezifikation auf und fragen 10 GB Speicher für den Container an:
- name: resource-test image: ... resources: requests: memory: 15G
Ihr Computepool-Knoten verfügt über 27 GB Arbeitsspeicher, wobei Snowflake nicht zwei Container auf demselben Knoten ausführen kann. Snowflake führt die beiden Dienstinstanzen auf separaten Knoten im Computepool aus.
Sie nehmen die Anforderungen an die Ressourcen in die Dienstspezifikation auf und fragen 1 GB Speicher und einen GPU für den Container an:
spec: containers: - name: resource-test-gpu image: ... resources: requests: memory: 2G nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1
Sie fordern eine GPU pro Container an, und jeder Knoten hat nur eine GPU. In diesem Fall kann Snowflake nicht beide Dienstinstanzen auf einem Knoten planen, obwohl der Speicher kein Problem darstellt. Diese Anforderung zwingt Snowflake dazu, die beiden Dienstinstanzen auf zwei separaten Computepool-Knoten auszuführen.
Feld containers.secrets
¶
secrets: # optional list
- snowflakeSecret:
objectName: <object-name> # specify this or objectReference
objectReference: <reference-name> # specify this or objectName
directoryPath: <path> # specify this or envVarName
envVarName: <name> # specify this or directoryPath
secretKeyRef: username | password | secret_string # specify only with envVarName
- snowflakeSecret: <object-name> # equivalent to snowflakeSecret.objectName
...
Verwenden Sie das Feld containers.secrets
in Ihrer Dienstspezifikation, um von Snowflake verwaltete Anmeldeinformationen für Ihre Anwendungscontainer bereitzustellen. Beginnen Sie mit der Speicherung der Anmeldeinformationen in Snowflake-Geheimnisobjekten. Dann verweisen Sie in der Dienstspezifikation auf das geheime Objekt und geben an, wo die Anmeldeinformationen im Container abgelegt werden sollen.
Im Folgenden finden Sie eine Zusammenfassung der Verwendung der Felder von containers.secrets
:
Snowflake-Geheimnis angeben: Verwenden Sie das Feld
snowflakeSecret
, um entweder den Namen eines geheimen Snowflake-Objekts oder eine Objektreferenz anzugeben. Objektreferenzen sind anwendbar, wenn Sie Snowpark Container Services verwenden, um eine Native App (eine App mit Containern) zu erstellen.Verwenden Sie
secretKeyRef
, um den Namen des Schlüssels im Snowflake-Geheimnis anzugeben.
Bestimmen Sie die Platzierung des Geheimnisses im Anwendungscontainer: Verwenden Sie das Feld
envVarName
, um das Geheimnis als Umgebungsvariable zu übergeben, oderdirectoryPath
, um die Geheimnisse in lokale Container-Dateien zu schreiben.
Weitere Informationen dazu finden Sie unter Übergabe von Anmeldeinformationen an einen Container mit Snowflake-Geheimnissen.
Beachten Sie, dass die Rolle, die den Dienst erstellt (Eigentümerrolle), die Berechtigung READ für die referenzierten Geheimnisse benötigt.
Feld spec.endpoints
(optional)¶
Verwenden Sie das Feld spec.endpoints
, um eine Liste der TCP-Netzwerkports anzugeben, die Ihre Anwendung öffentlich bereitstellt. Ein Dienst kann null bis viele Endpunkte aufweisen. Verwenden Sie die folgenden Felder, um einen Endpunkt zu beschreiben:
name
: Eindeutiger Name des Endpunkts. Der Name wird zur Identifizierung des Endpunkts in den Spezifikationen Dienstfunktion und Dienstrolle verwendet.port
: Der Port im Netzwerk, auf dem Ihr Service lauscht. Sie müssen dieses Feld oder das FeldportRange
angeben.portRange
: Der Bereich der Netzwerkports, auf denen Ihre Anwendung lauscht. Sie müssen dieses Feld oder das Feldport
angeben.Beachten Sie, dass Sie das Feld
portRange
nur angeben können, wenn das Feldprotocol
auf TCP eingestellt ist und das Feldpublic
falsch ist.public
: Wenn dieser Endpunkt über das Internet zugänglich sein soll, setzen Sie dieses Feld auftrue
. Öffentliche Endpunkte werden mit dem TCP-Protokoll nicht unterstützt.protocol
: Das Protokoll, das der Endpunkt unterstützt. Folgende Werte werden unterstützt: TCP, HTTP und HTTPS. Das Standardprotokoll ist HTTP. Wenn Sie dieprotocol
angeben, gilt Folgendes:Wenn dieser Endpunkt öffentlich oder das Ziel einer Dienstspezifikation ist (siehe Verwenden eines Dienstes), muss das Protokoll HTTP oder HTTPS lauten.
Die Jobdienste setzen voraus, dass alle angegebenen Endpunkte das TCP-Protokoll verwenden. Die Protokolle HTTP/HTTPS werden nicht unterstützt.
Bemerkung
Snowflake führt für den öffentlichen Zugriff Authentifizierungs- und Autorisierungsprüfungen durch, die nur Snowflake-Benutzern mit entsprechender Berechtigung die Verwendung des Dienstes ermöglichen. Der öffentliche Zugriff auf einen Endpunkt erfordert eine Snowflake-Authentifizierung. Der authentifizierte Benutzer muss auch über die Autorisierung für diesen Dienstendpunkt verfügen (der Benutzer hat die Nutzungsberechtigung für eine Rolle, die Zugriff auf den Endpunkt hat).
Beispiel
Im Folgenden finden Sie die Anwendungsspezifikation, die in Tutorial 1 verwendet wird:
spec:
container:
- name: echo
image: <image-name>
env:
SERVER_PORT: 8000
CHARACTER_NAME: Bob
readinessProbe:
port: 8000
path: /healthcheck
endpoint:
- name: echoendpoint
port: 8000
public: true
Dieser Anwendungscontainer stellt einen Endpunkt öffentlich zur Verfügung. Der Container enthält auch das optionale Feld public
, um den Zugriff auf den Endpunkt von außerhalb von Snowflake (Internetzugang) zu ermöglichen. Standardmäßig ist public
auf false
eingestellt.
Feld spec.volumes
(optional)¶
In diesem Abschnitt werden die beiden Felder spec.volumes
und spec.containers.volumeMounts
erklärt, da sie eng miteinander verbunden sind.
spec.volumes
definiert ein gemeinsames Dateisystem. Diese Volumes können in Ihren Containern verfügbar gemacht werden.spec.containers.volumeMount
definiert, wo ein Volume in bestimmten Containern erscheint.
Beachten Sie, dass das Feld volumes
auf der Ebene spec
angegeben wird, aber da sich mehrere Container dasselbe Volume teilen können, wird volumeMounts
zu einem Feld der Ebene spec.containers
.
Verwenden Sie diese Felder, um sowohl die Volumes als auch die Volumebereitstellungen zu beschreiben.
spec.volumes
: Es kann null oder mehr Volumes geben. Verwenden Sie die folgenden Felder, um ein Volume zu beschreiben:Erforderliche Felder für alle Volumetypen:
name
: Eindeutiger Name des Volumes. Er wird mitspec.containers.volumeMounts.name
bezeichnet.source
: Dies kannlocal
,memory
,block
oder"@<stagename>"
sein. In den nächsten Abschnitten werden diese Volumetypen näher erläutert.size
(nur für die Volume-Typenmemory
undblock
erforderlich): Bei Speicher- und Block-Volumes ist dies die Größe des Volumes in Bytes. Bei Blockspeichern muss der Wert immer eine Ganzzahl (Integer) sein, die mit dem Suffix „Gi“ für die Einheit angegeben wird. Beispiel:5Gi
bedeutet5*1024*1024*1024
Bytes.
Für den Datenträgertyp
block
können Sie die folgenden optionalen Felder angeben. Weitere Informationen dazu finden Sie unter Angeben von Blockspeicher in Dienstspezifikation.blockConfig.initialContents.fromSnapshot
: Geben Sie einen zuvor erstellten Snapshot eines anderen Volumes an, um das Block-Volume zu initialisieren. Der Snapshot muss sich im Zustand CREATED befinden, bevor er zur Erstellung eines Volumes verwendet werden kann, sonst schlägt die Erstellung des Dienstes fehl. Verwenden Sie den Befehl DESCRIBE SNAPSHOT, um den Status des Snapshots abzurufen.blockConfig.iops
: Geben Sie die Anzahl der unterstützten Spitzenoperationen für die Eingabe/Ausgabe pro Sekunde an. Der unterstützte Bereich ist 3000-16000 in AWS und 3000-80000 in Azure, mit einer Voreinstellung von 3000. Beachten Sie, dass die Datengröße pro Operation bei Block-Volumes auf 256 KiB begrenzt ist.blockConfig.throughput
: Geben Sie den Spitzendurchsatz in MiB/Sekunde an, der für das Volume bereitgestellt werden soll. Der unterstützte Bereich ist 125-1000 in AWS und 125-1200 in Azure, mit einer Standardeinstellung von 125.
spec.containers.volumeMounts
: Jeder Container kann null oder mehr Volume-Bereitstellungen haben.containers.volumeMounts
ist ebenfalls eine Auflistung. Das heißt, jeder Container kann mehrere Volume-Bereitstellungen haben. Verwenden Sie die folgenden Felder, um eine Volume-Bereitstellung zu beschreiben:name
: Der Name des einzubindenden Volumes. Ein einzelner Container kann mehrfach auf dasselbe Volume verweisen.mountPath
: Der Dateipfad, unter dem das Volume für den Container eingebunden werden soll.
Allgemeine Informationen zu unterstützten Volume-Typen¶
Snowflake unterstützt die folgenden Volume-Typen für Anwendungscontainer: lokal, Arbeitsspeicher, Block und Snowflake-Stagingbereich.
Lokales Volume: Container in einer Dienstinstanz können einen lokalen Datenträger zur Freigabe von Dateien verwenden. Wenn Ihre Anwendung beispielsweise aus zwei Containern besteht – einem Anwendungscontainer und einem Protokollanalysator – kann die Anwendung Protokolle in das lokale Volume schreiben, und der Protokollanalysator kann die Protokolle lesen.
Wenn Sie mehrere Instanzen eines Dienstes ausführen, müssen Sie beachten, dass nur Container, die zu einer Dienstinstanz gehören, Volumes gemeinsam nutzen können. Container, die zu verschiedenen Dienstinstanzen gehören, können Volumes nicht gemeinsam verwenden.
Arbeitsspeicher: Sie können ein RAM-gestütztes Dateisystem für die Verwendung im Container verwenden.
Block: Container können auch Blockspeicher-Volumes verwenden. Weitere Informationen dazu finden Sie unter Verwenden von Blockspeicher-Volumes mit Diensten.
Snowflake-Stagingbereich: Sie können Containern auch bequemen Zugriff auf Dateien in einem Snowflake-Stagingbereich Ihres Kontos geben. Weitere Informationen dazu finden Sie unter Snowflake-Stagingbereiche mit Diensten verwenden.
Beispiel
Ihre Anwendung für maschinelles Lernen umfasst die folgenden zwei Container:
Container
app
für die HauptanwendungContainer
logger-agent
, der Protokolleinträge sammelt und sie zu Amazon S3 hochlädt
Diese Container verwenden die folgenden zwei Volumes:
Volume
local
: Diese Anwendung schreibt Protokolleinträge, die der Logger-Agent liest.Snowflake-Stagingbereich
@model_stage
: Die Hauptanwendung liest Dateien aus diesem Stagingbereich.
In der folgenden Beispielspezifikation bindet der Container app
sowohl das Volume logs
als auch das Volume models
ein, und der Container logging-agent
bindet nur das Volume logs
ein:
spec: containers: - name: app image: <image1-name> volumeMounts: - name: logs mountPath: /opt/app/logs - name: models mountPath: /opt/models - name: logging-agent image: <image2-name> volumeMounts: - name: logs mountPath: /opt/logs volumes: - name: logs source: local - name: models source: "@model_stage"
Wenn mehrere Instanzen des Dienstes ausgeführt werden, verwenden die Container logging-agent
und app
innerhalb einer Dienstinstanz das Volume logs
gemeinsam. Das Volume logs
ist nicht für mehrere Dienstinstanzen freigegeben.
Wenn Ihr app
-Container zusätzlich zu diesen Volumes auch ein 2-GB-Arbeitsspeicher-Volume verwendet, überarbeiten Sie die Spezifikation, um das Volume in die volumes
-Liste aufzunehmen, und fügen Sie außerdem eine weitere Volume-Bereitstellung in die volumeMounts
-Liste des app
-Containers ein:
spec: containers: - name: app image: <image1-name> volumeMounts: - name: logs mountPath: /opt/app/logs - name: models mountPath: /opt/models - name: my-mem-volume mountPath: /dev/shm - name: logging-agent image: <image2-name> volumeMounts: - name: logs mountPath: /opt/logs volumes: - name: logs source: local - name: models source: "@model_stage" - name: "my-mem-volume" source: memory size: 2G
Wenn Sie memory
als Volume source
angeben, müssen Sie auch das Feld volumes.size
spezifizieren, um die Größe des Arbeitsspeichers anzugeben. Weitere Informationen zu den Größeneinheiten für Arbeitsspeicher, die Sie verwenden können, finden Sie unter Allgemeine Informationen zu Maßeinheiten.
Über Berechtigungen für Dateien auf gemounteten Volumes¶
Ein Container, der einen Snowflake-Stagingbereich oder ein Blockspeicher-Volume einbindet, wird normalerweise als Root-Benutzer ausgeführt. Es kann jedoch vorkommen, dass Ihr Container als Nicht-Root-Benutzer ausgeführt wird. Beispiel:
Wenn Ihre Anwendung eine Drittanbieter-Bibliothek verwendet, benutzt die Bibliothek einen Nicht-Root-Benutzer, um den Anwendungscode innerhalb des Containers auszuführen.
Sie können Ihre Anwendung auch aus anderen Gründen, z. B. aus Sicherheitsgründen, als Nicht-Root-Benutzer innerhalb des Containers ausführen.
Um mögliche Fehler im Zusammenhang mit den Dateibenutzerrechten zu vermeiden, ist es wichtig, die UID (Benutzer-ID) und GID (Gruppen-ID) des Containers als Teil der Spezifikation festzulegen. Dies ist besonders wichtig für Container, die einen bestimmten Benutzer und eine bestimmte Gruppe zum Starten oder Ausführen der Anwendung innerhalb des Containers verwenden. Durch Festlegen der entsprechenden UID und GID können Sie einen Container verwenden, der als ein Nicht-Root-Benutzer ausgeführt wird. Beispiel:
spec:
...
volumes:
- name: stagemount
source: "@test"
uid: <UID-value>
gid: <GID-value>
Snowflake verwendet diese Informationen, um den Stagingbereich mit den entsprechenden Berechtigungen einzubinden.
Um die UID und GID des Containers zu erhalten, gehen Sie wie folgt vor:
Führen Sie den Container lokal mit
docker run
aus.Suchen Sie die Container-ID mit dem Befehl
docker container list
. Hier ist ein Ausschnitt einer Beispielausgabe:CONTAINER ID IMAGE COMMAND —---------------------------------------------------------- a6a1f1fe204d tutorial-image "/usr/local/bin/entr…"
Führen Sie den Befehl
docker id
innerhalb des Containers aus, um die Werte von UID und GID zu erhalten:docker exec -it <container-id> id
Beispielausgabe:
uid=0(root) gid=0(root) groups=0(root)
Feld spec.logExporters
(optional)¶
Snowflake sammelt die Ausgaben Ihrer Anwendungen auf der Standardausgabe oder dem Standardfehler. Weitere Informationen finden Sie unter Zugriff auf lokale Container-Protokolle. Verwenden Sie spec.logExporters
, um zu konfigurieren, welche dieser Ausgaben Snowflake in Ihre Ereignistabelle exportiert.
logExporters:
eventTableConfig:
logLevel: < INFO | ERROR | NONE >
Folgende logLevel
-Werte werden unterstützt:
INFO
(Standard): Alle Benutzerprotokolleinträge exportieren.ERROR
: Nur Fehlerprotokolleinträge exportieren. Snowflake exportiert nur die Protokolle aus dem „stderr“-Stream.NONE
: Es werden keine Protokolleinträge in die Ereignistabelle exportiert.
Feld spec.platformMonitor
(optional)¶
Einzelne Dienste veröffentlichen Metriken. Diese von Snowflake bereitgestellten Metriken werden auch als Plattform-Metriken bezeichnet. Sie fügen das Feld spec.platformMonitor
in der Spezifikation hinzu, um Snowflake anzuweisen, Metriken vom Dienst an die für Ihr Konto konfigurierte Ereignistabelle zu senden. Ziel ist es, die Auslastung der Ressourcen eines bestimmten Dienste zu beobachten.
platformMonitor:
metricConfig:
groups:
- <group_1>
- <group_2>
...
group_N
verweist auf eine vordefinierte Metrikgruppen, die Sie interessieren. Während der Dienst läuft, protokolliert Snowflake die Metriken der angegebenen Gruppen in der Ereignistabelle. Sie können dann die Metriken aus der Ereignistabelle abfragen. Weitere Informationen finden Sie unter Überwachen von Diensten.
Allgemeine Informationen zu Maßeinheiten¶
Eine Dienstspezifikation enthält an mehreren Stellen numerische Werte. Zum Ausdruck dieser Werte wird eine Vielzahl von Einheiten unterstützt. Für große und kleine Werte können Sie, wie gezeigt, binäre und dezimale Maßeinheiten verwenden. In der folgenden Liste steht „#“ für einen Ganzzahlwert (Integer).
Binäreinheiten:
numberKi
bedeutetnumber*1024
. Beispiel: 4Ki ist gleichbedeutend mit 4.096.numberMi
bedeutetnumber*1024*1024
.numberGi
bedeutetnumber*1024*1024*1024
.
Dezimaleinheiten:
numberk
bedeutetnumber*1000
. Beispiel:: 4k ist gleichbedeutend mit 4.000.numberM
bedeutetnumber*1000*1000
.numberG
bedeutenumber*1000*1000*1000
.
Bruchteileinheiten:
numberm
bedeutetnumber*0.001
. Beispielsweise istcpu: 500m
äquivalent zucpu: 0.5
.
Feld serviceRoles
(optional)¶
Verwenden Sie das allgemeine Feld serviceRoles
in der Spezifikation, um eine oder mehrere Dienstrollen zu definieren. Geben Sie für jede Dienstrolle einen Namen und eine Liste von einem oder mehreren Endpunkten an (definiert in spec.endpoints
), für die die Dienstrolle die Berechtigung USAGE erteilen soll.
serviceRoles: # Optional list of service roles
- name: <name>
endpoints:
- <endpoint-name>
- <endpoint-name>
- ...
- ...
Beachten Sie Folgendes:
Sowohl
name
als auchendpoints
sind erforderlich.Der Name der Dienstrolle muss dem folgenden Format entsprechen:
Muss alphanumerische oder
_
-Zeichen enthalten.Muss mit einem alphabetischen Zeichen beginnen.
Muss mit einem alphanumerischen Zeichen enden.
Weitere Informationen dazu finden Sie unter Verwalten des Zugriffs auf Dienstendpunkte.