本实验来自于使用 Helm 管理应用程序和包
在此实验中,将使用 HELM 为测试部署安装一个 AKS 群集。 使用脚本来创建和配置 Azure Kubernetes 服务 (AKS) 群集。
此脚本执行以下配置步骤:
参数 | 描述 |
---|---|
-s | 标识要使用的订阅 ID。 |
-n | 标识用于在此模块的上下文中创建群集的 AKS 群集名称和资源组。 |
–use-acr | 允许脚本配置名为 mslearn-kubernetes-acr 的默认 ACR。 默认值为 false。 |
–install-dot-net | 允许脚本安装 .NET Core SDK。 默认值设置为 false。 |
脚本地址:https://raw.githubusercontent.com/MicrosoftDocs/mslearn-aks/main/infrastructure/setup/setup.sh
#!/bin/bash
# Hi!
# If you're reading this, you're probably interested in what's going on within this script.
# We've provided what we hope are useful comments inline, as well as color-coded relevant
# shell output. We hope it's useful for you, but if you have any questions or suggestions
# please open an issue on https:/github.com/MicrosoftDocs/mslearn-aks.
while [ "$1" != "" ]; do
case $1 in
-s | --subscription) shift
clusterSubs=$1
;;
-n | --name) shift
moduleName=$1
;;
-a | --use-acr) shift
useACR=$1
;;
-i | --install-dot-net) shift
installDotNet=$1
;;
* ) echo "Invalid param: $1"
exit 1
esac
shift
done
if [ -z "$clusterSubs" ]; then
echo "${newline}${errorStyle}ERROR: Subscription is mandatory. Use -s to set it.$clusterSubs.${defaultTextStyle}${newline}"
listSubsCommand="az account list -o table"
$listSubsCommand
echo "${newline}Use one of the ${azCliCommandStyle}SubscriptionId${defaultTextStyle} above to run the command${newline}"
return 1
fi
if [ -z "$moduleName" ]; then
echo "${newline}${errorStyle}ERROR: Cluster name is mandatory. Use -n to set it.${defaultTextStyle}${newline}"
return 1
fi
## Start
cd ~
# dotnet SDK version
declare -x dotnetSdkVersion="3.1.302"
# Module name
if [ -z "$moduleName" ]; then
declare moduleName="mslearn-aks"
fi
# Any other declarations we need
declare -x gitUser="MicrosoftDocs"
declare -x gitBranch="main"
declare initScript=https://raw.githubusercontent.com/$gitUser/mslearn-aks/$gitBranch/infrastructure/setup/init-env.sh
declare suppressAzureResources=false
declare rootLocation=~/clouddrive
declare editorHomeLocation=$rootLocation/mslearn-aks
if [ -d "$rootLocation/mslearn-aks" ]; then
echo "$rootLocation/mslearn-aks/ already exists!"
echo " "
echo "Before running this script, please remove or rename the existing $rootLocation/mslearn-aks/ directory as follows:"
echo "Remove: rm -r $rootLocation/mslearn-aks/"
echo "Rename: mv $rootLocation/mslearn-aks/ ~/clouddrive/new-name-here/"
echo " "
return 1
else
# Backup .bashrc
cp ~/.bashrc ~/.bashrc.bak.$moduleName
if [ -z "$installDotNet" ]; then
declare installDotNet="false"
fi
# Grab and run init-env.sh
. <(wget -q -O - $initScript)
# Download and build
downloadAndBuild
# Set location to ~/clouddrive
cd $editorHomeLocation
# Run mslearn-aks quickstart to deploy to AKS
$editorHomeLocation/infrastructure/deploy/k8s/quickstart.sh --subscription $clusterSubs --resource-group $resourceGroupName -n $moduleName --location westus
# Create ACR resource
if [ -z "$useACR" ]; then
declare useACR="false"
fi
if ! [ -z "$useACR" ] && [ $useACR == true ]; then
$editorHomeLocation/infrastructure/deploy/k8s/create-acr.sh --subscription $clusterSubs --resource-group $resourceGroupName --aks-name $moduleName --acr-name mslearn-aks-acr --location westus
fi
# Display information to use
echo "Azure Container Registry Information"
echo "=================================================================================="
cat ~/clouddrive/mslearn-aks/create-acr-exports.txt
echo "=================================================================================="
echo
echo
echo "Azure Container Kubernetes Cluster Information"
echo "=================================================================================="
cat ~/clouddrive/mslearn-aks/create-aks-exports.txt
echo "=================================================================================="
fi
#Reset variables
declare clusterSubs=""
declare moduleName=""
declare useACR="false"
declare installDotNet="false"
SubscriptionId=$(az account list --query '[0].id' -o tsv)
. <(wget -q -O - https://raw.githubusercontent.com/MicrosoftDocs/mslearn-aks/main/infrastructure/setup/setup.sh ) -s $SubscriptionId -n learn-helm-deploy-aks --use-acr false --install-dot-net false
执行结果
izhao_yiyi@Azure:~$ SubscriptionId=$(az account list --query '[0].id' -o tsv)
izhao_yiyi@Azure:~$ . <(wget -q -O - https://raw.githubusercontent.com/MicrosoftDocs/mslearn-aks/main/infrastructure/setup/setup.sh ) -s $SubscriptionId -n learn-helm-deploy-aks --use-acr false --install-dot-net false
WARNING!!! It appears you aren't currently running in a Microsoft Learn sandbox. Any Azure resources provisioned by this script will result in charges to your Azure subscription.
Using Azure resource group learn-helm-deploy-aks-rg.
Downloading code...
++ wget -q -O - https://raw.githubusercontent.com/MicrosoftDocs/mslearn-aks/main/infrastructure/setup/sparsecheckout.sh
++ bash -s infrastructure/deploy/ modules/learn-helm-deploy-aks/src/
Updating origin
remote: Enumerating objects: 302, done.
remote: Counting objects: 100% (168/168), done.
remote: Compressing objects: 100% (157/157), done.
remote: Total 302 (delta 68), reused 20 (delta 3), pack-reused 134
Receiving objects: 100% (302/302), 381.59 KiB | 838.00 KiB/s, done.
Resolving deltas: 100% (90/90), done.
From https://github.com/MicrosoftDocs/mslearn-aks
* [new branch] main -> origin/main
* [new branch] oct-refresh -> origin/oct-refresh
* [new branch] test -> origin/test
Switching to subscription 14adb214-7b29-422a-ac8a-df2af1e51201...
Switching to subscription 14adb214-7b29-422a-ac8a-df2af1e51201...
Creating resource group learn-helm-deploy-aks-rg in location westus...
> az group create -n learn-helm-deploy-aks-rg -l westus --output none
Creating AKS cluster "learn-helm-deploy-aks" in resource group "learn-helm-deploy-aks-rg" and location "westus"...
> az aks create -n learn-helm-deploy-aks -g learn-helm-deploy-aks-rg --node-count 1 --node-vm-size Standard_B2s --vm-set-type VirtualMachineScaleSets -l westus --enable-managed-identity --generate-ssh-keys -o json
WARNING: The behavior of this command has been altered by the following extension: aks-preview
AKS cluster created.
Getting credentials for AKS...
The behavior of this command has been altered by the following extension: aks-preview
Merged "learn-helm-deploy-aks" as current context in /home/izhao_yiyi/.kube/config
Installing NGINX ingress controller
namespace/nginx-ingress created
serviceaccount/nginx-ingress created
clusterrole.rbac.authorization.k8s.io/nginx-ingress created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress created
secret/default-server-secret created
configmap/nginx-config created
ingressclass.networking.k8s.io/nginx created
deployment.apps/nginx-ingress created
service/nginx-ingress created
Getting load balancer public IP
> az aks list --query "[?name=='learn-helm-deploy-aks'&&resourceGroup=='learn-helm-deploy-aks-rg'].nodeResourceGroup" -o tsv
Waiting for the Load Balancer IP address - Ctrl+C to cancel...
Waiting for the Load Balancer IP address - Ctrl+C to cancel...
Waiting for the Load Balancer IP address - Ctrl+C to cancel...
Assigned IP address: 104.42.158.195
Nginx ingress controller installed.
Azure Container Registry Information
==================================================================================
cat: /home/izhao_yiyi/clouddrive/mslearn-aks/create-acr-exports.txt: No such file or directory
==================================================================================
Azure Container Kubernetes Cluster Information
==================================================================================
export CLUSTER_NAME=learn-helm-deploy-aks
export CLUSTER_SUBS=14adb214-7b29-422a-ac8a-df2af1e51201
export CLUSTER_RG=learn-helm-deploy-aks-rg
export CLUSTER_LOCATION=westus
export CLUSTER_AKSNODERG=MC_learn-helm-deploy-aks-rg_learn-helm-deploy-aks_westus
export CLUSTER_LBIP=104.42.158.195
export LEARN_REGISTRY=learn-aks-registry
==================================================================================
在此实验中,将 Helm 存储库添加到 Helm 客户端,并将 ASP.NET Core 网站安装到 Azure Kubernetes 服务群集。
helm repo add azure-marketplace https://marketplace.azurecr.io/helm/v1/repo
helm repo list
上述命令返回以下输出的结果:
izhao_yiyi@Azure:~/clouddrive/mslearn-aks$ helm repo add azure-marketplace https://marketplace.azurecr.io/helm/v1/repo
"azure-marketplace" has been added to your repositories
izhao_yiyi@Azure:~/clouddrive/mslearn-aks$ helm version
version.BuildInfo{Version:"v3.4.0", GitCommit:"7090a89efc8a18f3d8178bf47d2462450349a004", GitTreeState:"clean", GoVersion:"go1.14.10"}
izhao_yiyi@Azure:~/clouddrive/mslearn-aks$ helm repo ls
NAME URL
azure-marketplace https://marketplace.azurecr.io/helm/v1/repo
helm search repo aspnet
izhao_yiyi@Azure:~/clouddrive/mslearn-aks$ helm search repo aspnet
NAME CHART VERSION APP VERSION DESCRIPTION
azure-marketplace/aspnet-core 2.0.1 3.1.21 ASP.NET Core is an open-source framework create...
helm install aspnet-webapp azure-marketplace/aspnet-core
此命令返回以下输出的结果:
izhao_yiyi@Azure:~/clouddrive/mslearn-aks$ helm install aspnet-webapp azure-marketplace/aspnet-core
NAME: aspnet-webapp
LAST DEPLOYED: Thu Dec 9 14:31:00 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: aspnet-core
CHART VERSION: 2.0.1
APP VERSION: 3.1.21
** Please be patient while the chart is being deployed **
ASP.NET Core can be accessed through the following DNS name from within your cluster:
aspnet-webapp-aspnet-core.default.svc.cluster.local (port )
To access ASP.NET Core from outside the cluster execute the following commands:
1. Get the ASP.NET Core URL by running these commands:
export SERVICE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].port}" services aspnet-webapp-aspnet-core)
kubectl port-forward --namespace default svc/aspnet-webapp-aspnet-core ${SERVICE_PORT}:${SERVICE_PORT} &
echo "http://127.0.0.1:${SERVICE_PORT}"
2. Access ASP.NET Core using the obtained URL.
izhao_yiyi@Azure:~/clouddrive/mslearn-aks$ helm ls
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
aspnet-webapp default 1 2021-12-09 14:31:00.966036159 +0000 UTC deployed aspnet-core-2.0.1 3.1.21
每次对发布进行更改时,修订号version都将递增。
izhao_yiyi@Azure:~/clouddrive/mslearn-aks$ helm get manifest aspnet-webapp
---
# Source: aspnet-core/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: aspnet-webapp-aspnet-core
labels:
app.kubernetes.io/name: aspnet-core
helm.sh/chart: aspnet-core-2.0.1
app.kubernetes.io/instance: aspnet-webapp
app.kubernetes.io/managed-by: Helm
annotations:
---
# Source: aspnet-core/templates/svc.yaml
apiVersion: v1
kind: Service
metadata:
name: aspnet-webapp-aspnet-core
labels:
app.kubernetes.io/name: aspnet-core
helm.sh/chart: aspnet-core-2.0.1
app.kubernetes.io/instance: aspnet-webapp
app.kubernetes.io/managed-by: Helm
annotations:
spec:
type: ClusterIP
ports:
- name: http
port: 80
targetPort: http
nodePort: null
selector:
app.kubernetes.io/name: aspnet-core
app.kubernetes.io/instance: aspnet-webapp
---
# Source: aspnet-core/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: aspnet-webapp-aspnet-core
labels:
app.kubernetes.io/name: aspnet-core
helm.sh/chart: aspnet-core-2.0.1
app.kubernetes.io/instance: aspnet-webapp
app.kubernetes.io/managed-by: Helm
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: aspnet-core
app.kubernetes.io/instance: aspnet-webapp
strategy:
type: RollingUpdate
template:
metadata:
labels:
app.kubernetes.io/name: aspnet-core
helm.sh/chart: aspnet-core-2.0.1
app.kubernetes.io/instance: aspnet-webapp
app.kubernetes.io/managed-by: Helm
spec:
automountServiceAccountToken: true
serviceAccountName: aspnet-webapp-aspnet-core
affinity:
podAffinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchLabels:
app.kubernetes.io/name: aspnet-core
app.kubernetes.io/instance: aspnet-webapp
namespaces:
- "default"
topologyKey: kubernetes.io/hostname
weight: 1
nodeAffinity:
initContainers:
- name: clone-repository
image: marketplace.azurecr.io/bitnami/git:2.33.0-debian-10-r81
imagePullPolicy: "IfNotPresent"
command:
- /bin/bash
- -ec
- |
[[ -f "/opt/bitnami/scripts/git/entrypoint.sh" ]] && source "/opt/bitnami/scripts/git/entrypoint.sh"
git clone https://github.com/dotnet/AspNetCore.Docs.git --branch main /repo
volumeMounts:
- name: repo
mountPath: /repo
- name: dotnet-publish
image: marketplace.azurecr.io/bitnami/dotnet-sdk:3.1.414-debian-10-r26
imagePullPolicy: "IfNotPresent"
workingDir: /repo
command:
- /bin/bash
- -ec
- |
cd aspnetcore/fundamentals/servers/kestrel/samples/3.x/KestrelSample
dotnet publish -o /app
volumeMounts:
- name: app
mountPath: /app
- name: repo
mountPath: /repo
containers:
- name: aspnet-core
image: marketplace.azurecr.io/bitnami/aspnet-core:3.1.21-debian-10-r0
imagePullPolicy: "IfNotPresent"
workingDir: /app
command:
- dotnet
- KestrelSample.dll
env:
- name: ASPNETCORE_URLS
value: "http://+:8080"
ports:
- name: http
containerPort: 8080
livenessProbe:
tcpSocket:
port: http
initialDelaySeconds: 10
periodSeconds: 20
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 6
readinessProbe:
tcpSocket:
port: http
initialDelaySeconds: 10
periodSeconds: 20
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 6
resources:
limits: {}
requests: {}
volumeMounts:
- name: app
mountPath: /app
volumes:
- name: app
emptyDir: {}
- name: repo
emptyDir: {}
chart的 templates 文件夹中有三个 YAML 文件。
这些文件是根据chart的可用模板和 values.yaml 文件中可用的值的组合呈现的。
izhao_yiyi@Azure:~/clouddrive/mslearn-aks$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/aspnet-webapp-aspnet-core-676b9cfdd-xm2ss 1/1 Running 0 3m22s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/aspnet-webapp-aspnet-core ClusterIP 10.0.116.227 <none> 80/TCP 3m23s
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 12m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/aspnet-webapp-aspnet-core 1/1 1 1 3m23s
NAME DESIRED CURRENT READY AGE
replicaset.apps/aspnet-webapp-aspnet-core-676b9cfdd 1 1 1 3m23s
izhao_yiyi@Azure:~/clouddrive/mslearn-aks$ helm delete aspnet-webapp
release "aspnet-webapp" uninstalled
现在,使用 --set 参数的情况下运行 helm install,将部署模板的 replicaCount 设置为五个副本。
izhao_yiyi@Azure:~/clouddrive/mslearn-aks$ helm install --set replicaCount=5 aspnet-webapp azure-marketplace/aspnet-core
NAME: aspnet-webapp
LAST DEPLOYED: Thu Dec 9 14:39:09 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: aspnet-core
CHART VERSION: 2.0.1
APP VERSION: 3.1.21
** Please be patient while the chart is being deployed **
ASP.NET Core can be accessed through the following DNS name from within your cluster:
aspnet-webapp-aspnet-core.default.svc.cluster.local (port )
To access ASP.NET Core from outside the cluster execute the following commands:
1. Get the ASP.NET Core URL by running these commands:
export SERVICE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].port}" services aspnet-webapp-aspnet-core)
kubectl port-forward --namespace default svc/aspnet-webapp-aspnet-core ${SERVICE_PORT}:${SERVICE_PORT} &
echo "http://127.0.0.1:${SERVICE_PORT}"
2. Access ASP.NET Core using the obtained URL.
通过运行 kubectl get pods 命令验证
izhao_yiyi@Azure:~/clouddrive/mslearn-aks$ kubectl get po
NAME READY STATUS RESTARTS AGE
aspnet-webapp-aspnet-core-676b9cfdd-7542j 1/1 Running 0 4m11s
aspnet-webapp-aspnet-core-676b9cfdd-bxf9w 1/1 Running 0 4m11s
aspnet-webapp-aspnet-core-676b9cfdd-cm79p 1/1 Running 0 4m11s
aspnet-webapp-aspnet-core-676b9cfdd-pjgl7 1/1 Running 0 4m11s
aspnet-webapp-aspnet-core-676b9cfdd-qg8nd 1/1 Running 0 4m11s
2.使用 helm delete 命令删除 Helm chart。 此命令将删除工作负荷的发布和所有副本。
izhao_yiyi@Azure:~/clouddrive/mslearn-aks$ helm delete aspnet-webapp
release "aspnet-webapp" uninstalled
在此练习中,自定义现有的 Helm chart来安装、升级、回滚和删除 Helm 发布。
之前从 Azure 市场安装的 aspnet-core Helm chart作为基础来安装 .NET Core Blazor Server 应用。 在 AKS 群集创建中已下载了应用程序的源代码,这些源代码位于 ~clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src/drone-webapp 文件夹中。
izhao_yiyi@Azure:~/clouddrive/mslearn-aks$ ls $HOME/.cache/helm/repository -l
total 5096
-rw-r--r-- 1 izhao_yiyi izhao_yiyi 32351 Dec 9 14:39 aspnet-core-2.0.1.tgz
-rw-r--r-- 1 izhao_yiyi izhao_yiyi 1440 Dec 9 14:28 azure-marketplace-charts.txt
-rw-r--r-- 1 izhao_yiyi izhao_yiyi 5181359 Dec 9 14:28 azure-marketplace-index.yaml
从存储库安装的所有 Helm chart都缓存在此文件夹中。
izhao_yiyi@Azure:~/clouddrive/mslearn-aks$ cd ~/clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src
izhao_yiyi@Azure:~/clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src$ find drone-webapp-chart/ -print
drone-webapp-chart/
drone-webapp-chart/.helmignore
drone-webapp-chart/Chart.yaml
drone-webapp-chart/templates
drone-webapp-chart/templates/deployment.yaml
drone-webapp-chart/templates/extra-list.yaml
drone-webapp-chart/templates/health-ingress.yaml
drone-webapp-chart/templates/hpa.yaml
drone-webapp-chart/templates/ingress.yaml
drone-webapp-chart/templates/NOTES.txt
drone-webapp-chart/templates/pdb.yaml
drone-webapp-chart/templates/service.yaml
drone-webapp-chart/templates/serviceaccount.yaml
drone-webapp-chart/templates/tls-secret.yaml
drone-webapp-chart/templates/_helpers.tpl
drone-webapp-chart/values.yaml
以下组件为核心:
apiVersion: v2
appVersion: 0.0.1
description: ASP.NET Core is an open-source framework created by Microsoft for building
cloud-enabled, modern applications.
home: https://dotnet.microsoft.com/apps/aspnet
icon: https://bitnami.com/assets/stacks/aspnet-core/img/aspnet-core-stack-220x234.png
keywords:
- asp.net
- dotnet
maintainers:
- email: [email protected]
- name: Bitnami
name: drone-tracker
sources:
- https://github.com/bitnami/bitnami-docker-aspnet-core
annotations:
category: DeveloperTools
version: 1.3.21
dependencies:
- name: common
version: 1.10.3
repository: https://marketplace.azurecr.io/helm/v1/repo
tags:
- bitnami-common
izhao_yiyi@Azure:~/clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src$ helm dependency build ./drone-webapp-chart
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "azure-marketplace" chart repository
Update Complete. ⎈Happy Helming!⎈
Saving 1 charts
Downloading common from repo https://marketplace.azurecr.io/helm/v1/repo
Deleting outdated charts
izhao_yiyi@Azure:~/clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src$ find drone-webapp-chart/ -print
drone-webapp-chart/
drone-webapp-chart/.helmignore
drone-webapp-chart/Chart.lock
drone-webapp-chart/Chart.yaml
drone-webapp-chart/charts
drone-webapp-chart/charts/common-1.10.3.tgz
drone-webapp-chart/templates
drone-webapp-chart/templates/deployment.yaml
drone-webapp-chart/templates/extra-list.yaml
drone-webapp-chart/templates/health-ingress.yaml
drone-webapp-chart/templates/hpa.yaml
drone-webapp-chart/templates/ingress.yaml
drone-webapp-chart/templates/NOTES.txt
drone-webapp-chart/templates/pdb.yaml
drone-webapp-chart/templates/service.yaml
drone-webapp-chart/templates/serviceaccount.yaml
drone-webapp-chart/templates/tls-secret.yaml
drone-webapp-chart/templates/_helpers.tpl
drone-webapp-chart/values.yaml
现在,charts/ 文件夹中有一个名为 common 的已更新子chart。 可以提取 common-1.10.3.tgz 包的内容
aspnet-core Helm chart具有一组广泛的配置选项,可用于管理云原生 Web 应用的总体部署。 查看 values.yaml 的内容以获取部署概述非常有用。
在 Cloud Shell 编辑器中打开 values.yaml。
vim ./drone-webapp-chart/values.yaml
此文件中有许多需要关注的点。 这里查看两个节以及它们如何影响最终的已部署应用。
搜索 image 值以查看哪个图像用于 Web 应用。
...
image:
registry: docker.io
repository: bitnami/aspnet-core
tag: 3.1.21-debian-10-r0
pullPolicy: IfNotPresent
...
注意 bitnami/aspnet-core Docker 映像。 此映像是应用的基础映像,包含 ASP.NET Core 安装。
搜索 appFromExternalRepo 值。 将使用这些值生成 deployment.yaml 清单文件。
appFromExternalRepo:
enabled: true
clone:
image:
registry: docker.io
repository: bitnami/git
tag: 2.33.0-debian-10-r28
pullPolicy: IfNotPresent
pullSecrets: []
repository: https://github.com/MicrosoftDocs/mslearn-aks.git
revision: main
extraVolumeMounts: []
publish:
image:
registry: docker.io
repository: bitnami/dotnet-sdk
tag: 3.1.412-debian-10-r33
pullPolicy: IfNotPresent
pullSecrets: []
subFolder: modules/learn-helm-deploy-aks/src/drone-webapp
extraFlags: []
startCommand: ["dotnet", "drone-webapp.dll"]
此节指定了要注意的几个项。
bitnami/git 映像
bitnami/dotnet-sdk 映像
GitHub 存储库 https://github.com/MicrosoftDocs/mslearn-aks.git
应用源代码存储库子文件夹 modules/learn-helm-deploy-aks/src/drone-webapp
这些值中的每一个都在 templates/deployment.yaml 文件中使用。
接下来,在 values.yaml 文件中搜索 ingress 值。 使用这些值生成 ingress.yaml 清单文件。
ingress:
enabled: true
pathType: ImplementationSpecific
hostname: aspnet-core.local
path: /
annotations: {}
tls: false
secrets: []
此允许你配置最终入口文件的许多方面。 对于本实验,只需使用 ingress.enabled 值。
values.yaml 文件中的值与chart的 templates/ 文件夹中的模板结合使用,以创建最终的清单文件。
vim ./drone-webapp-chart/templates/deployment.yaml
apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }}
kind: Deployment
metadata:
...
spec:
replicas: {{ .Values.replicaCount }}
...
initContainers:
{{- if .Values.appFromExternalRepo.enabled }}
- name: clone-repository
image: {{ include "aspnet-core.git.image" . }}
imagePullPolicy: {{ .Values.appFromExternalRepo.clone.image.pullPolicy | quote }}
command:
- /bin/bash
- -ec
- |
[[ -f "/opt/bitnami/scripts/git/entrypoint.sh" ]] && source "/opt/bitnami/scripts/git/entrypoint.sh"
git clone {{ .Values.appFromExternalRepo.clone.repository }} --branch {{ .Values.appFromExternalRepo.clone.revision }} /repo
volumeMounts:
- name: repo
mountPath: /repo
- name: dotnet-publish
image: {{ include "aspnet-core.sdk.image" . }}
imagePullPolicy: {{ .Values.appFromExternalRepo.publish.image.pullPolicy | quote }}
workingDir: /repo
command:
- /bin/bash
- -ec
- |
cd {{ .Values.appFromExternalRepo.publish.subFolder }}
dotnet publish -o /app {{ .Values.appFromExternalRepo.publish.extraFlags | join " " }}
volumeMounts:
- name: app
mountPath: /app
- name: repo
mountPath: /repo
{{- end }}
{{- if .Values.initContainers }}
{{- include "common.tplvalues.render" (dict "value" .Values.initContainers "context" $) | nindent 8 }}
{{- end }}
{{- end }}
...
注意,此文件具有部署清单的结构,但最终哪些信息进入文件取决于 values.yaml 文件中的值和模板控制流逻辑。
例如,此部署的 spec.replicas 是由 {{ .Values.replicaCount }} 定义的,容器如何初始化取决于 {{- if .Values.appFromExternalRepo.enabled }} 语句中的 .Values.appFromExternalRepo.enabled 值。
然后,本节的其余部分会使用 Git 映像和存储库值来克隆存储库并构建 Web 应用。
vim ./drone-webapp-chart/templates/ingress.yaml
{{- if .Values.ingress.enabled -}}
apiVersion: {{ include "common.capabilities.ingress.apiVersion" . }}
kind: Ingress
metadata:
name: {{ include "aspnet-core.fullname" . }}
labels: {{- include "common.labels.standard" . | nindent 4 }}
...
annotations:
...
spec:
...
{{- end }}
注意入口清单如何依赖于 {{- if .Values.ingress.enabled -}} 语句。
现在可以部署 Web 应用了。
izhao_yiyi@Azure:~/clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src$ helm install drone-webapp ./drone-webapp-chart
NAME: drone-webapp
LAST DEPLOYED: Thu Dec 9 14:59:26 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **
ASP.NET Core can be accessed through the following DNS name from within your cluster:
drone-webapp-aspnet-core.default.svc.cluster.local (port 80)
To access ASP.NET Core from outside the cluster execute the following commands:
1. Get the ASP.NET Core URL and associate its hostname to your cluster external IP:
export CLUSTER_IP=$(minikube ip) # On Minikube. Use: `kubectl cluster-info` on others K8s clusters
echo "ASP.NET Core URL: http://aspnet-core.local"
echo "$CLUSTER_IP aspnet-core.local" | sudo tee -a /etc/hosts
2. Access ASP.NET Core using the obtained URL.
查看安装过程
izhao_yiyi@Azure:~/clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src$ kubectl get po -w
NAME READY STATUS RESTARTS AGE
drone-webapp-aspnet-core-54894f544b-7j72z 0/1 Init:0/2 0 13s
drone-webapp-aspnet-core-54894f544b-7j72z 0/1 Init:ErrImagePull 0 72s
drone-webapp-aspnet-core-54894f544b-7j72z 0/1 Init:ImagePullBackOff 0 84s
drone-webapp-aspnet-core-54894f544b-7j72z 0/1 Init:0/2 0 94s
drone-webapp-aspnet-core-54894f544b-7j72z 0/1 Init:1/2 0 95s
drone-webapp-aspnet-core-54894f544b-7j72z 0/1 Init:1/2 0 2m20s
drone-webapp-aspnet-core-54894f544b-7j72z 0/1 PodInitializing 0 2m28s
drone-webapp-aspnet-core-54894f544b-7j72z 0/1 Running 0 3m6s
izhao_yiyi@Azure:~/clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src$ kubectl get po
NAME READY STATUS RESTARTS AGE
drone-webapp-aspnet-core-54894f544b-7j72z 1/1 Running 0 3m25s
izhao_yiyi@Azure:~/clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src$ cat ~/clouddrive/mslearn-aks/create-aks-exports.txt
export CLUSTER_NAME=learn-helm-deploy-aks
export CLUSTER_SUBS=14adb214-7b29-422a-ac8a-df2af1e51201
export CLUSTER_RG=learn-helm-deploy-aks-rg
export CLUSTER_LOCATION=westus
export CLUSTER_AKSNODERG=MC_learn-helm-deploy-aks-rg_learn-helm-deploy-aks_westus
export CLUSTER_LBIP=104.42.158.195
export LEARN_REGISTRY=learn-aks-registry
如果开发团队更新了 Web 应用的源代码。 若要部署新版本,需使用 helm upgrade 命令来创建对应用的最新更改的增量。
izhao_yiyi@Azure:~/clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src$ helm ls
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
drone-webapp default 1 2021-12-09 14:59:26.723136514 +0000 UTC deployed aspnet-core-1.3.18 0.0.1
izhao_yiyi@Azure:~/clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src$ helm history drone-webapp
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Thu Dec 9 14:59:26 2021 deployed aspnet-core-1.3.18 0.0.1 Install complete
izhao_yiyi@Azure:~/clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src$ helm upgrade drone-webapp ./drone-webapp-chart
Release "drone-webapp" has been upgraded. Happy Helming!
NAME: drone-webapp
LAST DEPLOYED: Thu Dec 9 15:08:18 2021
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **
ASP.NET Core can be accessed through the following DNS name from within your cluster:
drone-webapp-aspnet-core.default.svc.cluster.local (port 80)
To access ASP.NET Core from outside the cluster execute the following commands:
1. Get the ASP.NET Core URL and associate its hostname to your cluster external IP:
export CLUSTER_IP=$(minikube ip) # On Minikube. Use: `kubectl cluster-info` on others K8s clusters
echo "ASP.NET Core URL: http://aspnet-core.local"
echo "$CLUSTER_IP aspnet-core.local" | sudo tee -a /etc/hosts
2. Access ASP.NET Core using the obtained URL.
izhao_yiyi@Azure:~/clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src$ helm history drone-webapp
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Thu Dec 9 14:59:26 2021 superseded aspnet-core-1.3.18 0.0.1 Install complete
2 Thu Dec 9 15:08:18 2021 deployed aspnet-core-1.3.18 0.0.2 Upgrade complete
假设升级发布后,许多客户报告了关于网站的错误。 团队要求将发布回滚到应用的早期稳定版本。
izhao_yiyi@Azure:~/clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src$ helm rollback drone-webapp 1
Rollback was a success! Happy Helming!
izhao_yiyi@Azure:~/clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src$ helm history drone-webapp
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Thu Dec 9 14:59:26 2021 superseded aspnet-core-1.3.18 0.0.1 Install complete
2 Thu Dec 9 15:08:18 2021 superseded aspnet-core-1.3.18 0.0.2 Upgrade complete
3 Thu Dec 9 15:08:50 2021 deployed aspnet-core-1.3.18 0.0.1 Rollback to 1
注意,列表中的最后一项显示以下信息:
递增的修订号
回滚发布的应用版本号
回滚发布修订号的说明
通过运行以下命令来删除所做的任何更改:
cd ~ && \
rm -rf ~/clouddrive/mslearn-aks && \
az group delete --name learn-helm-deploy-aks-rg --yes
SubscriptionId=$(az account list --query '[0].id' -o tsv)
. <(wget -q -O - <https://raw.githubusercontent.com/MicrosoftDocs/mslearn-aks/main/infrastructure/setup/setup.sh> ) -s $SubscriptionId -n learn-helm-deploy-aks --use-acr false --install-dot-net false
helm repo add azure-marketplace https://marketplace.azurecr.io/helm/v1/repo
helm repo list
helm search repo aspnet
helm install aspnet-webapp azure-marketplace/aspnet-core
helm list
helm get manifest aspnet-webapp
kubectl get pods -o wide -w
helm delete aspnet-webapp
helm install --set replicaCount=5 aspnet-webapp azure-marketplace/aspnet-core
ls $HOME/.cache/helm/repository -l
cd ~/clouddrive/mslearn-aks/modules/learn-helm-deploy-aks/src
find drone-webapp-chart/ -print
vim drone-webapp-chart/Chart.yaml
helm dependency build ./drone-webapp-chart
find drone-webapp-chart/ -print
gzip -dc ./drone-webapp-chart/charts/common-1.10.3.tgz | tar -xf - -C ./drone-webapp-chart/charts/
find drone-webapp-chart/ -print
cat ~/clouddrive/mslearn-aks/create-aks-exports.txt
helm history drone-webapp
helm upgrade drone-webapp ./drone-webapp-chart
helm rollback drone-webapp 1
cd ~ && \
rm -rf ~/clouddrive/mslearn-aks && \
az group delete --name learn-helm-deploy-aks-rg --yes