K8S之核心技术Helm
一、Helm的介绍
Helm 是 Kubernetes 应用的包管理工具 ,类似于 Linux 系统中的 yum 或 apt。它主要用来管理 Kubernetes 应用的包(称为 Charts),帮助用户更高效地部署、管理和维护 Kubernetes 应用。通过 Helm,用户可以轻松地打包、发布、安装和升级复杂的 Kubernetes 应用。
Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。它包含了一组预定义的 Kubernetes 资源模板,这些模板可以通过参数化的方式进行配置,从而实现灵活的部署。Chart 的设计使得用户可以在部署应用时自定义应用程序的元数据(Metadata),便于应用程序的分发和管理。
二、Helm客户端安装
官网地址:Helm | 快速入门指南
1、下载安装包并解压,以 helm-v3.17.3-linux-amd64.tar.gz
为例
[root@k8s-master ~]# tar -xf helm-v3.17.3-linux-amd64.tar.gz -C /opt
2、将 helm
可执行文件复制到 /usr/local/bin/
目录,使其可以在系统中全局使用
[root@k8s-master ~]# cp /opt/linux-amd64/helm /usr/local/bin/
3、为了方便使用Helm命令,配置命令自动补全功能
[root@k8s-master ~]# helm completion bash > ~/.helmrc
[root@k8s-master ~]# source ~/.helmrc #重新加载
4、验证Helm是否安装成功
[root@k8s-master ~]# helm version
version.BuildInfo{Version:"v3.17.3", GitCommit:"e4da49785aa6e6ee2b86efd5dd9e43400318262b", GitTreeState:"clean", GoVersion:"go1.23.7"}
三、Helm常用命令
create :创建一个 chart 并指定名字
dependency :管理 chart 依赖
get :下载一个 release 。可用子命令: all 、 hooks 、 manifest 、 notes 、 values
history :获取 release 历史
install :安装一个 chart
list :列出 release
package :将 chart 目录打包到 chart 存档文件中
pull :从远程仓库中下载 chart 并解压到本地 # helm pull stable/mysql -- untar
repo :添加,列出,移除,更新和索引 chart 仓库。可用子命令: add 、 index 、 list、 remove、 update。
rollback :从之前版本回滚
search :根据关键字搜索 chart 。可用子命令: hub 、 repo
show :查看 chart 详细信息。可用子命令: all 、 chart 、 readme 、 values
status :显示已命名版本的状态
template :本地呈现模板
uninstall :卸载一个 release
upgrade :更新一个 release
version :查看 helm 客户端版本
四、配置国内chart仓库
1、常用国内仓库
• 微软仓库( http://mirror.azure.cn/kubernetes/charts/ )这个仓库推荐,基本上官网有的chart 这里都有。• 阿里云仓库( https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts )• 官方仓库( https://hub.kubeapps.com/charts/incubator )官方 chart 仓库,国内有点不好使。
2、添加存储库
使用方法:
格式:helm repo add [NAME] [URL] [flags]
[root@k8s-master ~]# helm repo add stable http://mirror.azure.cn/kubernetes/charts
"stable" has been added to your repositories[root@k8s-master ~]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
"aliyun" has been added to your repositories
3、查看配置的存储库
helm repo list
4、更新存储库
helm repo update
5、删除存储库
helm repo remove 库名
五、Helm基本使用
主要三个命令:1 )chart install 安装之后名称 安装应用名称查看应用发布状态:helm status 安装后的名称2 ) chart upgrade 升级3 ) chart rollback 回滚
1、安装helm的UI界面
root@k8s-master ~]# helm install db stable/mysql
2、查看状态
[root@k8s-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
db-mysql-5cd7cbc6b7-cjgkq 1/1 Running 0 7h15m 100.97.125.4 k8s-node01 <none> <none>[root@k8s-master ~]# helm status db
NAME: db
LAST DEPLOYED: Sat May 3 16:13:31 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
db-mysql.default.svc.cluster.localTo get your root password run: #获取密码MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default db-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)To connect to your database: #连接你的数据库1. Run an Ubuntu pod that you can use as a client:kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il2. Install the mysql client:$ apt-get update && apt-get install mysql-client -y3. Connect using the mysql cli, then provide your password:$ mysql -h db-mysql -pTo connect to your database directly from outside the K8s cluster:MYSQL_HOST=127.0.0.1MYSQL_PORT=3306# Execute the following command to route the connection:kubectl port-forward svc/db-mysql 3306mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
3、查看pod
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
db-mysql-5cd7cbc6b7-cjgkq 0/1 Pending 0 115m
4、查看pvc
[root@k8s-master ~]# kubectl get pvc
[root@k8s-master ~]# kubectl get pvc db-mysql -o yaml
5、需要8G的PV,创建PV,
[root@k8s-master ~]# yum install nfs-utils -y
[root@k8s-master ~]# cat /etc/exports
/data/nfs/dbdata 172.16.90.0/24(rw,no_root_squash)
[root@k8s-master ~]# mkdir /data/nfs/dbdata -p
[root@k8s-master ~]# systemctl restart nfs-server
[root@k8s-master ~]# systemctl enable nfs-server
# cat pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: dbdata # 修改PV名称
spec:
capacity:
storage: 8Gi # 修改大小
accessModes:
- ReadWriteOnce
nfs:
path: /data/nfs/dbdata # 修改目录名
server: k8s-master01
[root@k8s-master ~]# kubectl apply -f pv.yml
persistentvolume/dbdata created
所有集群节点安装nfs-utils
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
db-mysql-55c9794b68-kx7h2 0/1 Running 0 9m33s[root@k8s-master01 tools]# kubectl get secret --namespace default db-mysql -o
jsonpath="{.data.mysql-root-password}" | base64 --decode; echo
xu3Oytd0ZQ
[root@k8s-master01 tools]# kubectl exec -it db-mysql-55c9794b68-kx7h2 -- bash
Defaulted container "db-mysql" out of: db-mysql, remove-lost-found (init)
root@db-mysql-55c9794b68-kx7h2:/# mysql -uroot -pxu3Oytd0ZQ
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.7.30 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
mysql> \q
Bye
root@db-mysql-55c9794b68-kx7h2:/# exit