1、自定义helm项目管理-实践
1.1、自定义helm项目
1.1.1、创建存放的目录
mkdir -p /opt/custom_helm && cd /opt/custom_helm
1.1.2、创建helm项目
1.2.3、目录的解析
custom_helm]# tree nginx/
nginx/ - 自动生成的空chart,名称就是nginx
├── charts
├── Chart.yaml - 声明了当前Chart的名称、版本等基本信息,便于用户在仓库里浏览检索
├── templates - 存放各种资源清单文件
│ ├── deployment.yaml
│ ├── _helpers.tpl - 定制的模板功能文件,包含各种需要根据值结果进行调整的功能
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml - 存放各种定制的变量值,符合yaml格式语法
注意: Chart里面的nginx名称需要和生成的Chart文件夹名称一致。如果修改nginx,则需要一致的修改。
1.2、常见的语法-解析
1.2.1、{{- if .Values.serviceAccount.create -}}
如果在项目的根目录下存在Values文件,并且里面的serviceAccount部分的create属性为true的话。
执行下面的操作
{{- 表达式 -}}, 横杠(-)表示去掉表达式输出结果前面和后面的空格,可以使用单个{{- 表达式 }}
# 点的说明
最左面的点(.): 代表全局作用域-项目根目录,中间的点:是对象中属性的引用方式。
1.2.2、{{ include "nginx.serviceAccountName" . }}
加载项目的templates/_helpers.tpl文件里面定义好的 nginxhelloworld.serviceAccountName内容
例如:
templates]# cat serviceaccount.yaml
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "nginx.serviceAccountName" . }}
labels:
{{- include "nginx.labels" . | nindent 4 }}
{{- with .Values.serviceAccount.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}
templates]# cat _helpers.tpl
...
{{/*
Create the name of the service account to use
*/}}
{{- define "nginx.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "nginx.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
{{- end }}
...
1.2.3、 {{- toYaml . | nindent 4 }}
toYaml 表示将数据转为yaml格式,nindent表示不局限于4行,indent 4代表就是格式化转换为4行
1.2.4、{{- with .Values.imagePullSecrets }}
1.3、修改模板-deployment.yaml
1.3.1、查询需要修改的模板
templates]# cat deployment.yaml
...
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }} # 设置容器数量
{{- end }}
selector:
matchLabels:
{{- include "nginx.selectorLabels" . | nindent 6 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "nginx.selectorLabels" . | nindent 8 }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ include "nginx.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 }}
...
1.3.2、修改Value.yaml【这里主要修改下载镜像为我们本地仓库的】
nginx]# vi values.yaml
image:
repository: 192.168.10.33:80/k8s/my_nginx
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: "v1"
# 这里主要修改两点,仓库地址+版本
1.3.3、修改deployment.yaml【主要增加访问的首页】
nginx]# vi templates/deployment.yaml
...
spec:
...
template:
metadata:
...
spec:
...
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
- name: htmlBody:
value: {{ .Values.htmlBody }}
lifecycle:
postStart:
exec:
command: ["/bin/sh","-c","echo $htmlBody> /usr/share/nginx/html/index.html"]
ports:
- name: http
containerPort: {{ .Values.service.port }}
protocol: TCP
1.3.4、修改Value.yaml【配置htmlBody变量值内容】
nginx]# vi values.yaml
# Default values for nginx.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
htmlBody: "my nginx hello world"
1.3.5、检查语法是否正常
]# helm lint --strict /opt/custom_helm/nginx/
==> Linting /opt/custom_helm/nginx/
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, 0 chart(s) failed
1.4、项目打包
1.4.1、开始打包
]# helm package /opt/custom_helm/nginx/ -d /opt/custom_helm/
Successfully packaged chart and saved it to: /opt/custom_helm/nginx-0.1.0.tgz # 保存的位置
注意:压缩包的版本号来自于Chart.yaml文件中的属性
1.4.2、版本号的修改
]# vi /opt/custom_helm/nginx/Chart.yaml
...
# 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 # 以这个为命名
1.5、本地安装定制镜像文件
1.5.1、注意事项【了解】
注意:必须在k8s的集群中来部署相关的应用,如果当前主机没有k8s的话,可以通过环境变量来进行指定k8s主机的地址位置。
export KUBERNETES_MASTER=http://master:6443
1.5.2、安装helm-nginx-0.1.0.tgz压缩包
]# helm install my-nginx-helm /opt/custom_helm/nginx-0.1.0.tgz
NAME: my-nginx-helm
LAST DEPLOYED: Thu Apr 13 18:26:29 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=nginx,app.kubernetes.io/instance=my-nginx-helm" -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
1.5.3、查询运行状态
]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-nginx-helm-85b77648c9-m5n2c 1/1 Running 0 95s 10.244.4.16 node2 <none> <none>
]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-nginx-helm ClusterIP 10.107.46.245 <none> 80/TCP 21s
~]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
my-nginx-helm default 1 2023-04-13 18:26:29.102169531 +0800 CST deployed nginx-0.1.0 1.16.0
1.5.4、访问SVCIP地址测试
~]# curl 10.107.46.245
my nginx hello world
1.6、使用变量值设置页面内容
1.6.1、设置变量安装helm
helm install my-nginx-helm-add /opt/custom_helm/nginx-0.1.0.tgz --set htmlBody='my nginx test!'
1.6.2、查询svc
~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-nginx-helm-add ClusterIP 10.110.16.246 <none> 80/TCP 12s
1.6.3、访问svc地址测试
~]# curl 10.110.16.246
my nginx test!