构建Helm chart和chart使用管道与函数简介
目录
一.创建helm chart(以nginx为例)
1.通过create去创建模板
2.查看模板下的文件
3.用chart模版安装nginx
二.版本更新和回滚问题
1.使用upgrade -f values.yaml或者命令行--set来设置
2.查看历史版本并回滚
三.helm模板内管道和函数
1.defautl
2.quote
3.indent和nindent
4.upper
5.title
6.toYaml
上一篇文章说到,我们可以通过helm将众多已经初步配置好的yaml文件下载来整合使用,甚至还可以自己定义好需要的安装参数用于下载完成后直接使用而不需要过多更改,现在仍然可以在这些功能上继续推进。创建helm chart模板,现成的yaml文件,自己只需要更改values变量文件即可,如下:
一.创建helm chart(以nginx为例)
1.通过create去创建模板
[root@k8s-master helm]# helm create nginx #创建完成后会在本地创建一个nginx目录
drwxr-xr-x 4 root root 93 Mar 18 19:58 nginx
[root@k8s-master helm]# tree nginx
nginx
├── charts #存放的依赖的子chart
├── Chart.yaml #存放chart基本信息的文件
├── templates #模板,名称都简单翻译一下就懂存的是什么
│ ├── deployment.yaml
│ ├── _helpers.tpl #模板助手
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt #本chart的帮助信息
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml #存储的是你在的templates中文件需要用到的变量
3 directories, 10 files
2.查看模板下的文件
[root@k8s-master helm]# cat nginx/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: {{ include "nginx.fullname" . }} #这些使用{{}}括起来的变量就是你需要在values.yaml文件中用值替换的变量
labels:
{{- include "nginx.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
{{- include "nginx.selectorLabels" . | nindent 4 }}
3.用chart模版安装nginx
(1)在values.yaml中定义变量,如下是nginx模版的原始文件
[root@k8s-master nginx]# cat values.yaml
# Default values for nginx.
# 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: "" #版本信息
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: #service类型和端口
type: ClusterIP
port: 80
ingress: #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: {}
(2)配置后的values.yaml
[root@k8s-master helm]# cat nginx/values.yaml
# Default values for nginx.
# 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: "1.17.3" #版本为1.17.3
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: NodePort #NodePort类型
port: 80 #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: {}
(3)安装命令
同k8s运行pod差不多,都可以先测试一下但不实际运行helm install --dry-run my-nginx nginx/,卸载将install替换为uninstall即可
[root@k8s-master helm]# helm install my-nginx nginx/
#指定好安装后的名称后要指定这个nginx模版目录,安装完成后还会提示你访问方式
NAME: my-nginx
LAST DEPLOYED: Mon Mar 18 20:27:00 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services my-nginx)
export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
[root@k8s-master helm]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/my-nginx-9d774fb48-94wd8 1/1 Running 0 3m29s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 90m
service/my-nginx NodePort 10.97.171.192 <none> 80:30140/TCP 3m29s
[root@k8s-master helm]# curl http://192.168.2.151:30140
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
二.版本更新和回滚问题
1.使用upgrade -f values.yaml或者命令行--set来设置
[root@k8s-master helm]# kubectl describe pod my-nginx-9d774fb48-94wd8 | grep Image
Image: nginx:1.17.5
Image ID: docker.io/library/nginx@sha256:922c815aa4df050d4df476e92daed4231f466acc8ee90e0e774951b0fd7195a4
[root@k8s-master helm]# vim nginx/values.yaml
[root@k8s-master helm]# vim nginx/values.yaml
[root@k8s-master helm]# helm upgrade -f nginx/values.yaml my-nginx nginx/
Release "my-nginx" has been upgraded. Happy Helming!
NAME: my-nginx
LAST DEPLOYED: Mon Mar 18 20:35:40 2024
NAMESPACE: default
STATUS: deployed
REVISION: 2
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services my-nginx)
export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
[root@k8s-master helm]# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx-698cb48f59-v4pbb 0/1 ContainerCreating 0 7s
my-nginx-9d774fb48-94wd8 1/1 Running 0 8m48s
[root@k8s-master helm]# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx-698cb48f59-v4pbb 1/1 Running 0 64s
[root@k8s-master helm]# kubectl describe pod my-nginx-698cb48f59-v4pbb | grep Image
Image: nginx:1.17.8
Image ID: docker.io/library/nginx@sha256:380eb808e2a3b0dd954f92c1cae2f845e6558a15037efefcabc5b4e03d666d03
2.查看历史版本并回滚
[root@k8s-master helm]# helm history my-nginx
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Mon Mar 18 20:27:00 2024 superseded nginx-0.1.0 1.16.0 Install complete
2 Mon Mar 18 20:35:40 2024 deployed nginx-0.1.0 1.16.0 Upgrade complete
[root@k8s-master helm]# helm rollback my-nginx 1
Rollback was a success! Happy Helming!
[root@k8s-master helm]# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx-9d774fb48-9pv7q 1/1 Running 0 5s
[root@k8s-master helm]# kubectl describe pods my-nginx-9d774fb48-9pv7q | grep Image
Image: nginx:1.17.5
Image ID: docker.io/library/nginx@sha256:922c815aa4df050d4df476e92daed4231f466acc8ee90e0e774951b0fd7195a4
三.helm模板内管道和函数
1.defautl
也就是和管道符号配合,当你values中的值未指定时,就使用此默认值
以nginx模版的port为例,将其设置为空,但设置了默认值为80,创建过后仍然会暴露80端口
[root@k8s-master helm]# cat nginx/values.yaml | grep port
port:
#在deployment文件中引用了此变量的地方设置default
[root@k8s-master helm]# cat nginx/templates/deployment.yaml | grep default
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
containerPort: {{ .Values.service.port | default 80 }} #这样写
#在service文件中引用了此变量的地方设置default
[root@k8s-master helm]# cat nginx/templates/service.yaml | grep default
- port: {{ .Values.service.port | default 80 }}
[root@k8s-master helm]# helm install nginx nginx/
[root@k8s-master helm]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-6467995c7d-gt4g5 1/1 Running 0 8s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 113m
service/nginx NodePort 10.106.164.22 <none> 80:32598/TCP 8s
2.quote
这个表示的是为某个变量设置后,无论设定的变量值是什么类型,都将其识别为字符串类型,书写格式如下
{{ quote .Values.service.port }}
3.indent和nindent
indent表示在同一行变量值前设定多少个缩进值,nindent表示换行后再在变量值前设置多少个缩进值,书写格式如下
{{ .Values.service.port | indent/nindent 10 }}
4.upper
将值都变为大写,格式如下
{{ upper .Values.service.port }}
5.title
将首字母设置为大写,格式如下
{{ title .Values.service.port }}
6.toYaml
将一整个yaml块都取值取过来,一般还需要陪着缩进一起使用,格式如下
{{ toYaml .Values.service.port | indent/nindent 10 }}