演示资源已提交:k8s-helm-tpl - Repos (azure.com)
目录
前言
Enable Ingress
1. 更新values.yaml和ingress.yaml
2. Helm Upgrade
3. SwitchHosts 访问
Helm Template YAML
Chart.yaml
values.yaml
_helpers.tpl
NOTES.txt
书接上文,我们毫不夸张的演示了如何使用HelmTemplate 将一个新建的Blazor Server项目3分钟打包成Helm Chart并部署至k8s
但并没有介绍helm template的具体细节,接下来我们为部署到Cluster的service开启ingress,并且看下helm template自动生成的YAML文件是如何工作的。
!首先需要确保你的cluster有可用的 ingress-nginx
Enable Ingress Commit 95e27417: Enable ingress - Repos (azure.com)
简单修改下values.yaml和ingress.yaml 即可:
了解过Blazor Server 的朋友知道,它是在服务端使用对象状态图来记录页面状态,并根据传来的页面事件更新状态图,之后将变化部分通过SignalR推送至浏览器渲染响应。
因此这里根据官方文档Blazor Server Kubernetes Deploy添加部分 annotations,以实现粘性会话。
至此,一个Helm Chart所需的内容我们已基本实现。接下来,我们回头看下Helm Template为我们生成的文件都有什么作用。
在Helm Template 使用一套简单易懂的语法规则,我们可以用来定义变量并引用;也可以通过.Values.xxx 来访问values.yaml中提供的配置参数;还可以使用range等关键字来访问一个数组变量等等。
Helm Template同样会生成deployment.yaml, ingress.yaml等常规文件,但其中只有少量的直接定义,大多配置项定义在了以下几个yaml里,并通过特定的语法规则进行引用。
Chart.yaml包含了对Helm Chart的定义,例如chart name,description,version等。
apiVersion: v2
name: helm-tpl-test-blazor-demo
description: A balzor demo helm chart for Kubernetes
# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 1.0.1
# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
appVersion: 1.0.1
Helm Template会为我们自动生成deployment,ingress,serviceaccount等模板,values.yaml中为它们所需要的配置参数提供统一的定义入口。
例如我们前面演示用到的,image,imagePullSecrets,ingress configuration等等。
我们也可以在其中定义一些deployment.yaml所需要的内容,以便创建或覆盖程序运行所需要的环境变量。
# Default values for helm-tpl-test-blazor-demo.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 2
image:
repository: docker.io/phone8848/blazor-demo
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: "v1"
imagePullSecrets:
- name: phone8848-auth
nameOverride: ""
fullnameOverride: ""
serviceAccount:
# Specifies whether a service account should be created
create: true
# Annotations to add to the service account
annotations: {}
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name: ""
podAnnotations: {}
podSecurityContext: {}
# fsGroup: 2000
service:
type: ClusterIP
port: 80
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "affinity"
nginx.ingress.kubernetes.io/session-cookie-expires: "14400"
nginx.ingress.kubernetes.io/session-cookie-max-age: "14400"
hosts:
- host: k8s-helm-tpl-test.local
paths:
- /
tls:
- secretName: helm-demo-tls
hosts:
- k8s-helm-tpl-test.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
_helpers.tpl 主要用来定义各种name,deployment name, ingress name, labels name等等。
{{/* vim: set filetype=mustache: */}}
{{/*
Expand the name of the chart.
*/}}
{{- define "helm-tpl-test-blazor-demo.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "helm-tpl-test-blazor-demo.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "helm-tpl-test-blazor-demo.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "helm-tpl-test-blazor-demo.labels" -}}
helm.sh/chart: {{ include "helm-tpl-test-blazor-demo.chart" . }}
{{ include "helm-tpl-test-blazor-demo.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "helm-tpl-test-blazor-demo.selectorLabels" -}}
app.kubernetes.io/name: {{ include "helm-tpl-test-blazor-demo.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Create the name of the service account to use
*/}}
{{- define "helm-tpl-test-blazor-demo.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "helm-tpl-test-blazor-demo.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
{{- end }}
也不要小瞧这个文件哦,每次我们helm install或者helm upgrade成功之后提示的Notes就来自于它。
1. Get the application URL by running these commands:
{{- if .Values.ingress.enabled }}
{{- range $host := .Values.ingress.hosts }}
{{- range .paths }}
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}
{{- end }}
{{- end }}
{{- else if contains "NodePort" .Values.service.type }}
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "helm-tpl-test-blazor-demo.fullname" . }})
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
{{- else if contains "LoadBalancer" .Values.service.type }}
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "helm-tpl-test-blazor-demo.fullname" . }}'
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "helm-tpl-test-blazor-demo.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
echo http://$SERVICE_IP:{{ .Values.service.port }}
{{- else if contains "ClusterIP" .Values.service.type }}
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "helm-tpl-test-blazor-demo.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:80
{{- end }}
Helm Template的大体结构与基本应用就是这样啦,是不是非常简单呢。