写在前面:如有问题,以你为准,
目前24年应届生,各位大佬轻喷,部分资料与图片来自网络
内容较长,页面右上角目录方便跳转
为什么需要 Helm ?
kubectl apply -f 部署。
Helm 是 Kubernetes 的包管理工具,就像 Linux 下的包管理器,如:yum、apt 等,可以很方便的将之前打包好的 yaml 文件部署到 Kubernetes 上
官网:Helm
Helm本质就是让K8s的应用管理(Deployment,Service等)可配置,能动态生成。通过动态生成K8s资源清单文件(deployment.yaml,service.yaml)。然后调用Kubectl自动执行K8s资源部摆
Helm是官方提供的类似于YUM的包管理器,是部署环境的流程封装。Helm有两个重要的概念:chart和release
· chart 是创建一个应用的信总集合,包括各种Kubernetes对象的配置程板、参数定义、依赖关系。文档说明等。chart是应用部署的自包含逻辑单元。可以将chart想象成apt,yum中的软件安装包
· release 是chart的运行实例,代表了一个正在运行的应用。当chart被安装到Kubernetes集群,就生成一个release。chart能够多次安装到同一个集群,每次安装都是一个release
helm:是一个命令行客户端工具 chart:把yaml打包,是yaml集合 release:基于chart部署实体,应用级别的版本管理 安装包中会有的文件 templates 目录 其中包括所有需要部署的资源 values.yaml 用于自定义全局变量,比如修改生成服务中的labels,yaml高效复用有解释 Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。 可以类比 Docker 来理解,Chart 就类似于 Docker 中的镜像(Docker 中的镜像就是一系列文件的集合,Chart 也是一系列文件的集合),Repository(仓库)就类似于 Docker Hub,Release 就类似于 Docker 中的容器(可以根据镜像 run 多个容器)
Helm v3 变化
2019年11月13日,He1m团队发布He1mv3的第一个稳定版本。
该版本主要变化如下:
架构变化:
1:最明显的变化是Tiller的删除
2:release 可以在不同的命名空间重用
3:将chart 推送到 docker 仓库中
[root@master helm]# tar -xf helm-v3.11.2-linux-amd64.tar.tar
[root@master helm]# ls
helm-v3.11.2-linux-amd64.tar.tar linux-amd64
[root@master helm]# cd linux-amd64/
[root@master linux-amd64]# ls
helm LICENSE README.md
[root@master linux-amd64]# cp helm /bin/
helm 命令补全
helm completion bash | sudo tee /etc/bash_completion.d/helm > /dev/null、
source /usr/share/bash-completion/bash_completion
helm create mychat
vim values.yaml
# snj-2023-3-15
namespace: study
deployment:
replicas: 2
pod_labels: test-nginx
image: nginx
imageTag: 1.17.1
containerPort: 80
service:
type: NodePort
port: 80
protocol: TCP
targetPort: 80
vim templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-helm-deployment-{{ .Release.Revision}}
namespace: {{ .Values.namespace }}
labels:
name: {{ .Release.Name }}-helm-deployment
spec:
replicas: {{.Values.deployment.replicas}}
selector:
matchLabels:
app: {{ .Values.deployment.pod_labels }}
template:
metadata:
labels:
app: {{.Values.deployment.pod_labels}}
spec:
containers:
- name: {{.Values.deployment.image}}
image: {{.Values.deployment.image}}:{{.Values.deployment.imageTag}}
ports:
- containerPort: {{.Values.deployment.containerPort}}
vim templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-helm-service-{{ .Release.Revision}}
namespace: {{.Values.namespace}}
spec:
selector:
app: {{.Values.deployment.pod_labels}}
type: NodePort
ports:
- port: {{.Values.service.port}}
protocol: {{.Values.service.protocol}}
targetPort: {{.Values.service.targetPort}}
[root@master helm]# helm install snjhelm-deploy mychat/
NAME: snjhelm-deploy
LAST DEPLOYED: Wed Mar 15 02:52:03 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@master helm]# kubectl get deploy,svc,pod -n study
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/snjhelm-deploy-helm-deployment-1 2/2 2 2 118s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/snjhelm-deploy-helm-service-1 NodePort 10.108.22.53 <none> 80:32010/TCP 118s
NAME READY STATUS RESTARTS AGE
pod/snjhelm-deploy-helm-deployment-1-756dcb987f-c4jqr 1/1 Running 0 118s
pod/snjhelm-deploy-helm-deployment-1-756dcb987f-kws96 1/1 Running 0 118s
[root@master helm]# curl master:32010
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
....
将镜像升级为1.17.2
# 修改 values.yaml 文件
imageTag: 1.17.2
# 当前版本为 1
[root@master mychat]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
snjhelm-deploy default 1 2023-03-15 06:57:19.980287774 -0400 EDT deployed mychat-0.1.0 1.16.0
# 使用helm upgrade 升级
[root@master helm]# helm upgrade snjhelm-deploy mychat/ -f mychat/values.yaml
Release "snjhelm-deploy" has been upgraded. Happy Helming!
NAME: snjhelm-deploy
LAST DEPLOYED: Wed Mar 15 06:59:12 2023
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
[root@master helm]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
snjhelm-deploy default 2 2023-03-15 06:59:12.06664233 -0400 EDT deployed mychat-0.1.0 1.16.0
[root@master helm]# kubectl get deploy,svc,pod -n study
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/snjhelm-deploy-helm-deployment-2 2/2 2 2 65s
# 可以看到尾部从1变为了2,因为template中使用了内置对象
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/snjhelm-deploy-helm-service-2 NodePort 10.107.84.190 <none> 80:31593/TCP 65s
NAME READY STATUS RESTARTS AGE
pod/snjhelm-deploy-helm-deployment-2-b5565d58b-lt852 1/1 Running 0 65s
pod/snjhelm-deploy-helm-deployment-2-b5565d58b-mhqgg 1/1 Running 0 65s
[root@master helm]# kubectl get pod -n study snjhelm-deploy-helm-deployment-2-b5565d58b-lt852 -o yaml | grep image
- image: nginx:1.17.2
imagePullPolicy: IfNotPresent
image: nginx:1.17.2
imageID: docker-pullable://nginx@sha256:5411d8897c3da841a1f45f895b43ad4526eb62d3393c3287124a56be49962d41
将实例回滚
[root@master helm]# helm rollback snjhelm-deploy
Rollback was a success! Happy Helming!
[root@master helm]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
snjhelm-deploy default 3 2023-03-15 07:02:54.964646589 -0400 EDT deployed mychat-0.1.0 1.16.0
[root@master helm]# helm history snjhelm-deploy
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Wed Mar 15 06:57:19 2023 superseded mychat-0.1.0 1.16.0 Install complete
2 Wed Mar 15 06:59:12 2023 superseded mychat-0.1.0 1.16.0 Upgrade complete
3 Wed Mar 15 07:02:54 2023 deployed mychat-0.1.0 1.16.0 Rollback to 1
添加存储库
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://apphub.aliyuncs.com
配置国内源
查看配置的存储库
helm repo list
helm search repo stable
删除存储库:
helm repo remove aliyun
更新存储库
helm repo update
# mychat 包名,会在当前目录下创建一个目录
helm create mychat
[root@master mysql]# helm create mychart
Creating mychart
[root@master mysql]# ls
config.yaml mychart
[root@master mysql]# tree mychart/
mychart/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
# templates 目录下的资源可以自定义,一定要有charts,Chart.yaml,templates
删除自创模板文件
[root@master mysql]# cd mychart/
[root@master mychart]# ls
charts Chart.yaml templates values.yaml
[root@master mychart]# cd templates/
[root@master templates]# ls
deployment.yaml _helpers.tpl hpa.yaml ingress.yaml NOTES.txt serviceaccount.yaml service.yaml tests
[root@master templates]# rm -rf *
[root@master templates]# ls # 为空
[root@master templates]# cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "snj hello world"
[root@master mysql]# helm install myconfigmap mychart/
NAME: myconfigmap
LAST DEPLOYED: Mon Mar 13 03:20:42 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@master mysql]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myconfigmap default 1 2023-03-13 03:20:42.957495566 -0400 EDT deployed mychart-0.1.0 1.16.0
[root@master mysql]# helm get manifest myconfigmap
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "snj hello world"
[root@master mysql]# kubectl get configmap
NAME DATA AGE
kube-root-ca.crt 1 38d
mychart-configmap 1 2m19s
[root@master mychart]# cat templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: {{ .Values.MY_YALUE }}
# {{ .Release.Name }}
# 在 yaml 中 {{}} 是引用变量
# 最前面的 . 从作用域最顶层命名空间开始
# 即:在顶层命名空间中开始查找Release对象,再查找Name对象
# 就是通过内置对象获取内置对象的变量值(Release的名称)作为拼接configmap的名字
# {{ .Values.MY_YALUE }}
# 引用 valuse.yaml 文件中的MY_YALUE值
# 在 valuse.yaml 有定义
修改 valuse.yaml
[root@master mychart]# cat values.yaml
MY_YALUE: TEST-2
安装与查看
[root@master mysql]# helm install snj-2 mychart/
NAME: snj-2
LAST DEPLOYED: Mon Mar 13 04:09:38 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@master mysql]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
snj-2 default 1 2023-03-13 04:09:38.892606241 -0400 EDT deployed mychart-0.1.0 1.16.0
[root@master mysql]# kubectl get configmaps
NAME DATA AGE
kube-root-ca.crt 1 38d
snj-2-configmap 1 19s
[root@master mysql]# kubectl describe configmaps snj-2-configmap
Name: snj-2-configmap
Namespace: default
Labels: app.kubernetes.io/managed-by=Helm
Annotations: meta.helm.sh/release-name: snj-2
meta.helm.sh/release-namespace: default
Data
====
myvalue:
----
TEST-2
BinaryData
====
Events: <none>
需要注意子 chart 的重要细节:
全局值 的概念,所有的chart都可以访问
# 查看 weave 安装包
helm search repo weave # 在所有仓库中查找 chart
helm search aliyun weave # 从指定 chart 仓库地址查找 chart
# 检查chart(目录、文件或URL)并显示所有的内容(values.yaml, Chart.yaml, README)
helm show all [Chart_Name]
# 检查chart(目录、文件或URL)并显示Chart.yaml文件的内容
helm show chart [Chart_Name]
# 检查chart(目录、文件或URL)并显示values.yaml文件的内容
helm show values [Chart_Name]
# 检查chart(目录、文件或URL)并显示README文件内容
helm show readme [Chart_Name] [flags]
# 查看已经安装的包
helm list
-n 是指定命名空间
-A 是所有命名空间
[root@master helm]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
snjhelm-deploy default 3 2023-03-15 07:02:54.964646589 -0400 EDT deployed mychat-0.1.0 1.16.0
# NAMESPACE 显示的是install chart 时候指定的命名空间,不代表资源部署的命名空间
# 包的详细信息
helm status weave
# 安装 mysql
helm install [NAME] [CHART]
helm install db1 stable/mysql
# 指定命名空间
helm install db1 -n study stable/mysql
# 安装本地
helm install db1 /root/mysql
# 查看已部署的release templates 部署文件
helm get manifest db1
[root@master helm]# helm install db1 stable/mysql
WARNING: This chart is deprecated
NAME: db1
LAST DEPLOYED: Mon Mar 13 02:34:38 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
db1-mysql.default.svc.cluster.local
To get your root password run:
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default db1-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 -il
2. Install the mysql client:
$ apt-get update && apt-get install mysql-client -y
3. Connect using the mysql cli, then provide your password:
$ mysql -h db1-mysql -p
To connect to your database directly from outside the K8s cluster:
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
# Execute the following command to route the connection:
kubectl port-forward svc/db1-mysql 3306
mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
[root@master helm]# kubectl get pod
NAME READY STATUS RESTARTS AGE
db1-mysql-85f9dbd684-m9r28 0/1 Pending 0 14s
nginx 1/1 Running 1 (22h ago) 3d18h
[root@master helm]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
db1-mysql 0/1 1 0 73s
[root@master helm]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
db1 default 1 2023-03-13 02:34:38.844361003 -0400 EDT deployed mysql-1.6.9 5.7.30
注意上面的示例是因为没有pvc而启动不起来
从本地 chart 压缩包安装 chart
helm install db mysql-1.6.9.tgz
helm install db http://mirror.azure.cn/kubernetes/charts/mysql-1.6.9.tgz
helm install <release-name> <本地目录或repo源> --debug --dry-run
[root@master helm]# helm uninstall db1
release "db1" uninstalled
来取可以对vlues和template进行修改和自定义
# 拉取下来的包是压缩包,可以使用下面的参数来解压
# --untar 表示下载并解压,当前目录
helm pull stable/mysql --untar
# --version 指定版本,上面那个不指定即为最新版本
helm pull stable/mysql --version --untar
# 查看已经安装的包,查看 release 列表
helm list
-n 是指定命名空间
-A 是所有命名空间
# 包的详细信息
helm status weave
状态包括:
最后部署时间
发布版本所在的k8s命名空间
发布状态(可以是: unknown, deployed, uninstalled, superseded, failed, uninstalling, pending-install, pending-upgrade 或 pending-rollback)
发布版本修订
发布版本描述(可以是完成信息或错误信息,需要用--show-desc启用)
列举版本包含的资源,按类型排序
最后一次测试套件运行的详细信息(如果使用)
chart提供的额外的注释
helm upgrade release实例名 chart名--set imageTag=1.19
# 指定release名和chart名进行相关set设置的升级
helm upgrade release实例名 chart名-f/.../mychart/values.yaml
# 指定release示例名和chart名和values.yaml文件升级
示例:
helm upgrade test-release-nginx mychart--set imageTag=1.19
# 更新 values.yaml 的 imageTag 变量
helm upgrade test-release-nginx mychart -f /root/mychart/values.yaml
# 更新 整个 values.yaml
helm rollback release实例名
# 指定release实例名,回滚到上一个版本
helm rollback release实例名 版本号
# 指定release实例名,回滚到指定版本,注意版本号是release的版本号,不是镜像版本号
# release的版本号 回滚也会增加一次版本号
示例:
helm rollback web-nginx
helm rollback web-nginx 1.17.10
helm history release实例名
示例:
helm history test
#test为release 实例名
[root@master helm]# helm history snjhelm-deploy
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Wed Mar 15 06:57:19 2023 superseded mychat-0.1.0 1.16.0 Install complete
2 Wed Mar 15 06:59:12 2023 superseded mychat-0.1.0 1.16.0 Upgrade complete
3 Wed Mar 15 07:02:54 2023 deployed mychat-0.1.0 1.16.0 Rollback to 1
# DESCRIPTION 这是可以看到是怎么产生这次版本的
命令 | 描述 |
create | 创建一个chart并指定名字 |
dependency | 管理chart依赖 |
get | 下载一个release。可用的子命令:all、hooks、manifest、notes、values。 |
history | 获取release历史。 |
install | 安装一个chart。 |
list | 列出release。 |
package | 将chart目录打包到chart存档文件中。 |
pull | 从远程仓库中下载chart并解压到本地。比如:helm install stable/mysql --untar。 |
repo | 添加、列出、移除、更新和索引chart仓库。可用的子命令:add、index、list、remove、update。 |
rollback | 从之前的版本回退。 |
search | 根据关键字搜索chart。可用的子命令:all、chart、readme、values。 |
show | 查看chart的详细信息。可用的子命令:all、chart、readme、values。 |
status | 显示已命名版本的状态。 |
template | 本地呈现模板。 |
uninstall | 卸载一个release。 |
upgrade | 更新一个release。 |
version | 查看Helm客户端版本。 |
上面已经安装了weave包,从中可以看到 values.yaml 文件,也可以进行导出
helm show values stable/mysql > config.yaml
1、在values.yam1定义变量和值
2、在具体yaml文件,获取定义变量值
yaml文件大体有几个地方不同的
* image
* tag
* label
* port
* replicas
也可以直接进行覆盖
-- 修改部分
persistence:
enabled: true
accessMode: ReadWriteOnce
size: 8Gi
mysqlUser: "k8s"
mysqlPassword: "123456"
mysqlDatabase: "k8s"
引用修改后的vlues.yaml
helm install db stable/mysql -f config.yaml
修改完可以进行测试
helm install web2 mychart --dry-run=client
修改其中的存储类,且修改完后进行安装
helm install db --set persistence.storageClass="nfs-client" stable/mysql
或者安装的时候指定目录
# --untar 表示下载并解压,当前目录
helm pull stable/mysql --untar