Rychlý start: Dokončení požadavků pro nasazení kontejnerizované síťové funkce v Azure Operator Service Manageru
V tomto rychlém startu dokončíte úlohy potřebné před použitím Azure Operator Service Manageru (AOSM).
Předpoklady
Obraťte se na tým účtu Microsoft a zaregistrujte své předplatné Azure pro přístup k Azure Operator Service Manageru (AOSM) nebo vyjádřit svůj zájem prostřednictvím registračního formuláře partnera.
Stažení a instalace Azure CLI
Použijte prostředí Bash v Azure Cloud Shellu. Další informace najdete v tématu Spuštění Cloud Shellu pro použití prostředí Bash v Azure Cloud Shellu.
Pro uživatele, kteří dávají přednost místnímu spouštění referenčních příkazů rozhraní příkazového řádku, se dozvíte, jak nainstalovat Azure CLI.
Pokud používáte Windows nebo macOS, zvažte spuštění Azure CLI v kontejneru Dockeru. Další informace najdete v tématu Jak spustit Azure CLI v kontejneru Dockeru.
Pokud používáte místní instalaci, přihlaste se k Azure CLI pomocí az login
příkazu a dokončete výzvy zobrazené v terminálu a dokončete ověřování. Další možnosti přihlášení najdete v tématu Přihlášení pomocí Azure CLI.
Instalace rozšíření rozhraní příkazového řádku Azure Operator Service Manageru (AOSM)
Pomocí následujícího příkazu nainstalujte rozšíření Rozhraní příkazového řádku Azure Operator Service Manageru (AOSM):
az extension add --name aosm
- Spuštěním zobrazíte
az version
nainstalované verze a závislé knihovny. - Spusťte
az upgrade
upgrade na aktuální verzi Azure CLI.
Registrace a ověření požadovaných poskytovatelů prostředků
Než začnete používat Azure Operator Service Manager, spusťte následující příkazy, které zaregistrují požadovaného poskytovatele prostředků. Tento proces registrace může trvat až 5 minut.
# Register Resource Provider
az provider register --namespace Microsoft.HybridNetwork
az provider register --namespace Microsoft.ContainerRegistry
Ověřte stav registrace poskytovatelů prostředků. Spusťte následující příkazy.
# Query the Resource Provider
az provider show -n Microsoft.HybridNetwork --query "{RegistrationState: registrationState, ProviderName: namespace}"
az provider show -n Microsoft.ContainerRegistry --query "{RegistrationState: registrationState, ProviderName: namespace}"
Poznámka:
Dokončení registrace poskytovatele prostředků může trvat několik minut. Po úspěšném dokončení registrace můžete pokračovat pomocí Azure Operator Service Manageru (AOSM).
Požadavky na kontejnerizovanou síťovou funkci (CNF)
Pro ty, kteří využívají kontejnerizované síťové funkce, je nezbytné zajistit, aby se na počítači, ze kterého spouštíte rozhraní příkazového řádku, nainstalovaly následující balíčky:
- Nainstalujte docker, přečtěte si informace o instalaci modulu Docker.
- Nainstalujte Helm, přečtěte si informace o instalaci Rozhraní příkazového řádku Helm.
Konfigurace nasazení containerizované síťové funkce (CNF)
Pro nasazení containerizovaných síťových funkcí (CNF) je důležité mít na počítači, ze kterého spouštíte rozhraní příkazového řádku, uložená následující data:
Balíčky Helm se schématem – Tyto balíčky by se měly nacházet v místním úložišti a odkazovat na ho v rámci konfiguračního
input.json
souboru. Po provedení tohoto rychlého startu stáhnete požadovaný balíček Helm.Vytvoření ukázkového konfiguračního souboru – Vygenerujte ukázkový konfigurační soubor pro definování nasazení CNF. Tento příkaz vygenerujte
input.json
soubor, který potřebujete naplnit konkrétní konfigurací.az aosm nfd generate-config --definition-type cnf
Obrázky pro CNF – Tady jsou možnosti:
- Odkaz na existující službu Azure Container Registry, která obsahuje image pro váš CNF. V současné době se pro CNF podporuje pouze jeden obor názvů ACR a obor názvů. Image, které se mají zkopírovat z této služby ACR, se vyplní automaticky na základě schématu balíčku Helm. K této službě ACR musíte mít oprávnění Čtenář/AcrPull. Pokud chcete tuto možnost použít, vyplňte
source_registry
a volitelněsource_registry_namespace
do souboru input.json. - Název image zdrojové image Dockeru z místního počítače. Tento název image je určený pro omezený případ použití, kdy CNF vyžaduje pouze jednu image Dockeru, která existuje v místním úložišti Dockeru. Pokud chcete tuto možnost použít, vyplňte
source_local_docker_image
soubor input.json. Vyžaduje instalaci Dockeru. Tento rychlý start vás provede stažením image dockeru nginx, která se má použít pro tuto možnost.
- Odkaz na existující službu Azure Container Registry, která obsahuje image pro váš CNF. V současné době se pro CNF podporuje pouze jeden obor názvů ACR a obor názvů. Image, které se mají zkopírovat z této služby ACR, se vyplní automaticky na základě schématu balíčku Helm. K této službě ACR musíte mít oprávnění Čtenář/AcrPull. Pokud chcete tuto možnost použít, vyplňte
Volitelné: Soubor mapování (path_to_mappings): Volitelně můžete zadat soubor (na disku) s názvem path_to_mappings. Tento soubor by měl zrcadlit
values.yaml
s vybranými hodnotami nahrazenými parametry nasazení. Tím je zpřístupníte jako parametry CNF. Nebo můžete nechat toto pole prázdnéinput.json
a rozhraní příkazového řádku vygeneruje soubor. V tomto případě se každá hodnota vvalues.yaml
tomto případě zobrazí jako parametr nasazení. Případně můžete použít argument rozhraní příkazového--interactive
řádku k interaktivnímu výběru. Tento rychlý start vás provede vytvořením tohoto souboru.
Při konfiguraci input.json
souboru se ujistěte, že vypíšete balíčky Helm v pořadí, v jakém se mají nasadit. Pokud například musí být balíček "A" nasazen před balíčkem "B" input.json
, měla by vypadat nějak takto:
"helm_packages": [
{
"name": "A",
"path_to_chart": "Path to package A",
"path_to_mappings": "Path to package A mappings",
"depends_on": [
"Names of the Helm packages this package depends on"
]
},
{
"name": "B",
"path_to_chart": "Path to package B",
"path_to_mappings": "Path to package B mappings",
"depends_on": [
"Names of the Helm packages this package depends on"
]
}
]
Podle těchto pokynů zajistíte dobře uspořádaný a strukturovaný přístup k nasazení containerizovaných síťových funkcí (CNF) s balíčky Helm a přidruženými konfiguracemi.
Stažení image nginx do místního úložiště Dockeru
Pro účely tohoto rychlého startu stáhnete image dockeru nginx do místního úložiště. Rozšíření Azure CLI pro operátora Azure (AOSM) nasdílí image z něj do ACR úložiště artefaktů Azure Operator Service Manageru (AOSM). Rozšíření rozhraní příkazového řádku také podporuje kopírování image z existující služby ACR. Kopírování image je očekávaným výchozím případem použití, ale rychlé zprovoznění je pomalejší, když chcete vytvořit ACR pro kopírování, aby se tato metoda zde nepoužívala.
Zadejte následující příkaz: docker pull nginx:stable
Stažení ukázkového chartu Helm
Stáhněte si z tohoto příkladu ukázkový chart Helm pro použití s tímto rychlým startem.
Ponořte se do chartů Helm
Tato část vás seznámí se základním grafem Helm, který nastaví nginx a nakonfiguruje ho tak, aby naslouchal na zadaném portu. Chart Helm zařízený v této části už obsahuje values.schema.json
soubor.
Ukázkový soubor values.schema.json
{
"$schema": "http://json-schema.org/draft-07/schema",
"additionalProperties": true,
"properties": {
"affinity": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"fullnameOverride": {
"type": "string"
},
"image": {
"additionalProperties": false,
"properties": {
"pullPolicy": {
"type": "string"
},
"repository": {
"type": "string"
},
"tag": {
"type": "string"
}
},
"type": "object"
},
"imagePullSecrets": {
"items": {
"anyOf": []
},
"type": "array"
},
"ingress": {
"additionalProperties": false,
"properties": {
"annotations": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"enabled": {
"type": "boolean"
},
"hosts": {
"items": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"host": {
"type": "string"
},
"paths": {
"items": {
"anyOf": []
},
"type": "array"
}
},
"type": "object"
}
]
},
"type": "array"
},
"tls": {
"items": {
"anyOf": []
},
"type": "array"
}
},
"type": "object"
},
"nameOverride": {
"type": "string"
},
"nodeSelector": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"podSecurityContext": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"replicaCount": {
"type": "integer"
},
"resources": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"securityContext": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"service": {
"additionalProperties": false,
"properties": {
"port": {
"type": "integer"
},
"type": {
"type": "string"
}
},
"type": "object"
},
"serviceAccount": {
"additionalProperties": false,
"properties": {
"create": {
"type": "boolean"
},
"name": {
"type": "null"
}
},
"type": "object"
},
"tolerations": {
"items": {
"anyOf": []
},
"type": "array"
}
},
"type": "object"
}
I když se tento článek nezabývá do složitých prvků Helmu, několik prvků, které stojí za zvýraznění, patří:
- Konfigurace portu služby: Má
values.yaml
přednastavený port služby 80.
Ukázkový soubor values.yaml
# Default values for nginxdemo.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
# Repository gets overwritten by AOSM to the Artifact Store ACR, however we've hard-coded the image name and tag in deployment.yaml
repository: overwriteme
tag: stable
pullPolicy: IfNotPresent
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
serviceAccount:
# Specifies whether a service account should be created
create: false
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name:
podSecurityContext:
{}
# fsGroup: 2000
securityContext:
{}
# capabilities:
# drop:
# - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000
service:
type: ClusterIP
port: 80
ingress:
enabled: false
annotations:
{}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- host: chart-example.local
paths: []
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local
resources:
{}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
nodeSelector: {}
tolerations: []
affinity: {}
Odkazy na porty: Tento port najde své použití v několika umístěních:
- Uvnitř
service.yaml
jako{{ Values.service.port }}
- Uvnitř
Ukázkový soubor service.yaml
apiVersion: v1
kind: Service
metadata:
name: {{ include "nginxdemo.fullname" . }}
labels:
{{ include "nginxdemo.labels" . | indent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
app.kubernetes.io/name: {{ include "nginxdemo.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
- Reprezentováno
nginx_config_map.yaml
jako{{ Values.service.port }}
. Tento soubor odpovídá/etc/nginx/conf.d/default.conf
, s mapováním vytvořeným pomocí konfigurační mapy vdeployment.yaml
souboru .
Ukázkový soubor nginx_config_map.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
# This writes the nginx config file to the ConfigMap and deployment.yaml mounts it as a volume
# to the right place.
data:
default.conf: |
log_format client '$remote_addr - $remote_user $request_time $upstream_response_time '
'[$time_local] "$request" $status $body_bytes_sent $request_body "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
listen 80;
listen {{ .Values.service.port }};
listen [::]:80;
server_name localhost;
access_log /var/log/nginx/host.access.log client;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
error_page 405 =200 $uri;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location = /cnf/test {
error_page 405 =200 $uri;
}
location = /post_thing {
# turn off logging here to avoid double logging
access_log off;
error_page 405 =200 $uri;
}
}
Konfigurace nasazení: Soubor deployment.yaml
předvádí konkrétní řádky, které imagePullSecrets
se týkají a image
. Nezapomeňte sledovat jejich strukturovaný formát, protože Azure Operator Service Manager (AOSM) poskytuje potřebné hodnoty pro tato pole během nasazování. Další informace najdete v tématu Požadavky na balíček Helm.
Ukázkový soubor deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "nginxdemo.fullname" . }}
labels:
{{ include "nginxdemo.labels" . | indent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app.kubernetes.io/name: {{ include "nginxdemo.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
template:
metadata:
labels:
app.kubernetes.io/name: {{ include "nginxdemo.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
spec:
# Copied from sas
imagePullSecrets: {{ mustToPrettyJson (ternary (list ) .Values.imagePullSecrets (kindIs "invalid" .Values.imagePullSecrets)) }}
serviceAccountName: {{ template "nginxdemo.serviceAccountName" . }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
# Want this to evaluate to acr-name.azurecr.io/nginx:stable (or specific version)
# docker tag nginx:stable acr-name.azurecr.io/nginx:stable
# docker push acr-name.azurecr.io/nginx:stable
# Image hard coded to that put in the Artifact Store ACR for this CNF POC
image: "{{ .Values.image.repository }}/nginx:stable"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
{{- toYaml .Values.resources | nindent 12 }}
# Gets the nginx config from the configMap - see nginx_config_map.yaml
volumeMounts:
- name: nginx-config-volume
mountPath: /etc/nginx/conf.d/default.conf
subPath: default.conf
volumes:
- name: nginx-config-volume
configMap:
name: nginx-config
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}