helm包管理器
- 一、helm包管理器介绍、安装
- 1、helm包管理器
- 2、核心概念
- 2.1 chart
- 2.2 repository
- 2.3 release
- 3、helm安装
- 3.1 安装helm
- 3.2 添加helm国内仓库
- 二、使用helm安装MySQL 8.0
- 1、搜索mysql8.0 chart包
- 2、下载mysql8.0 chart包
- 3、按需定制values.yaml
- 3.1 values.yaml文件定制参考
- 4、部署MySQL
- 5、客户端连接MySQL测试
- 三、自定义nginx chart
- 1、创建chart流程
- 2、创建nginx chart
- 1.1 chart目录结构说明
- 3、删除template目录下所有文件,写入自己的部署文件
- 4、生成deployment.yaml文件
- 5、生成service.yaml文件
- 6、生成configmap.yaml文件
- 7、生成pv/pvc.yaml文件
- 8、在values.yaml文件中写入所需的变量
- 9、测试部署自定义test-nginx chart
- 10、将自定义chart打包
- 四、helm常用命令参考
- 1、仓库类
- 2、 chart、release类
一、helm包管理器介绍、安装
1、helm包管理器
针对Kubernetes的Helm包管理器。
用于在Kubernetes集群中轻松部署、升级和管理应用程序。
2、核心概念
2.1 chart
Chart 代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。你可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在Kubernetes 中的等价物。
2.2 repository
Repository(仓库) 是用来存放和共享 charts 的地方。它就像 Perl 的 CPAN 档案库网络 或是 Fedora 的 软件包仓库,只不过它是供 Kubernetes 包所使用的。
2.3 release
Release 是运行在 Kubernetes 集群中的 chart 的实例。一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 release。以 MySQL chart为例,如果你想在你的集群中运行两个数据库,你可以安装该chart两次。每一个数据库都会拥有它自己的 release 和 release name。
3、helm安装
3.1 安装helm
[root@k8s-master ~]# wget https://get.helm.sh/helm-v3.13.3-linux-amd64.tar.gz
[root@k8s-master ~]# tar xf helm-v3.13.3-linux-amd64.tar.gz
[root@k8s-master ~]# cd linux-amd64/
[root@k8s-master ~]# cp helm /usr/local/bin/
[root@k8s-master ~]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
3.2 添加helm国内仓库
[root@k8s-master ~]# helm repo add stable http://mirror.azure.cn/kubernetes/charts
[root@k8s-master ~]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
[root@k8s-master ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "aliyun" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈
[root@k8s-master ~]# helm repo list
NAME URL
stable http://mirror.azure.cn/kubernetes/charts
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
[root@k8s-master ~]#
二、使用helm安装MySQL 8.0
1、搜索mysql8.0 chart包
[root@k8s-master ~]# helm search repo mysql
NAME CHART VERSION APP VERSION DESCRIPTION
aliyun/mysql 0.3.5 Fast, reliable, scalable, and easy to use open-...
stable/mysql 1.6.9 5.7.30 DEPRECATED - Fast, reliable, scalable, and easy...
stable/mysqldump 2.6.2 2.4.1 DEPRECATED! - A Helm chart to help backup MySQL...
stable/prometheus-mysql-exporter 0.7.1 v0.11.0 DEPRECATED A Helm chart for prometheus mysql ex...
aliyun/percona 0.3.0 free, fully compatible, enhanced, open source d...
aliyun/percona-xtradb-cluster 0.0.2 5.7.19 free, fully compatible, enhanced, open source d...
stable/percona 1.2.3 5.7.26 DEPRECATED - free, fully compatible, enhanced, ...
stable/percona-xtradb-cluster 1.0.8 5.7.19 DEPRECATED - free, fully compatible, enhanced, ...
stable/phpmyadmin 4.3.5 5.0.1 DEPRECATED phpMyAdmin is an mysql administratio...
aliyun/gcloud-sqlproxy 0.2.3 Google Cloud SQL Proxy
aliyun/mariadb 2.1.6 10.1.31 Fast, reliable, scalable, and easy to use open-...
stable/gcloud-sqlproxy 0.6.1 1.11 DEPRECATED Google Cloud SQL Proxy
stable/mariadb 7.3.14 10.3.22 DEPRECATED Fast, reliable, scalable, and easy t...
2、下载mysql8.0 chart包
[root@k8s-master ~]# helm fetch stable/mysql
[root@k8s-master ~]# tar xf mysql-1.6.9.tgz
3、按需定制values.yaml
解压缩mysql-1.6.9.tgz,切换到解压目录,里面包含values.yam文件,可根据情况按需定制
3.1 values.yaml文件定制参考
- mysql镜像标记
image: "mysql"
imageTag: "8.0"
-
在k8s集群的工作节点上提前准备busybox镜像
-
禁用testFramework
testFramework:
enabled: false
image: "bats/bats"
tag: "1.2.1"
imagePullPolicy: IfNotPresent
securityContext: {}
- 定义MySQL root用户密码, 注意引号
mysqlRootPassword: "WWW.1.com"
- 持久化定义
persistence:
enabled: true
accessMode: ReadWriteOnce
size: 8Gi
annotations: {}
- 手动关联后端NFS,创建pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /data4
server: 192.168.140.13
- 调整资源限制
resources:
requests:
memory: 1024Mi
cpu: 1000m
- 自定义MySQL配置文件
configurationFiles:
mysql.cnf: |-
[mysqld]
skip-name-resolve
server_id=100
log_bin=master
- 定义MySQL服务类型、端口
service:
annotations: {}
## Specify a service type
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services---service-types
type: NodePort
port: 3306
nodePort: 32000
# loadBalancerIP:
4、部署MySQL
[root@k8s-master mysql]# helm install --name-template mysql -f values.yaml .
[root@k8s-master mysql]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/mysql-64476bd7d5-7ctn7 1/1 Running 0 3m15s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d
service/mysql NodePort 10.96.111.106 <none> 3306:32000/TCP 3m15s
5、客户端连接MySQL测试
三、自定义nginx chart
1、创建chart流程
1、创建一个chart包。
2、将部署服务用到的yaml文件全部放到templates目录中,然后将yaml中可能每次都需要变动的地方修改为变量。
3、将每次都需要变动的地方写到values.yaml中,让模板文件去引用,即可完成部署。
2、创建nginx chart
[root@k8s-master k8s]# helm create nginxTestChart
Creating nginxTestChart
[root@k8s-master k8s]# tree nginxTestChart
nginxTestChart
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
3 directories, 10 files
1.1 chart目录结构说明
-
Chart.yaml
用于描述这个chart的基本信息,包括名字、描述信息、版本信息等。 -
values.yaml
用于存储templates目录中模板文件中用到的变量信息,也就是说template中的模板文件引用的是values.yaml中的变量。 -
templates
用于存放部署使用的yaml文件模板,这里面的yaml都是通过各种判断、流程控制、引用变量去调用values中设置的变量信息,最后完成部署。 -
NOTES.txt
用于接收chart的帮助信息,helm install部署完成后展示给用户,也可以时候helm status列出信息。 -
_helpers.tpl
防止模板助手的地方,可以在整个chart中重复使用。
3、删除template目录下所有文件,写入自己的部署文件
[root@k8s-master k8s]# cd nginxTestChart/
[root@k8s-master nginxTestChart]# rm -rf templates/*
4、生成deployment.yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: {{ .Values.appname }} // 调用values.yaml文件中的appname变量
name: test-nginx
spec:
replicas: {{ .Values.replicas }} // 调用values.yaml文件中的replicas变量
selector:
matchLabels:
app: {{ .Values.appname }} // 调用values.yaml文件中的appname变量使用为标签
template:
metadata:
labels:
app: {{ .Values.appname }}
spec:
containers:
- image: "{{ .Values.image }}:{{ .Values.imageTag }}" // 分别调用values.yaml文件中的image和imageTage变量作为镜像名
name: {{ .Values.appname }}
ports:
- name: web
containerPort: 80
protocol: TCP
volumeMounts:
- name: code
mountPath: /web
- name: config
mountPath: /etc/nginx/conf.d/
volumes:
- name: config
configMap:
name: {{ .Values.appname }}-cm
- name : code
persistentVolumeClaim:
claimName: {{ .Values.appname }}-pvc
readOnly: false
5、生成service.yaml文件
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.appname }}-svc
spec:
ports:
- port: 80
nodePort: 30008
selector:
app: {{ .Values.appname }}
type: NodePort
6、生成configmap.yaml文件
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Values.appname }}-cm
data:
nginx.conf: |
server {
listen 80;
server_name localhost;
location / {
root /web;
index index.html;
}
}
7、生成pv/pvc.yaml文件
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{ .Values.appname }}-pv
labels:
pv: {{ .Values.appname }}-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: {{ .Values.nfsPath }} // 调用values.yaml文件中的nfsPath变量获取nfs存储目录
server: {{ .Values.nfsServer }} // 调用values.yaml文件中的nfsServer变量获取nfs服务器地址
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ .Values.appname }}-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
selector:
matchLabels:
pv: {{ .Values.appname }}-pv
8、在values.yaml文件中写入所需的变量
appname: test-nginx
replicas: 2
image: nginx
imageTag: 1.16
nfsPath: /data5
nfsServer: 192.168.140.13
9、测试部署自定义test-nginx chart
[root@k8s-master nginxTestChart]# helm install test-nginx ./
NAME: test-nginx
LAST DEPLOYED: Fri Jan 17 16:14:35 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@k8s-master nginxTestChart]# kubectl get pod
NAME READY STATUS RESTARTS AGE
test-nginx-5f8c745b8f-8vg8r 1/1 Running 0 2s
test-nginx-5f8c745b8f-szdmk 1/1 Running 0 2s
[root@k8s-master nginxTestChart]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d5h
test-nginx-svc NodePort 10.96.69.222 <none> 80:30008/TCP 6s
10、将自定义chart打包
[root@k8s-master opt]# ls
cni containerd k8s nginxTestChart
[root@k8s-master opt]# helm package nginxTestChart/
Successfully packaged chart and saved it to: /opt/nginxTestChart-0.1.0.tgz
[root@k8s-master opt]# ls
cni containerd k8s nginxTestChart nginxTestChart-0.1.0.tgz
[root@k8s-master opt]#
四、helm常用命令参考
1、仓库类
- 添加创建
[root@k8s-master mysql]# helm repo add <仓库地址>
- 查看仓库
[root@k8s-master mysql]# helm repo list
- 删除仓库
[root@k8s-master mysql]# helm repo remove <仓库名称>
- 更新仓库
[root@k8s-master mysql]# helm repo update
2、 chart、release类
- 搜索chart
[root@k8s-master mysql]# helm search repo <chart name>
- 下载chart
[root@k8s-master mysql]# helm fetch <chart name>
- 查看chart信息
[root@k8s-master mysql]# helm show chart aliyun/redis
- 查看chart values数据定义
[root@k8s-master mysql]# helm show values aliyun/redis
- 部署chart
[root@k8s-master mysql]# helm install --name-template mysql -f values.yaml .
- 查看release
[root@k8s-master mysql]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mysql default 1 2025-01-17 11:50:38.793792919 +0800 CST deployed mysql-1.6.9 5.7.30
- 删除release
[root@k8s-master mysql]# helm uninstall <release>
- 更新release
[root@k8s-master mysql]# helm upgrade <release name> <chart name>
- 回滚release
[root@k8s-master mysql]# helm rollback <release name> <revision number>
- 查看release历史版本
[root@k8s-master mysql]# helm history <release name>