k8s Helm 是Kubernetes的包管理工具,类似于Linux系统中常用的apt、yum等包管理工具。Helm通过定义、安装和升级Kubernetes应用程序来简化Kubernetes应用部署的复杂性。以下是对k8s Helm的详细解析:
一、Helm的基本概念
Chart:Chart是Helm的包,包含了运行一个应用所需要的镜像、依赖和资源定义等。它是Helm部署应用的基本单位,类似于Linux系统中的软件包。
Release:Release是在Kubernetes集群上运行的Chart的一个实例。同一个Chart可以在同一个集群上安装多次,每次安装都会创建一个新的Release。
Repository:Repository是用于发布和存储Chart的存储库。用户可以从Repository中检索、下载和安装所需的Chart。
二、Helm的架构
Helm主要包括Helm客户端(helm CLI)和Tiller服务端两部分。Tiller部署在Kubernetes集群中,负责处理Chart的安装、升级和卸载等操作。然而,需要注意的是,随着Helm的发展,Tiller组件已经被逐渐废弃,取而代之的是直接在客户端执行操作,并通过Kubernetes API与集群交互。
三、Helm的使用场景
Helm广泛应用于Kubernetes应用的部署和管理中,特别是在需要频繁部署、升级和回滚应用的场景下。通过使用Helm,用户可以轻松地将应用打包成Chart,并在不同的Kubernetes集群中部署和管理这些应用。
四、Helm的操作流程
添加Repository:用户首先需要添加包含所需Chart的Repository。这可以通过helm repo add命令完成,例如添加Elasticsearch的Helm Repository。
搜索Chart:用户可以使用helm search命令在Repository中搜索所需的Chart。
安装Chart:使用helm install命令安装Chart,并创建新的Release。用户可以指定Chart的版本、命名空间以及自定义的配置参数等。
升级Chart:当需要更新应用时,可以使用helm upgrade命令升级Chart。这将更新Release中的Chart到新版本,并根据需要更新相关的Kubernetes资源。
卸载Chart:使用helm uninstall命令可以卸载Chart并删除相关的Kubernetes资源。
五、Helm的优势
简化部署:Helm通过定义Chart来封装应用的部署逻辑,使得应用的部署变得简单快捷。
版本控制:Helm支持Chart的版本控制,用户可以轻松地回滚到之前的版本。
可重用性:Chart可以在不同的Kubernetes集群中重复使用,提高了应用的可移植性和可重用性。
自定义配置:用户可以通过修改Chart中的values.yaml文件来自定义应用的配置参数。
六、总结
k8s Helm是Kubernetes的包管理工具,它通过定义、安装和升级Chart来简化Kubernetes应用的部署和管理。Helm的使用可以大大提高Kubernetes应用的部署效率和可维护性,是Kubernetes生态系统中不可或缺的一部分。
参考4条信息源k8s Helm 是Kubernetes的包管理工具,类似于Linux系统中常用的apt、yum等包管理工具。Helm通过定义、安装和升级Kubernetes应用程序来简化Kubernetes应用部署的复杂性。以下是对k8s Helm的详细解析:
七、HELM部署
[root@master helm]# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
[root@master helm]# tar -zvxf helm-v3.12.3-linux-amd64.tar.gz
linux-amd64/
linux-amd64/LICENSE
linux-amd64/README.md
linux-amd64/helm
[root@master helm]# ls
get_helm.sh helm-v3.12.3-linux-amd64.tar.gz linux-amd64
[root@master helm]# cp -a linux-amd64/helm /usr/local/bin/
[root@master helm]# chmod a+x /usr/local/bin/helm
[root@master helm]# helm version
version.BuildInfo{Version:"v3.12.3", GitCommit:"3a31588ad33fe3b89af5a2a54ee1d25bfe6eaa5e", GitTreeState:"clean", GoVersion:"go1.20.7"}
# helm与/home/.kube/config的用户权限相同# 添加官方仓库
[root@master helm]# helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories[root@master helm]# helm repo ls
NAME URL
bitnami https://charts.bitnami.com/bitnami# 查看有哪些包
[root@master helm]# helm search repo bitnami# 安装 chart 示例$ helm repo update # 确定我们可以拿到最新的 charts 列表
$ helm show values bitnami/apache
$ helm install bitnami/apache --generate-name$ helm show chart bitnami/apache # chart 的基本信息
$ helm show all bitnami/apache # chart 的所有信息#卸载一个版本
$ helm uninstall apache-1612624192 # 该命令会从Kubernetes卸载 mysql-
1612624192, 它将删除和该版本相关的所有相关资源(service、deployment、 pod等等)甚至版本历
史--keep-history # 选项, Helm 将会保存版本历史$ helm status apache-1612624192 # 查看该版本的信息
Chart 代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定
义。你可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在Kubernetes 中的等价物
‘helm search’:查找 Charts
# 用于在 Helm Hub(https://hub.helm.sh)上搜索 Helm charts
$ helm search hub wordpress
# 用于在配置的 Helm 仓库中搜索 Helm charts,~/.config/helm/repositories.yaml 中被定义
持久化
helm search repo wordpress
# Helm 搜索使用模糊字符串匹配算法,所以你可以只输入名字的一部分
[root@master ~]# cat ~/.config/helm/repositories.yaml
apiVersion: ""
generated: "0001-01-01T00:00:00Z"
repositories:
- caFile: ""certFile: ""insecure_skip_tls_verify: falsekeyFile: ""name: kubernetes-dashboardpass_credentials_all: falsepassword: ""url: https://kubernetes.github.io/dashboard/username: ""
- caFile: ""certFile: ""insecure_skip_tls_verify: falsekeyFile: ""name: stablepass_credentials_all: falsepassword: ""url: https://kubernetes.oss-cn-hangzhou.aliyuncs.com/chartsusername: ""
- caFile: ""certFile: ""insecure_skip_tls_verify: falsekeyFile: ""name: stable2pass_credentials_all: falsepassword: ""url: http://mirror.azure.cn/kubernetes/chartsusername: ""
- caFile: ""certFile: ""insecure_skip_tls_verify: falsekeyFile: ""name: bitnamipass_credentials_all: falsepassword: ""url: https://charts.bitnami.com/bitnamiusername: ""
- caFile: ""certFile: ""insecure_skip_tls_verify: falsekeyFile: ""name: prometheus-communitypass_credentials_all: falsepassword: ""url: https://prometheus-community.github.io/helm-chartsusername: ""
‘helm install’:安装一个 helm 包
$ helm install apache-1612624192 bitnami/apache#安装资源顺序
Namespace > NetworkPolicy > ResourceQuota > LimitRange > PodSecurityPolicy > PodDisruptionBudget > ServiceAccount > Secret > SecretList > ConfigMap > StorageClass > PersistentVolume > PersistentVolumeClaim > CustomResourceDefinition > ClusterRole > ClusterRoleList > ClusterRoleBinding > ClusterRoleBindingList > Role > RoleList > RoleBinding > RoleBindingList > Service > DaemonSet > Pod > ReplicationController > ReplicaSet > Deployment > HorizontalPodAutoscaler > StatefulSet > Job > CronJob > Ingress > APIService
安装前自定义 chart
$ helm show values bitnami/apache # 查看 chart 中的可配置选项
# 使用 YAML 格式的文件覆盖上述任意配置项,并在安装过程中使用该文件
$ vi values.yaml
service:type: NodePort$ helm install -f values.yaml bitnami/apache --generate-name
安装过程中有两种方式传递配置数据
–values (或 -f ):使用 YAML 文件覆盖配置。可以指定多次,优先使用最右边的文件
–set :通过命令行的方式对指定项进行覆盖
如果同时使用两种方式,则 --set 中的值会被合并到 --values 中,但是 --set 中的值优先级更高。
在 --set 中覆盖的内容会被被保存在 ConfigMap 中。可以通过 helm get values 来
查看指定 release 中 --set 设置的值。也可以通过运行 helm upgrade 并指定 --reset-values 字段来
清除 --set 中设置的值
–set 的格式和限制
–set 选项使用0或多个 name/value 对。最简单的用法类似于: --set name=value ,等价于如下
YAML 格式:
name: value
多个值使用逗号分割,因此 --set a=b,c=d 的 YAML 表示是:
a: b
c: d
支持更复杂的表达式。例如, --set outer.inner=value 被转换成了:
outer:inner: value
列表使用花括号( {} )来表示。例如, --set name={a, b, c} 被转换成了:
name:- a- b- c
某些 name/key 可以设置为 null 或者空数组,例如 --set name=[],a=null
name: []
a: null
从 2.5.0 版本开始,可以使用数组下标的语法来访问列表中的元素。例如 --set servers[0].port=80
就变成了:
servers:- port: 80
多个值也可以通过这种方式来设置。 --set servers[0].port=80,servers[0].host=example 变成
了:
servers:- port: 80host: example
如果需要在 --set 中使用特殊字符,你可以使用反斜线来进行转义; --set name=value1,value2 就
变成了:
name: "value1,value2"
–set nodeSelector.“kubernetes.io/role”=master
nodeSelector:kubernetes.io/role: master
更多安装方法
helm install 命令可以从多个来源进行安装:
- chart 的仓库(如上所述)
- 本地 chart 压缩包( helm install foo foo-0.1.1.tgz )
- 解压后的 chart 目录( helm install foo path/to/foo )
- 完整的 URL( helm install foo https://example.com/charts/foo-1.2.3.tgz )
‘helm upgrade’ 和 ‘helm rollback’:升级 release 和失败时恢复当你想升级到 chart 的新版本,或是修改release 的配置,你可以使用 helm upgrade 命令。Helm 会尝试执行最小侵入式升级。即它只会更新自上次发布以来发生了更改的内容
$ helm upgrade -f clusterip.yaml apache-23213213 bitnami/apache
在上面的例子中, apache-23213213 这个 release 使用相同的 chart 进行升级,但是使用了一个新的
YAML 文件:
service.type: ClusterIP
我们可以使用 helm get values 命令来看看配置值是否真的生效了:
$ helm get values apache-23213213
现在,假如在一次发布过程中,发生了不符合预期的事情,也很容易通过 helm rollback [RELEASE]
[REVISION] 命令回滚到之前的发布版本
$ helm history apache-23213213
$ helm rollback apache-23213213 1
上面这条命令将我们的 apache-23213213 回滚到了它最初的版本。release 版本其实是一个增量修订
(revision)。 每当发生了一次安装、升级或回滚操作,revision 的值就会加1。第一次 revision 的值
永远是1。我们可以使用 helm history [RELEASE] 命令来查看一个特定 release 的修订版本号
安装、升级、回滚时的有用选项
- –timeout:一个 Go duration 类型的值, 用来表示等待 Kubernetes 命令完成的超时时间,默认
值为 5m0s。such as “300ms”, “-1.5h” or “2h45m”. Valid time units are “ns”, “us” (or “µs”),
“ms”, “s”, “m”, “h”。 - –wait:表示必须要等到所有的 Pods 都处于 ready 状态,PVC 都被绑定,Deployments 都至少拥
有最小 ready 状态 Pods 个数(Desired减去 maxUnavailable),并且 Services 都具有 IP 地址
(如果是LoadBalancer, 则为 Ingress),才会标记该 release 为成功。最长等待时间由 –
timeout 值指定。如果达到超时时间,release 将被标记为 FAILED。注意:当 Deployment 的
replicas 被设置为1,但其滚动升级策略中的 maxUnavailable 没有被设置为0时,–wait 将返回就
绪,因为已经满足了最小 ready Pod 数 - –no-hooks :不运行当前命令的钩子,即为安装此 chart 时的已定义的安装前或者安装后的动作
- –recreate-pods:(仅适用于 upgrade 和 rollback ):这个参数会导致重建所有的Pod(deployment中的Pod 除外)。(在 Helm 3 中已被废弃)
‘helm uninstall’:卸载 release
$ helm uninstallapache-23213213 # 使用 helm uninstall 命令从集群中卸载一个
release
helm v2 版本中,当一个 release 被删除,会保留一条删除记录。而在 Helm 3 中,删除也会移除
release 的记录。 如果你想保留删除记录,使用 helm uninstall --keep-history 。使用 helm list
–uninstalled 只会展示使用了 --keep-history 删除的 release
helm list --all 会展示 Helm 保留的所有 release 记录,包括失败或删除的条目(指定了 --keephistory )
‘helm repo’:使用仓库
$ helm repo list # 查看配置的仓库,v3 版本已经不再默认添加一个仓库
$ helm repo add dev https://example.com/dev-charts # 添加新的仓库
$ helm repo update # 可以通过执行 helm repo update 命令来确保你的 Helm 客户端是最
新的
$ helm repo remove # 移除仓库
三、创建一个自己的 Chart
基本模式
# 1、创建一个模板
$ helm create myapp
# 2、删除不用的文件
# 3、编写 template 下的 service 和 deployment 资源清单
[root@k8s-master01 myapp]# cat templates/nodePort.yaml
apiVersion: v1
kind: Service
metadata:labels:app: myapp-testname: myapp-test-202401110926-svc
spec:ports:- name: 80-80port: 80protocol: TCPtargetPort: 80nodePort: 31111selector:app: myapp-testtype: NodePort
[root@k8s-master01 myapp]# cat templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: myapp-testname: myapp-test-202401110926-deploy
spec:replicas: 5selector:matchLabels:app: myapp-testtemplate:metadata:labels:app: myapp-testspec:containers:- image: wangyanglinux/myapp:v1.0name: myapp
# 4、发布部署
$ helm install myapp myapp/
注入 HELM 灵魂
[root@k8s-master01 myapp]# cat templates/NOTES.txt
1、这是一个测试的 myapp chart
2、myapp release 名字:myapp-test-{{ now | date "20060102030405" }}-deploy
3、service 名字:myapp-test-{{ now | date "20060102030405" }}-svc
---------------------------------------------------------------------------------
-
[root@k8s-master01 myapp]# cat templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: myapp-testname: myapp-test-{{ now | date "20060102030405" }}-deploy
spec:replicas: {{ .Values.replicaCount }}selector:matchLabels:app: myapp-testtemplate:metadata:labels:app: myapp-testspec:containers:- image: {{ .Values.image.repository }}:{{ .Values.image.tag }}name: myapp
---------------------------------------------------------------------------------
-
[root@k8s-master01 myapp]# cat templates/service.yaml
apiVersion: v1
kind: Service
metadata:labels:app: myapp-testname: myapp-test-{{ now | date "20060102030405" }}-svc
spec:ports:- name: 80-80port: 80protocol: TCPtargetPort: 80{{- if eq .Values.service.type "NodePort" }}nodePort: {{.Values.service.nodeport }}{{- end }}selector:app: myapp-testtype: {{ .Values.service.type | quote }}
---------------------------------------------------------------------------------
-
[root@k8s-master01 myapp]# cat values.yaml
# Default values for myapp.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 5
image:repository: wangyanglinux/myapptag: "v1.0"
service:type: NodePortnodeport: 32321
部署dashboard
[root@master kubernetes-dashboard]# helm install kubernetes-dashboard kubernetes-dashboard-7.5.0.tgz --namespace kubernetes-dashboard
Release “kubernetes-dashboard” does not exist. Installing it now.
NAME: kubernetes-dashboard
LAST DEPLOYED: Thu Aug 29 16:26:51 2024
NAMESPACE: kubernetes-dashboard
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
*** PLEASE BE PATIENT: Kubernetes Dashboard may need a few minutes to get up and become ready ***
Congratulations! You have just installed Kubernetes Dashboard in your cluster.
To access Dashboard run:
kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443
NOTE: In case port-forward command does not work, make sure that kong service name is correct.
Check the services in Kubernetes Dashboard namespace using:
kubectl -n kubernetes-dashboard get svc
Dashboard will be available at:
https://localhost:8443
kubectl edit svc -n kubernetes-dashboard kubernetes-dashboard-kong-proxy
type: ClusterIP --> type: NodePort
#查看
kubectl get svc -A |grep kubernetes-dashboard
[root@master kubernetes-dashboard]# kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 8d
kube-system calico-typha ClusterIP 10.12.153.109 <none> 5473/TCP 43h
kube-system kube-dns ClusterIP 10.0.0.10 <none> 53/UDP,53/TCP,9153/TCP 8d
kubernetes-dashboard kubernetes-dashboard-api ClusterIP 10.4.13.106 <none> 8000/TCP 5m46s
kubernetes-dashboard kubernetes-dashboard-auth ClusterIP 10.7.255.171 <none> 8000/TCP 5m46s
kubernetes-dashboard kubernetes-dashboard-kong-manager NodePort 10.13.194.147 <none> 8002:31893/TCP,8445:30742/TCP 5m46s
kubernetes-dashboard kubernetes-dashboard-kong-proxy NodePort 10.8.2.56 <none> 443:32646/TCP 5m46s
kubernetes-dashboard kubernetes-dashboard-metrics-scraper ClusterIP 10.3.118.3 <none> 8000/TCP 5m46s
kubernetes-dashboard kubernetes-dashboard-web ClusterIP 10.15.211.70 <none> 8000/TCP 5m46s
#获取token
[root@master kubernetes-dashboard]# vi dashboard-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: admin-usernamespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: admin-user
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: admin-usernamespace: kubernetes-dashboard
#
[root@master kubernetes-dashboard]# kubectl apply -f dashboard-user.yaml
#获取token
[root@master kubernetes-dashboard]# kubectl -n kubernetes-dashboard create token admin-user#创建正式token
[root@master kubernetes-dashboard]# vi dashboard-admin.yaml
apiVersion: v1
kind: Secret
metadata:name: admin-usernamespace: kubernetes-dashboardannotations:kubernetes.io/service-account.name: "admin-user"
type: kubernetes.io/service-account-token#
[root@master kubernetes-dashboard]# kubectl apply -f dashboard-admin.yaml
#获取Token
[root@master kubernetes-dashboard]# kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d#访问这个端口
kubernetes-dashboard kubernetes-dashboard-kong-proxy NodePort 10.8.2.56 <none> 443:32646/TCP 5m46s