kubernetes Helm 自定义 Charts 模板

近期文章:

昨天安装配置了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地址

访问svc地址

可以看出,已经成功部署了自定义chart

#查看pod详细信息 [root@master01 myapp]# kubectl describe pod myapp-5d9bf9545c-kdrrs
image 1

Helm 打包

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

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

官方文档