近期文章:Helm 安装+阿里云镜像配置+memcached部署教程
昨天安装配置了Helm,尝试从阿里云chart拉取memcached进行部署,接着昨天的内容今天在使用自定义的Chart,部署Pod
自定义 Charts 模板
Helm create创建
[root@master01 ~]# helm create myapp Creating myapp [root@master01 ~]# cd myapp/ [root@master01 myapp]# ll 总用量 8 drwxr-xr-x 2 root root 6 8月 31 00:24 charts -rw-r--r-- 1 root root 1149 8月 31 00:24 Chart.yaml drwxr-xr-x 3 root root 162 8月 31 00:24 templates -rw-r--r-- 1 root root 1880 8月 31 00:24 values.yaml [root@master01 myapp]# tree ./ ./ ├── charts #用于存放所依赖的子 chart ├── Chart.yaml # 描述这个 Chart 的相关信息、包括名字、描述信息、版本等 ├── templates # 模板目录,保留创建 k8s 的资源清单文件 │ ├── deployment.yaml #deployment 资源的 go 模板文件 │ ├── _helpers.tpl # 模板助手文件,定义的值可在模板中使用 │ ├── hpa.yaml #水平 pod 自动扩缩容 go 模板文件 │ ├── ingress.yaml #七层代理 go 模板文件 │ ├── NOTES.txt #chart的帮助文本。会在用户执行helm install时展示 │ ├── serviceaccount.yaml │ ├── service.yaml #service 的 go 模板文件 │ └── tests │ └── test-connection.yaml └── values.yaml #模板的值文件,这些值会在安装时应用到 GO 模板生成部署文件 3 directories, 10 files
Chart.yaml字段解释
[root@master01 myapp]# cat Chart.yaml apiVersion: v2 name: myapp description: A 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: 0.1.0 # 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. # It is recommended to use it with quotes. appVersion: "1.16.0" #解释说明:Chart.yaml 文件主要用来描述对应 chart 的相关属性信息, #apiVersion 字段用于描述对应 chart 使用的 api 版本,默认是 v2 版本; #name 字段用于描述对应 chart 的名称; #description 字段用于描述对应 chart 的说明简介; #type 字段用户描述对应 chart 是应用程序还是库文件,应用程序类型的chart,它可以运行为一个 release,但库类型的 chart 不能运行为 release,它只能作为依赖被 #application 类型的 chart 所使用; #version 字段用于描述对应 chart 版本; #appVersion 字段用于描述对应 chart 内部程序的版本信息;
deployment.yaml字段解释
[root@master01 myapp]# cat templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "myapp.fullname" . }}
labels:
{{- include "myapp.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "myapp.selectorLabels" . | nindent 6 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "myapp.selectorLabels" . | nindent 8 }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ include "myapp.serviceAccountName" . }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.service.port }}
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
{{- toYaml .Values.resources | nindent 12 }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
解释:
#该部署清单模板文件,主要用 go 模板语言来写的,其中{{ include "myapp.fullname" . }}就表示取 myapp 的全名;
#{{ .Values.image.repository }}这段代码表示读取当前目录下的 values.yaml 文件中的image.repository 字段的值;
#{{ .Values.image.tag | default .Chart.AppVersion }}表示对于 values文件中 image.tag 的值或者读取 default.chart 文件中的 AppVersion 字段的值;
#简单讲 go 模板就是应用对应 go 模板语法来定义关属性的的值;
#一般都是从 values.yaml 文件中加载对应字段的值作为模板文件相关属性的值。
#nindent 4:表示首行缩进 4 个字母
#TRUNC(NUMBER)表示截断数字
#if/else, 用来创建条件语句
values.yaml字段解释
[root@master01 myapp]# cat values.yaml
# Default values for myapp.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: nginx
pullPolicy: IfNotPresent #指定镜像拉取策略
# Overrides the image tag whose default is the chart appVersion.
tag: "latest" #指定镜像版本
imagePullSecrets: []
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
securityContext: {}
# capabilities:
# drop:
# - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000
service:
type: ClusterIP
port: 80
ingress:
enabled: false
className: ""
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- host: chart-example.local
paths:
- path: /
pathType: ImplementationSpecific
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
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80
nodeSelector: {}
tolerations: []
affinity: {}
解释:
#比如我们要引用 values.yaml 文件中的 image 字段下的 tag 字段的值,我们可以在模板文件中写成{{ .Values.image.tag }};
#如果在命令行使用--set 选项来应用我们可以写成 image.tag;修改对应的值可以直接编辑对应 values.yaml 文件中对应字段的值,也可以直接使用--set 指定对应字段的对应值即可;
#默认情况在命令行使用--set 选项给出的值,都会直接被替换,没有给定的值,默认还是使用values.yaml 文件中给定的默认值;
Helm install部署
#部署myapp
[root@master01 myapp]# helm install myapp ./
NAME: myapp
LAST DEPLOYED: Thu Aug 31 07:50:39 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=myapp,app.kubernetes.io/instance=myapp" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
#查看pod
[root@master01 myapp]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-5d9bf9545c-kdrrs 1/1 Running 0 34s
#查看deploy
[root@master01 myapp]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
myapp 1/1 1 1 2m26s
#查看svc
[root@master01 myapp]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 44h
myapp ClusterIP 10.100.221.23 <none> 80/TCP 2m38s
访问svc地址

可以看出,已经成功部署了自定义chart
#查看pod详细信息 [root@master01 myapp]# kubectl describe pod myapp-5d9bf9545c-kdrrs

Helm 打包
[root@master01 ~]# helm package myapp Successfully packaged chart and saved it to: /root/myapp-0.1.0.tgz

打包之后就可以分享给其他人了,也可以使用helm push推送到自己的仓库
