k8s helm

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: false
  keyFile: ""
  name: kubernetes-dashboard
  pass_credentials_all: false
  password: ""
  url: https://kubernetes.github.io/dashboard/
  username: ""
- caFile: ""
  certFile: ""
  insecure_skip_tls_verify: false
  keyFile: ""
  name: stable
  pass_credentials_all: false
  password: ""
  url: https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
  username: ""
- caFile: ""
  certFile: ""
  insecure_skip_tls_verify: false
  keyFile: ""
  name: stable2
  pass_credentials_all: false
  password: ""
  url: http://mirror.azure.cn/kubernetes/charts
  username: ""
- caFile: ""
  certFile: ""
  insecure_skip_tls_verify: false
  keyFile: ""
  name: bitnami
  pass_credentials_all: false
  password: ""
  url: https://charts.bitnami.com/bitnami
  username: ""
- caFile: ""
  certFile: ""
  insecure_skip_tls_verify: false
  keyFile: ""
  name: prometheus-community
  pass_credentials_all: false
  password: ""
  url: https://prometheus-community.github.io/helm-charts
  username: ""

‘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: 80
   host: 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-test
 name: myapp-test-202401110926-svc
spec:
 ports:
  - name: 80-80
   port: 80
   protocol: TCP
   targetPort: 80
   nodePort: 31111
 selector:
   app: myapp-test
 type: NodePort
[root@k8s-master01 myapp]# cat templates/deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
 labels:
   app: myapp-test
 name: myapp-test-202401110926-deploy
spec:
 replicas: 5
 selector:
   matchLabels:
     app: myapp-test
 template:
   metadata:
     labels:
       app: myapp-test
   spec:
     containers:
      - image: wangyanglinux/myapp:v1.0
       name: 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-test
 name: myapp-test-{{ now | date "20060102030405" }}-deploy
spec:
 replicas: {{ .Values.replicaCount }}
 selector:
   matchLabels:
     app: myapp-test
 template:
   metadata:
     labels:
       app: myapp-test
   spec:
     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-test
 name: myapp-test-{{ now | date "20060102030405" }}-svc
spec:
 ports:
  - name: 80-80
   port: 80
   protocol: TCP
   targetPort: 80
   {{- if eq .Values.service.type "NodePort" }}
   nodePort: {{.Values.service.nodeport }}
   {{- end }}
 selector:
   app: myapp-test
 type: {{ .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/myapp
 tag: "v1.0"
service:
 type: NodePort
 nodeport: 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-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: 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-user
  namespace: kubernetes-dashboard
  annotations:
    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

你可能感兴趣的:(kubernetes,容器,云原生)