[TOC]
1. 模板介绍
首先,放上此模板链接:
https://github.com/ygqygq2/charts/tree/master/mod-chart
此chart可当作POD单image的通用模板,只需要使用sed
替换下chart名,并修改下README.md
和NOTES.txt
就可以了。下文,我通过复制此chart成example-chart
来作示范说明。
[root@master1 mod-chart]# tree
.
├── Chart.yaml
├── README.md
├── templates
│ ├── configmap.yaml
│ ├── deployment-statefulset.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── pvc.yaml
│ ├── secret.yaml
│ ├── service-headless.yaml
│ └── service.yaml
└── values.yaml
1 directory, 12 files
[root@master1 mod-chart]# helm3 lint --strict .
1 chart(s) linted, 0 chart(s) failed
2. 新chart制作
注:
下文中文件内容我保留,只加注释。
注释中需要修改的地方[*]
标记为必选,[-]
标识为可选。
2.1 目录准备
将模板mod-chart
复制成example-chart
,并作内容替换。
rsync -avz mod-chart/ example-chart/
cd example-chart/
sed -i 's@mod-chart@example-chart@g' *.*
sed -i 's@mod-chart@example-chart@g' templates/*.*
2.2 修改Chart.yaml
vim Chart.yaml
apiVersion: v1 # 当前helm api版本,不需要修改
appVersion: 1.14.2 # 此处为你应用程序的版本号 [*]
description: Chart for the nginx server # 介绍此chart是干嘛的,按需求修改
engine: gotpl # go模板引擎,不需要修改 [-]
name: example-chart # 模板名,对应目录名 [*]
version: 1.0.0 # 此chart版本号 [*]
home: http://www.nginx.org # 应用程序官网 [*]
icon: https://bitnami.com/assets/stacks/nginx/img/nginx-stack-220x234.png # 应用程序logo地址 [*]
keywords: # 关键字列表 [*]
- nginx
- http
- web
- www
- reverse proxy
maintainers: # 维护人员列表 [*]
- email: [email protected]
name: Chinge Yang
sources: # 应用程序来源 [-]
- https://github.com/bitnami/bitnami-docker-nginx
2.3 修改values.yaml
因为values.yaml
设置涉及到yaml格式,yaml文件格式说明可以看这篇文章:
http://www.ruanyifeng.com/blog/2016/07/yaml.html
这里提几个常用的地方:
- 使用2个空格作缩进;
- 确认数字为字符类型时,使用双引号引起来;
- 为了迎合helm3的规范,空定义最好将相关符号补上:
string: "" list: [] map: {}
没什么特殊要求,一般需要修改的地方有image
、service
、healthCheck
、persistentVolume.mountPaths
# Default values for mod-chart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
## Global Docker image parameters
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
##
global: # 设置后覆盖后面默认的镜像仓库
imageRegistry: ""
imagePullSecrets: []
# - myRegistryKeySecretName
statefulset:
enabled: false
## String to partially override fullname template (will maintain the release name)
##
nameOverride: ""
## String to fully override fullname template
##
fullnameOverride: ""
## By default deploymentStrategy is set to rollingUpdate with maxSurge of 25% and maxUnavailable of 25% .
## You can change type to `Recreate` or can uncomment `rollingUpdate` specification and adjust them to your usage.
deploymentStrategy: {}
# rollingUpdate:
# maxSurge: 25%
# maxUnavailable: 25%
# type: RollingUpdate
# 副本个数
replicaCount: 1
# 容器image及tag
image:
registry: docker.io
repository: bitnami/nginx
tag: latest
pullPolicy: IfNotPresent # IfNotPresent: 有则不拉(减少流量和操作步骤),Always: 不管tag总拉(适合tag不变时更新)
pullSecrets: []
# - private-registry-key
service:
type: ClusterIP # 一般不用修改
ingressPort: 8080
ports:
web: # 多端口暴露时,复制一段
port: 8080 # Service port number for client-a port.
protocol: TCP # Service port protocol for client-a port.
## env set
## ref: https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/
env: []
# - name: DEMO_GREETING
# value: "Hello from the environment"
# - name: DEMO_FAREWELL
# value: "Such a sweet sorrow"
## command set
startCommand: []
# - "java -Xdebug -Xnoagent -Djava.compiler=NONE"
# - "-Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n"
# - "-Djava.security.egd=file:/dev/urandom"
# - "-jar /test.jar"
# - "-Duser.timezone=GMT+08"
## Enable configmap and add data in configmap
config:
enabled: false
subPath: ""
mountPath: /conf
data: {}
## 以下示例,挂载文件至 /conf/app.conf
# enabled: true
# mountPath: /conf
# subPath: app.conf
# data:
# app.conf: |-
# appname = example-chart
## To use an additional secret, set enable to true and add data
secret:
enabled: false
mountPath: /etc/secret-volume
subPath: ""
readOnly: true
data: {}
## 以下示例,挂载文件至 /etc/secret-volume
# enabled: true
# mountPath: /conf
# data:
# app.conf: |-
# appname = example-chart
## liveness and readiness
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
healthCheck:
enabled: true
type: tcp # http/tcp
port: http # 上面的端口名或端口
httpPath: '/' # http时必须设置
livenessInitialDelaySeconds: 10 # 初始延迟秒数
livenessPeriodSeconds: 10 # 检测周期,默认值10,最小为1
readinessInitialDelaySeconds: 10 # 初始延迟秒数
readinessPeriodSeconds: 10 # 检测周期,默认值10,最小为1
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
## Node labels and tolerations for pod assignment
### ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
### ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature
labels: {}
podAnnotations: {}
nodeSelector: {}
tolerations: []
affinity: {}
annotations: {}
## Enable persistence using Persistent Volume Claims
## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
##
persistentVolume: # 是否存储持久化
enabled: false
## If defined, storageClassName: <storageClass>
## If set to "-", storageClassName: "", which disables dynamic provisioning
## If undefined (the default) or set to null, no storageClassName spec is
## set, choosing the default provisioner. (gp2 on AWS, azure-disk on
## Azure, standard on GKE, AWS & OpenStack)
##
storageClass: "-"
accessMode: ReadWriteOnce
annotations: {}
# helm.sh/resource-policy: keep
size: 1Gi # 大小
existingClaim: {} # 使用已存在的pvc
mountPaths: []
# - name: data-storage
# mountPath: /config
# subPath: config
# - name: data-storage
# mountPath: /data
# subPath: data
ingress: # 是否使用nginx暴露域名或端口
enabled: false
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
path: /
hosts:
- chart-example.local
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local
## Add init containers. e.g. to be used to give specific permissions for data
## Add your own init container or uncomment and modify the given example.
initContainers: []
## Prometheus Exporter / Metrics
##
metrics:
enabled: false
image:
registry: docker.io
repository: nginx/nginx-prometheus-exporter
tag: 0.1.0
pullPolicy: IfNotPresent
## Optionally specify an array of imagePullSecrets.
## Secrets must be manually created in the namespace.
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
##
pullSecrets: []
# - myRegistrKeySecretName
## Metrics exporter pod Annotation and Labels
podAnnotations:
# prometheus.io/scrape: "true"
# prometheus.io/port: "9113"
## Metrics exporter resource requests and limits
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
##
resources: {}
## Uncomment and modify this to run a command after starting the core container.
## ref: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/
lifecycle: {}
# preStop:
# exec:
# command: ["/bin/bash","/pre-stop.sh"]
# postStart:
# exec:
# command: ["/bin/bash","/post-start.sh"]
## Deployment additional volumes.
deployment:
additionalVolumes: []
## init containers
## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
## Add init containers. e.g. to be used to give specific permissions for data
## Add your own init container or uncomment and modify the given example.
initContainers: {}
# - name: fmp-volume-permission
# image: busybox
# imagePullPolicy: IfNotPresent
# command: ['chown','-R', '200', '/extra-data']
# volumeMounts:
# - name: extra-data
# mountPath: /extra-data
## Additional containers to be added to the core pod.
additionalContainers: {}
# - name: my-sidecar
# image: nginx:latest
# - name: lemonldap-ng-controller
# image: lemonldapng/lemonldap-ng-controller:0.2.0
# args:
# - /lemonldap-ng-controller
# - --alsologtostderr
# - --configmap=$(POD_NAMESPACE)/lemonldap-ng-configuration
# env:
# - name: POD_NAME
# valueFrom:
# fieldRef:
# fieldPath: metadata.name
# - name: POD_NAMESPACE
# valueFrom:
# fieldRef:
# fieldPath: metadata.namespace
# volumeMounts:
# - name: copy-portal-skins
# mountPath: /srv/var/lib/lemonldap-ng/portal/skins
未完待补