k8s helm

devtools/2024/11/20 13:31:25/

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

http://www.ppmy.cn/devtools/104711.html

相关文章

WorkPlus安全即时通讯:端到端加密开启信息保密新时代

在数字化时代&#xff0c;信息的保密性和安全性变得越发重要。企业和个人需要确保他们的敏感信息和机密通讯不会落入黑客或第三方的手中。为了满足这一需求&#xff0c;WorkPlus安全即时通讯平台应运而生。作为一款拥有端到端加密功能的通讯平台&#xff0c;WorkPlus着重于保护…

SpringBoot 引入使用消息队列RabbitMQ通信 配置连接 无路由模式

介绍 请先对Rabbitmq的用户和权限配置好在进行往下的操作 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>下面将演示最简单的例子不过路由 生产者 -&g…

neural-admixture:基于AI的快速基因组聚类

最近学习祖源分析方面的内容&#xff0c;发现已经有了GPU版的软件&#xff0c;可以几十倍地加快运算速度&#xff0c;推荐使用&#xff01;小数据集的话家用显卡即可hold住&#xff0c;十分给力&#xff01; ADMIXTURE 是常用的群体遗传学分析工具&#xff0c;可以估计个体的祖…

文件上传漏洞详解

第一关 步骤一&#xff0c;打开第一关先点击浏览上传一个jpg格式的图片 步骤二&#xff0c;打开BP修改jpg为php然后放包 步骤三&#xff0c;右键打开图像 成功解析 步骤四&#xff0c;打开蚁剑 第一关还是蛮简单的 第二关 步骤一&#xff0c;打开第二关先点击浏览上传一个j…

问:final关键字在JAVA中有哪些用法?

final关键字的问题在面试中很常见&#xff0c;深入理解其背后的机制确实能提升对Java语言特性的掌握程度。下面&#xff0c;代码示例来说明final的用法。 1. 被final修饰的类不可以被继承 final class FinalClass {// 类内容 }// 错误示例&#xff1a;尝试继承FinalClass // …

C语言基础(三十一)

1、线性搜索&#xff1a; #include "date.h" #include <stdio.h> #include <stdlib.h> #include <time.h> // 希尔排序 void shellSort(int arr[], int n) { for (int gap n / 2; gap > 0; gap / 2) { for (int i gap; i < n; i…

Redis基础知识学习笔记(二)

文章目录 一.Redis安装1.Windows 下安装1>资源管理器目录进入2>目录进入命令:3.配置环境变量 2.Linux 下安装1> 安装redis2> 启动redis3> 查看 redis 是否启动 二.Redis配置1. 查看配置2. 编辑配置3. 参数说明 三.Redis数据类型1. String&#xff08;字符串&…

C#学习笔记(一)了解C#

博主刚开始接触C#&#xff0c;本系列为学习记录&#xff0c;如有错误欢迎各位大佬指正&#xff01;期待互相交流&#xff01; 文章目录 一、C#语言介绍1.1 C#注释方法1.2 标准格式 二、字符串相关2.1 Console.WriteLine输出2.1.1 输出字符串2.1.2 字符串内插 2.2 获取字符串长度…