Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Helm ist ein Paketmanager für Kubernetes, der die Verwaltung des Anwendungslebenszyklus vereinfacht. Helmpakete werden als Diagramme bezeichnet und bestehen aus YAML-Konfigurations- und Vorlagendateien. Bei Ausführung eines Helm-Vorgangs werden die Diagramme in Kubernetes-Manifestdateien gerendert, um die entsprechenden Anwendungslebenszyklusaktionen auszulösen. Befolgen Sie bei der Entwicklung von Helm-Diagrammen diese empfohlenen bewährten Methoden, um die effizienteste Integration in Azure Operator Service Manager zu erzielen.
Überlegungen zu registryPath und imagePullSecrets
Im Allgemeinen erfordert jedes Helm-Chart die Parameter registryPath und imagePullSecrets. Am häufigsten machen Sie diese Parameter in der values.yaml Datei verfügbar. Zunächst hängt azure Operator Service Manager von Publishern ab, die diese Werte streng verwalten (Legacy-Ansatz), um während der Bereitstellung durch die richtigen Azure-Werte ersetzt zu werden. Aber nicht alle Verlage konnten die strikte Verwaltung dieser Werte leicht einhalten. Einige Diagramme blenden registryPath und/oder imagePullSecrets durch Bedingungen oder andere Wertbeschränkungen aus, die nicht immer erfüllt wurden. Einige Diagramme deklarieren registryPath und/oder imagePullSecrets als Array anstelle der erwarteten benannten Zeichenfolge.
Um die Complianceanforderungen für Herausgeber zu verringern, führte Azure Operator Service Manager zwei verbesserte Methoden ein: injectArtifactStoreDetail und die Clusterregistrierung. Diese neueren Methoden hängen nicht davon ab, das registryPath oder imagePullSecrets im Helm-Paket vorhanden sind. Stattdessen verwenden diese Methoden einen Webhook, um die richtigen Azure-Werte direkt in Pod-Vorgänge einzufügen.
Methodenzusammenfassung für registryPath und imagePullSecrets
Alle drei Methoden werden derzeit unterstützt, wie in diesem Artikel beschrieben. Wählen Sie die beste Option für Ihre Netzwerkfunktion (NF) und den Anwendungsfall aus.
Hinterlassenschaft:
- Erfordert, dass Sie
registryPathundimagePullSecretsin Helm-Werten und Bereitstellungsvorlagen für die Ersetzung parametrisieren. - Hosten von Images in der Azure-Containerregistrierung.
InjectArtifactStoreDetail:
- Verwendet einen Webhook, um
registryPathundimagePullSecretsmit minimalen Abhängigkeiten von Helm direkt in Podvorgänge zu injizieren. - Hosten von Images in der Azure-Containerregistrierung.
Clusterregistrierung:
- Verwendet einen Webhook, um
registryPathundimagePullSecretsohne Abhängigkeiten von Helm direkt in Podvorgänge zu injizieren. - Hostet Images in der lokalen NFO-Erweiterung (Network Function Operator).
In allen drei Fällen ersetzt Azure Operator Service Manager Azure-Werte für alle Werte, die Sie in Vorlagen verfügbar machen. Der einzige Unterschied ist die Methode der Ersetzung.
Legacyanforderungen für registryPath und imagePullSecrets
Azure Operator Service Manager verwendet den Azure Network Function Manager-Dienst, um containerisierte Netzwerkfunktionen (CNFs) bereitzustellen. Mit der Legacymethode ersetzt der Azure-Netzwerkfunktionsmanager die Werte registryPath und imagePullSecrets des Azure Operator Service Manager-Containers während der Bereitstellung von Netzwerkfunktionen im Helm-Vorgang.
Beispiel für die veraltete Methode
Die folgende Helm-Bereitstellungsvorlage zeigt ein Beispiel dafür, wie Sie registryPath und imagePullSecrets verfügbar machen sollten:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
{{- if .Values.global.imagePullSecrets }}
imagePullSecrets: {{ toYaml .Values.global.imagePullSecrets | nindent 8 }}
{{- end }}
containers:
- name: contosoapp
image:{{ .Values.global.registryPath }}/contosoapp:1.14.2
ports:
- containerPort: 80
Die folgende values.yaml Vorlage zeigt ein Beispiel dafür, wie Sie die Werte registryPath und imagePullSecrets bereitstellen können.
global:
imagePullSecrets: []
registryPath: ""
Die folgende values.schema.json Datei zeigt ein Beispiel dafür, wie Sie die Werte registryPath und imagePullSecrets definieren können.
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "StarterSchema",
"type": "object",
"required": ["global"],
"properties": {
"global" : {
"type": "object",
"properties": {
"registryPath": {"type": "string"},
"imagePullSecrets": {"type": "string"},
}
"required": [ "registryPath", "imagePullSecrets" ],
}
}
}
Die folgende Anforderungsnutzlast der Netzwerkfunktionsdefinitionsversion (NFDV) zeigt ein Beispiel dafür, wie Sie die registryPath- und imagePullSecrets-Werte bei der Bereitstellung angeben können.
"registryValuesPaths": [ "global.registryPath" ],
"imagePullSecretsValuesPaths": [ "global.imagePullSecrets" ],
In den vorherigen Beispielen:
- Der
registryPathWert wird ohne Präfix wiehttps://oderoci://gesetzt. Definieren Sie bei Bedarf ein Präfix im Helm-Paket. -
imagePullSecretsundregistryPathmüssen während des NFDV-Onboardings bereitgestellt werden.
Weitere Überlegungen
Berücksichtigen Sie die folgenden Empfehlungen, wenn Sie die Legacymethode verwenden.
Vermeiden von Verweisen auf eine externe Registrierung
Verweise auf eine externe Registrierung können Zu Überprüfungsproblemen führen. Wenn deployment.yaml z. B. einen hartcodierten Registrierungspfad oder externe Registrierungsverweise verwendet, schlägt die Validierung fehl.
Durchführen manueller Überprüfungen
Überprüfen Sie die Images und Containerspezifikationen, um sicherzustellen, dass die Images ein Präfix von registryPath haben und imagePullSecrets mit secretName gefüllt ist.
helm template --set "global.imagePullSecrets[0].name=<secretName>" --set "global.registry.url=<registryPath>" <release-name> <chart-name> --dry-run
Hier ist ein weiteres Beispiel angegeben:
helm install --set "global.imagePullSecrets[0].name=<secretName>" --set "global.registry.url=<registryPath>" <release-name> <chart-name> --dry-run
kubectl create secret <secretName> regcred --docker-server=<registryPath> --dockerusername=<regusername> --docker-password=<regpassword>
Verwenden eines statischen Bild-Repositorys und Tags
Jeder Helm-Chart sollte ein statisches Imagerepository und Tags enthalten. Sie legen die statischen Werte über eine der folgenden Methoden fest:
- In der
imageZeile - In
values.yaml, ohne diese Werte im NFDV offenzulegen
Ein NFDV sollte einem statischen Satz von Helm-Charts und Images zugeordnet werden. Sie aktualisieren die Diagramme und Bilder nur, indem Sie einen neuen NFDV veröffentlichen, wie in den folgenden Beispielen gezeigt:
image: "{{ .Values.global.registryPath }}/contosoapp:1.14.2"
image: "{{ .Values.global.registryPath }}/{{ .Values.image.repository }}:{{ .Values.image.tag}}"
YAML values.yaml
image:
repository: contosoapp
tag: 1.14.2
image: http://myUrl/{{ .Values.image.repository }}:{{ .Values.image.tag}}
injectArtifactStoreDetails-Anforderungen für registryPath und imagePullSecrets
In einigen Fällen sind Helm-Charts von Drittanbietern möglicherweise nicht vollständig mit den Anforderungen von Azure Operator Service Manager für registryPath kompatibel. In diesen Fällen können Sie injectArtifactStoreDetails verwenden, um Compliance-Änderungen an Helm-Paketen zu vermeiden.
Aktivieren Sie injectArtifactStoreDetails, und verwenden Sie eine Webhookmethode, um die entsprechenden Werte für registryPath und imagePullSecrets dynamisch während der Podvorgänge zu injizieren. Diese Methode setzt die Werte außer Kraft, die im Helm-Paket konfiguriert sind. Sie müssen immer noch legale Dummywerte verwenden, an denen registryPath und imagePullSecrets referenziert werden, meist im global-Abschnitt von values.yaml.
Das folgende values.yaml Beispiel zeigt, wie Sie die registryPath- und imagePullSecrets-Werte für die Kompatibilität mit dem injectArtifactStoreDetails-Ansatz bereitstellen können.
global:
registryPath: "azure.io"
imagePullSecrets: ["abc123"]
Hinweis
Wenn registryPath im zugrunde liegenden Helm-Paket leer bleibt, tritt bei der SNS-Bereitstellung (Site Network Service, Standortnetzwerkdienst) während des Imagedownloads ein Fehler auf.
Verwenden der injectArtifactStoreDetails-Methode
Legen Sie zum Aktivieren von injectArtifactStoreDetails den installOptions Parameter im Abschnitt roleOverrides der NF-Ressource auf true fest, wie im folgenden Beispiel gezeigt:
resource networkFunction 'Microsoft.HybridNetwork/networkFunctions@2023-09-01' = {
name: nfName
location: location
properties: {
nfviType: 'AzureArcKubernetes'
networkFunctionDefinitionVersionResourceReference: {
id: nfdvId
idType: 'Open'
}
allowSoftwareUpdate: true
nfviId: nfviId
deploymentValues: deploymentValues
configurationType: 'Open'
roleOverrideValues: [
// Use inject artifact store details feature on test app 1
'{"name":"testapp1", "deployParametersMappingRuleProfile":{"helmMappingRuleProfile":{"options":{"installOptions":{"atomic":"false","wait":"false","timeout":"60","injectArtifactStoreDetails":"true"},"upgradeOptions": {"atomic": "false", "wait": "true", "timeout": "100", "injectArtifactStoreDetails": "true"}}}}}'
]
}
}
Hinweis
Das Helm-Chart-Paket muss weiterhin ordnungsgemäß formatierte registryPath- und imagePullSecrets-Werte verfügbar machen.
Clusterregistrierungsanforderungen für registryPath und imagePullSecrets
Bei einer Clusterregistrierung werden Bilder aus der Azure-Containerregistrierung in ein lokales Docker-Repository im Nexus Kubernetes-Cluster kopiert. Sie verwenden eine Webhook-Methode, um die richtigen registryPath- und imagePullSecrets-Werte während der Pod-Vorgänge dynamisch einzufügen. Diese Methode setzt die Werte außer Kraft, die im Helm-Paket konfiguriert sind. Sie müssen immer noch legale Dummywerte verwenden, an denen registryPath und imagePullSecrets referenziert werden, meist im global-Abschnitt von values.yaml.
Das folgende values.yaml Beispiel zeigt, wie Sie die Werte registryPath und imagePullSecrets für die Kompatibilität mit dem Clusterregistrierungsansatz angeben können:
global:
registryPath: "azure.io"
imagePullSecrets: ["abc123"]
Hinweis
Wenn registryPath im zugrunde liegenden Helm-Paket leer bleibt, tritt bei der SNS-Bereitstellung während des Imagedownloads ein Fehler auf.
Weitere Informationen zur Verwendung einer Clusterregistrierung finden Sie in der Konzeptdokumentation.
Empfehlungen für Unveränderlichkeitseinschränkungen
Einschränkungen für die Unveränderlichkeit verhindern Änderungen an einer Datei oder einem Verzeichnis. Beispielsweise kann eine unveränderliche Datei nicht geändert oder umbenannt werden. Vermeiden Sie die Verwendung von änderbaren Tags wie latest, , devoder stable. Wenn deployment.yaml für latest in .Values.image.tag verwendet wird, tritt bei der Bereitstellung ein Fehler auf.
image: "{{ .Values.global.registryPath }}/{{ .Values.image.repository }}:{{ .Values.image.tag}}"
Empfehlungen für CRD-Deklaration und Verbrauchsaufteilung
Es wird empfohlen, die Deklaration und Verwendung von Kundenressourcendefinitionen (CRDs) in separate Helm-Diagramme aufzuteilen, um Updates zu unterstützen. Ausführliche Informationen finden Sie in der Helm-Dokumentation zum Trennen von Diagrammen.
Empfehlungen für die Imageversionstagging
Um konsistente und vorhersagbare Bereitstellungen sicherzustellen, empfehlen wir Folgendes für alle Containerimages:
- Vermeiden Sie die Verwendung
:latestin Produktionsumgebungen.- Die Verwendung von „latest“ kann zu unerwartetem Verhalten führen, da sich das tatsächliche Bild hinter „latest“ ohne vorherige Ankündigung ändern kann.
- Wenn sich der Tagwert in einer Clusterregistrierung ändert, der Tagname jedoch unverändert bleibt, lädt die Clusterregistrierung das aktualisierte Image nicht erneut herunter.
- Dies kann dazu führen, dass veraltete oder inkonsistente Images ausgeführt werden.
- Verwenden Sie stattdessen immer unveränderliche Tags wie
:1.4.2 - Stellen Sie sicher, dass jeder Build ein eindeutiges Tag erzeugt, und überschreiben Sie keine vorhandenen Tags.
Diese Methoden tragen dazu bei, Bereitstellungsprobleme zu vermeiden und die Rückverfolgbarkeit, Rollbacksicherheit und Sicherheitscompliance zu verbessern.
Empfehlungen für die sequenzielle Sortierung von nfApplication
Standardmäßig werden CNF-Anwendungen basierend auf der Reihenfolge installiert oder aktualisiert, in der sie in der NFDV angezeigt werden. Für den Löschvorgang werden die CNF-Anwendungen in der angegebenen umgekehrten Reihenfolge gelöscht. Wenn Sie eine bestimmte Reihenfolge von CNF-Anwendungen definieren müssen, die sich von der Standardreihenfolge unterscheidet, verwenden Sie dependsOnProfile, um eine eindeutige Sequenz für Installations-, Update- und Löschvorgänge zu definieren.
Verwenden von dependsOnProfile
Sie können dependsOnProfile in der NFDV verwenden, um die Reihenfolge der Helm-Ausführungen für CNF-Anwendungen zu steuern. Im folgenden Beispiel:
- Während eines Installationsvorgangs werden die CNF-Anwendungen in der folgenden Reihenfolge bereitgestellt:
dummyApplication1,dummyApplication2,dummyApplication. - Während eines Aktualisierungsvorgangs werden die CNF-Anwendungen in der folgenden Reihenfolge aktualisiert:
dummyApplication2,dummyApplication1,dummyApplication. - Während eines Löschvorgangs werden die CNF-Anwendungen in der folgenden Reihenfolge gelöscht:
dummyApplication2,dummyApplication1,dummyApplication.
{
"location": "eastus",
"properties": {
"networkFunctionTemplate": {
"networkFunctionApplications": [
{
"dependsOnProfile": {
"installDependsOn": [
"dummyApplication1",
"dummyApplication2"
],
"uninstallDependsOn": [
"dummyApplication1"
],
"updateDependsOn": [
"dummyApplication1"
]
},
"name": "dummyApplication"
},
{
"dependsOnProfile": {
"installDependsOn": [
],
"uninstallDependsOn": [
"dummyApplication2"
],
"updateDependsOn": [
"dummyApplication2"
]
},
"name": "dummyApplication1"
},
{
"dependsOnProfile": null,
"name": "dummyApplication2"
}
],
"nfviType": "AzureArcKubernetes"
},
"networkFunctionType": "ContainerizedNetworkFunction"
}
}
Häufige Fehler mit "dependsOnProfile"
Wenn der in der NFDV bereitgestellte dependsOnProfile-Code ungültig ist, schlägt der NF-Vorgang mit einem Validierungsfehler fehl. Die Meldung für den Validierungsfehler wird in der Vorgangsstatusressource angezeigt und ähnelt folgendem Beispiel:
{
"id": "/providers/Microsoft.HybridNetwork/locations/EASTUS2EUAP/operationStatuses/ca051ddf-c8bc-4cb2-945c-a292bf7b654b*C9B39996CFCD97AB3A121AE136ED47F67BB13946C573EF90628C47628BC5EF5F",
"name": "ca051ddf-c8bc-4cb2-945c-a292bf7b654b*C9B39996CFCD97AB3A121AE136ED47F67BB13946C573EF90628C47628BC5EF5F",
"resourceId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/xinrui-publisher/providers/Microsoft.HybridNetwork/networkfunctions/testnfDependsOn02",
"status": "Failed",
"startTime": "2023-07-17T20:48:01.4792943Z",
"endTime": "2023-07-17T20:48:10.0191285Z",
"error": {
"code": "DependenciesValidationFailed",
"message": "CyclicDependencies: Circular dependencies detected at hellotest."
}
}