Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Helm är en pakethanterare för Kubernetes som förenklar livscykelhanteringen för program. Helm-paket kallas diagram och består av YAML-konfigurations- och mallfiler. Vid körning av en Helm-åtgärd renderas diagrammen i Kubernetes-manifestfiler för att utlösa lämpliga programlivscykelåtgärder. För den mest effektiva integreringen med Azure Operator Service Manager följer du dessa rekommenderade metodtips när du utvecklar Helm-diagram.
Överväganden för registryPath och imagePullSecrets
Varje Helm-diagram kräver registryPath vanligtvis och imagePullSecrets parametrar. Oftast exponerar du dessa parametrar i values.yaml filen. Först var Azure Operator Service Manager beroende av att utgivare som hanterar dessa värden på ett strikt sätt (äldre metod) skulle ersättas med rätt Azure-värden under distributionen. Men inte alla utgivare kan enkelt följa den strikta hanteringen av dessa värden. Vissa diagram döljer registryPath och/eller imagePullSecrets bakom villkor eller andra värdebegränsningar som inte alltid har uppfyllts. Vissa diagram deklarerar registryPath och/eller imagePullSecrets som en matris i stället för som den förväntade namngivna strängen.
För att minska efterlevnadskraven för utgivare introducerade Azure Operator Service Manager två förbättrade metoder: injectArtifactStoreDetail och klusterregistret. Dessa nyare metoder är inte beroende registryPath av eller imagePullSecrets visas i Helm-paketet. I stället använder de här metoderna en webhook för att mata in rätt Azure-värden direkt i poddåtgärder.
Metodsammanfattning för registryPath och imagePullSecrets
Alla tre metoderna stöds för närvarande enligt beskrivningen i den här artikeln. Välj det bästa alternativet för din nätverksfunktion (NF) och användningsfall.
Legat:
- Kräver att du parameteriserar
registryPathochimagePullSecretsi Helm-värden och distributionsmallar för ersättning. - Är värd för avbildningar i Azure Container Registry.
InjectArtifactStoreDetail:
- Använder en webhook för att mata in
registryPathochimagePullSecretsdirekt i poddåtgärder, med minimala beroenden på Helm. - Är värd för avbildningar i Azure Container Registry.
Klusterregister:
- Använder en webhook för att mata in
registryPathochimagePullSecretsdirekt i poddåtgärder, utan beroende av Helm. - Är värd för avbildningar i NFO-tillägget (local network function operator).
I alla tre fallen ersätter Azure Operator Service Manager Azure-värden med de värden som du exponerar i mallar. Den enda skillnaden är substitutionsmetoden.
Äldre krav för registryPath och imagePullSecrets
Azure Operator Service Manager använder Azure Network Function Manager-tjänsten för att distribuera containerbaserade nätverksfunktioner (CNFs). Med den äldre metoden ersätter Azure Network Function Manager Azure Operator Service Manager-containerns registryPath och imagePullSecrets värden i Helm-åtgärden under distributionen av nätverksfunktioner.
Exempel på den äldre metoden
Följande Helm-distributionsmall visar ett exempel på hur du bör exponera registryPath och imagePullSecrets:
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
Följande values.yaml mall visar ett exempel på hur du kan ange registryPath värdena och imagePullSecrets :
global:
imagePullSecrets: []
registryPath: ""
Följande values.schema.json fil visar ett exempel på hur du kan definiera registryPath värdena och imagePullSecrets :
{
"$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" ],
}
}
}
Följande nyttolast för nätverksfunktionsdefinitionsversion (NFDV) visar ett exempel på hur du kan ange registryPath värdena och imagePullSecrets vid distributionen:
"registryValuesPaths": [ "global.registryPath" ],
"imagePullSecretsValuesPaths": [ "global.imagePullSecrets" ],
I föregående exempel:
- Värdet
registryPathanges utan prefix, till exempelhttps://elleroci://. Definiera vid behov ett prefix i Helm-paketet. -
imagePullSecretsochregistryPathmåste tillhandahållas under NFDV-registrering.
Andra överväganden
Tänk på följande rekommendationer när du använder den äldre metoden.
Undvik referenser till ett externt register
Referenser till ett externt register kan orsaka valideringsproblem. Om deployment.yaml du till exempel använder en hårdkodad registersökväg eller externa registerreferenser misslyckas verifieringen.
Utföra manuella valideringar
Granska specifikationerna för avbildningar och containrar för att säkerställa att avbildningarna har ett prefix för registryPath och som imagePullSecrets fylls i med secretName:
helm template --set "global.imagePullSecrets[0].name=<secretName>" --set "global.registry.url=<registryPath>" <release-name> <chart-name> --dry-run
Här är ett annat exempel:
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>
Använda en lagringsplats och taggar för statiska avbildningar
Varje Helm-diagram ska innehålla en lagringsplats för statiska avbildningar och taggar. Du anger de statiska värdena via någon av följande metoder:
- På raden
image - I
values.yaml, utan att exponera dessa värden i NFDV
En NFDV ska mappas till en statisk uppsättning Helm-diagram och bilder. Du uppdaterar endast diagrammen och bilderna genom att publicera en ny NFDV, enligt följande exempel:
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-krav för registryPath och imagePullSecrets
I vissa fall kanske Helm-diagram från tredje part inte är helt kompatibla med Azure Operator Service Manager-kraven för registryPath. I dessa fall kan du använda injectArtifactStoreDetails för att undvika att göra ändringar i Helm-paketens efterlevnad.
Med injectArtifactStoreDetails aktiverad använder du en webhook-metod för att mata in rätt registryPath och imagePullSecrets dynamiskt under poddåtgärderna. Den här metoden åsidosätter de värden som har konfigurerats i Helm-paketet. Du måste fortfarande använda juridiska dummy-värden där registryPath och refereras, vanligtvis i imagePullSecrets avsnittet i globalvalues.yaml .
I följande values.yaml exempel visas hur du kan ange registryPath värdena och imagePullSecrets för kompatibilitet med injectArtifactStoreDetails metoden:
global:
registryPath: "azure.io"
imagePullSecrets: ["abc123"]
Kommentar
Om registryPath lämnas tomt i det underliggande Helm-paketet misslyckas SNS-distributionen (Site Network Service) under nedladdningen av avbildningen.
Använda metoden injectArtifactStoreDetails
Om du vill aktivera injectArtifactStoreDetailsanger du parametern installOptions i NF-resursens roleOverrides avsnitt till true, enligt följande exempel:
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"}}}}}'
]
}
}
Kommentar
Helm-diagrampaketet måste fortfarande exponera korrekt formaterade registryPath värden och imagePullSecrets värden.
Klusterregisterkrav för registryPath och imagePullSecrets
Med ett klusterregister kopieras avbildningar från Azure Container Registry till en lokal Docker-lagringsplats i Nexus Kubernetes-klustret. Du använder en webhook-metod för att mata in rätt registryPath värden och imagePullSecrets värden dynamiskt under poddåtgärderna. Den här metoden åsidosätter de värden som har konfigurerats i Helm-paketet. Du måste fortfarande använda juridiska dummy-värden där registryPath och refereras, vanligtvis i imagePullSecrets avsnittet i globalvalues.yaml .
I följande values.yaml exempel visas hur du kan ange registryPath värdena och imagePullSecrets för kompatibilitet med klusterregistrets metod:
global:
registryPath: "azure.io"
imagePullSecrets: ["abc123"]
Kommentar
Om registryPath lämnas tomt i det underliggande Helm-paketet misslyckas SNS-distributionen under nedladdningen av avbildningen.
Mer information om hur du använder ett klusterregister finns i konceptdokumentationen.
Rekommendationer för oföränderlighetsbegränsningar
Oföränderlighetsbegränsningar förhindrar ändringar i en fil eller katalog. En oföränderlig fil kan till exempel inte ändras eller byta namn. Du bör undvika att använda föränderliga taggar som latest, develler stable. Om deployment.yaml det till exempel används latest för .Values.image.tagmisslyckas distributionen.
image: "{{ .Values.global.registryPath }}/{{ .Values.image.repository }}:{{ .Values.image.tag}}"
Rekommendationer för CRD-deklaration och användningsdelning
Vi rekommenderar att du delar upp deklarationen och användningen av kundresursdefinitioner i separata Helm-diagram för att stödja uppdateringar. Detaljerad information finns i Helm-dokumentationen om att avgränsa diagram.
Rekommendationer för avbildningsversionstaggning
För att säkerställa konsekventa och förutsägbara distributioner rekommenderar vi följande för alla containeravbildningar:
- Undvik att använda
:latesti produktionsmiljöer.- Användning av senaste kan orsaka oväntat beteende eftersom den faktiska bilden bakom den senaste kan ändras utan föregående meddelande.
- Om taggvärdet ändras men taggnamnet förblir detsamma i en klusterregisterkonfiguration laddar klusterregistret inte ned den uppdaterade avbildningen igen.
- Detta kan leda till att inaktuella eller inkonsekventa bilder körs.
- Använd i stället alltid oföränderliga taggar som
:1.4.2 - Se till att varje bygge skapar en unik tagg, skriv inte över befintliga taggar.
Dessa metoder hjälper till att förhindra distributionsproblem och förbättra spårningsbarhet, återställningssäkerhet och säkerhetsefterlevnad.
Rekommendationer för sekventiell ordning i nfApplication
Som standard installeras eller uppdateras CNF-program baserat på i vilken ordning de visas i NFDV. För borttagningsåtgärden tas CNF-programmen bort i den angivna omvända ordningen. Om du behöver definiera en specifik ordning för CNF-program som skiljer sig från standardinställningen använder dependsOnProfile du för att definiera en unik sekvens för installation, uppdatering och borttagning.
Så här använder du dependsOnProfile
Du kan använda dependsOnProfile i NFDV för att styra sekvensen av Helm-körningar för CNF-program. I exemplet som följer:
- Under en installationsåtgärd distribueras CNF-programmen i följande ordning:
dummyApplication1,dummyApplication2,dummyApplication. - Under en uppdateringsåtgärd uppdateras CNF-programmen i följande ordning:
dummyApplication2,dummyApplication1,dummyApplication. - Under en borttagningsåtgärd tas CNF-programmen bort i följande ordning:
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"
}
}
Vanliga fel med dependsOnProfile
Om koden dependsOnProfile som anges i NFDV för närvarande är ogiltig misslyckas NF-åtgärden med ett verifieringsfel. Meddelandet för verifieringsfelet visas i åtgärdsstatusresursen och ser ut ungefär som i följande exempel:
{
"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."
}
}